我需要 socat 生成的虚拟 com 端口的地址,通常是 /dev/pts/2 和 /dev/pts/3。我需要这些地址,因为有时它会与原始地址发生变化。我需要这个,因为我正在尝试创建一个每次系统重新启动时都需要这些地址的应用程序。
我尝试了各种方法来获得相同的结果但没有成功
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed "2,3d"
正在给出输出
2020/06/02 01:20:02 socat[24206] N PTY 是 /dev/pts/4
但
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed '2,3d'|cut -d " " -f 7
没有输出
我需要将 2 个 com 端口地址存储在 2 个变量中,然后将它们传递给我的应用程序感谢您的帮助和支持
答案1
错误的问题(及其解决方案)
问题中描述的问题是由于块缓冲而不是行缓冲造成的,当命令的输出不是终端时,某些命令会发生这种情况以优化性能。要么该命令有一个选项,您就可以使用它。这里:sed -u
要得到:
socat -d -d pty,raw,echo=0 pty,raw,echo=0 2>&1| sed -u '2,3d' |cut -d " " -f 7
或者没有,您可以使用通用工具,例如stdbuf
或者unbuffer
以避免这种情况发生。例如,如果您在 后添加新管道cut
,您可能必须使用:
[...] | stdbuf -oL cut -d " " -f 7 | [...]
这就是说......忘记它对于你的实际问题。解析调试输出并不是实现某些目标的最佳方法。例如,我的版本socat
输出第 1 行和第 2 行中的 ptys,我需要sed -u 3d
等等。
实际解决方案
实际上,socat
有一个选项可以解决您的具体问题:
PTY
生成一个伪终端 (pty) 并使用其主端。
[...]
有用的选项:关联、openpty、等待从属、模式、用户、组
之后:
PTY 选项组
这些选项旨在与 pty 地址类型一起使用。
link=<filename>
生成指向实际伪终端 (pty) 的符号链接。这可能有助于解决 ptys 生成的名称或多或少不可预测的问题,导致很难直接访问socat自动生成的pty。通过此选项,用户可以在文件层次结构中指定一个“修复”点,帮助他访问实际的 pty(示例)。从 socat 版本 1.4.3 开始,当地址关闭时,符号链接将被删除(但请参阅选项 unlink-close)。
在里面例子部分:
socat PTY,link=$HOME/dev/vmodem0,rawer,wait-slave \ EXEC:"ssh modemserver.us.org socat - /dev/ttyS0,nonblock,rawer"
[...]
所以你可以这样解决问题:
socat pty,raw,echo=0,link=$HOME/socatpty1 pty,raw,echo=0,link=$HOME/socatpty2
例如创建:
$ ls -l $HOME/socatpty[12]
lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty1 -> /dev/pts/15
lrwxrwxrwx. 1 user user 11 Jun 1 21:58 /home/user/socatpty2 -> /dev/pts/16
您可能必须稍后或之前清理这些链接,尤其是socat
在链接中断的情况下。