Как определить, какая пара псевдотерминалов подключена друг к другу в 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 /, а затем любому количеству буквенно-цифровых (или _) символов, что в основном означает" до конца слова ".

Другие вопросы по тегам