bash如何判断是哪一对伪tty端口相互连接

How to determine which pair of pseudo tty ports are connected to each other in bash

我有一对 linux C 程序,它们使用伪终端 /dev/pts/* 相互通信。可以通信的 pty 作为命令行参数传递给这些程序。

我可以使用 socat 创建一对 pty 设备,如下所示:

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]

如何从 socat 的输出中提取 pty 节点 /dev/pts/* 并通过 shell 脚本中的命令行传递给我的应用程序:

$./test_pty_app /dev/pts/1 & 
$./test_pty_app /dev/pts/2 &

我在python看到一个类似的问题可以做到这一点 谢谢!

 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/ 开头,然后是任意数量的字母数字(或 _)字符,这基本上意味着 "until the end of the word".

更新答案

如果 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 的 "process substitution",您可以:

{ read portA; read portB; } < <(socat ... | grep -Eo "/dev/pts/\d+")

那么你可以在其中任何一个之后执行此操作:

./test_pty_app $portA &
./test_pty_app $portB &