Bash不';尽管管道破裂,但不要结束回路
简单的脚本:Bash不';尽管管道破裂,但不要结束回路,bash,loops,while-loop,stream,pipeline,Bash,Loops,While Loop,Stream,Pipeline,简单的脚本: while [ 1 ]; do cat pattern_file done | socat - /dev/ttyS0 它生成一个包含在文件中的流、循环模式,并通过socat将其发送到串行端口。该脚本还允许从串行端口读回数据。 不幸的是,当socat结束(如终止)时,循环将永远挂起,没有任何错误消息。 我想避免: 临时秘书处 不止一个脚本 重新打开每个模式文件的串行端口 您遇到的问题是,在bash下(其他shell可能不同),管道仅在管道中的所有命令完成后终止 一种解决方
while [ 1 ]; do
cat pattern_file
done | socat - /dev/ttyS0
它生成一个包含在文件中的流、循环模式,并通过socat将其发送到串行端口。该脚本还允许从串行端口读回数据。
不幸的是,当socat结束(如终止)时,循环将永远挂起,没有任何错误消息。我想避免:
- 临时秘书处
- 不止一个脚本
- 重新打开每个模式文件的串行端口
bash
下(其他shell可能不同),管道仅在管道中的所有命令完成后终止
一种解决方案是使用:
while [ 1 ]; do
cat pattern_file || break
done | socat - /dev/ttyS0
如果socat
终止,则运行cat
命令时将失败。但是,循环中命令的失败并不会导致循环终止。通过添加break
命令,我们可以确保,如果cat
失败,那么循环将终止
另一种解决方案是完全避免使用管道,并使用流程替代:
socat-/dev/ttyS0socat
结束时,它的管道末端会关闭,任何对管道的写入尝试都会导致写入器(在本例中为cat
)接收到SIGPPIPE
信号。while
命令本身,因为它从未实际写入管道(它只是将其打开的文件句柄传递给cat
),所以不知道另一端已关闭。因此,只有cat
曾经(反复)获得SIGPIPE
并退出。
socat - /dev/ttyS0 < <(while true; do cat pattern_file; done)