尽管管道已损坏,Bash 仍不会结束循环



简单的脚本:

while [ 1 ]; do
    cat pattern_file
done | socat - /dev/ttyS0

它使文件中包含的流循环模式,并通过 socat 将其发送到串行端口。该脚本还允许从串行端口读回数据。不幸的是,当 socat 结束时(例如被杀死),循环将永远挂起,没有任何错误消息。
我想避免:

  • 点数
  • 多个脚本
  • 每pattern_file重新打开串口

您遇到的问题是,在bash(其他可能 shell 不同)下,管道仅在管道中的所有命令完成后终止。

一种解决方案是使用:

while [ 1 ]; do
    cat pattern_file || break
done | socat - /dev/ttyS0

如果socat终止,则 cat 命令在运行时将失败。 但是,循环中命令的失败并不会导致循环终止。 通过添加 break 命令,我们可以确保,如果cat失败,则循环将终止。

另一种解决方案是完全避免管道并使用流程替换

socat - /dev/ttyS0 < <(while true; do cat pattern_file; done)

文档

有问题的管道行为记录在 man bash 中:

shell 在返回值之前等待管道中的所有命令终止。

相关内容

  • 没有找到相关文章

最新更新