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 &
我有一对 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 &