cu 不发送 TTY 响应到 bash 输出

cu does not send TTY response to bash output

我正在执行以下命令,打开串行控制台并将 "LM\r" 命令发送到我的远程设备;我得到 "LM122.0P" 作为答案:

$ sudo cu -l /dev/AR2300CTRL -s 115200 -h
Connected.
LM^MLM122.0P
~~..
Disconnected.

但是,当我尝试使用以下命令读取该答案作为 cu 的输出时,我没有得到任何信息:

$ resp=$(
    echo "LM\r" |\
    sudo cu -l /dev/AR2300CTRL -s 115200 |\
    grep -v 'cu' | grep -v 'onnected.'
)
cu: End of file on terminal
cu: child: Got signal 9
$ echo $resp

我错过了什么?我不应该在 "resp" 变量中得到对命令的响应吗?

在该管道中,echo 命令将在将文本写入到 cu 的管道后立即退出,因此 cu 的标准输入将尽快关闭因为 cu 使用来自 echo 命令的文本。标准输入的关闭将导致 cu 终止——这就是它发出 "End of file on terminal" 消息的原因。

这一切都会在设备有机会将任何内容写回 cu 之前很久发生,因此永远不会收集响应消息并将其传送到 $resp

要修复,请采取措施使 cu 的标准输入保持打开足够长的时间,以便发送、收集设备响应并将其写入 cu 的输出。一种简单的方法是从在 echo 命令后执行 sleep 几秒钟的子进程提供管道。像这样:

resp=$(
    (echo "LM\r" ; sleep 6) |\
    sudo cu -l /dev/AR2300CTRL -s 115200 |\
    grep -v 'cu' | grep -v 'onnected.'
)