Как определить, какая пара псевдотерминалов подключена друг к другу в bash - PullRequest
0 голосов
/ 06 июля 2018

У меня есть пара программ на Linux, которые используют псевдотерминалы /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 ]

0 голосов
/ 06 июля 2018

Обновленный ответ

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

...