Как определить, какая пара псевдотерминалов подключена друг к другу в bash
У меня есть пара программ Linux C, которые используют псевдо-терминалы /dev/pts/*
общаться друг с другом. Pty, по которому можно общаться, передается в качестве аргумента командной строки этим программам.
Я могу создать пару устройств pty, используя socat следующим образом:
socat -d -d pty,raw,echo=0 pty,raw,echo=0
Вывод выше дает как:
2018/07/05 17:56:54 socat[58319] N PTY is /dev/pts/1
2018/07/05 17:56:54 socat[58319] N PTY is /dev/pts/3
2018/07/05 17:56:54 socat[58319] N starting data transfer loop with FDs [7,7] and [9,9]
как я могу извлечь pty узлы, /dev/pts/*
от socat
вывод и передача в мое приложение через командную строку в сценарии оболочки:
$./test_pty_app /dev/pts/1 &
$./test_pty_app /dev/pts/2 &
Я видел аналогичный вопрос, который может сделать это в Python здесь Спасибо!
2 ответа
Обновленный ответ
Похоже, вам придется использовать файл, если socat
должен быть фоновым.
( socat ... 2>&1 | grep -Eo "/dev/pts/\d+" > /tmp/a ) &
portA=$(head -n 1 /tmp/a)
portB=$(tail -n 1 /tmp/a)
Оригинальный ответ
Ответ @jeremysprofile, вероятно, более разумный, но ради интереса вы также можете сделать одно из следующих:
socat ... | grep -Eo "/dev/pts/\d+" | { read portA; read portB; }
Или, используя "замену процесса" в bash, вы можете сделать:
{ read portA; read portB; } < <(socat ... | grep -Eo "/dev/pts/\d+")
Тогда вы сделаете это после любого из них:
./test_pty_app $portA &
./test_pty_app $portB &
arr=($(socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1 | grep -oh "/dev/pts/\w*"))
сейчас "${arr[0]}"
а также "${arr[1]}"
ваши два порта tty.
grep -oh
печатает только шаблон, которому он соответствует, ничего больше. `/dev/pts/\w* соответствует только чему-либо, начинающемуся с / dev / pts /, а затем любому количеству буквенно-цифровых (или _) символов, что в основном означает" до конца слова ".