尽管管道坏了,但Bash并没有结束循环

时间:2014-12-16 11:20:35

标签: bash loops while-loop stream pipeline

简单的脚本:

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

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

  • PTS
  • 多于一个脚本
  • 每个pattern_file重新打开串口

1 个答案:

答案 0 :(得分:2)

您遇到的问题是,在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在返回值之前等待管道中的所有命令终止。