Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash不';尽管管道破裂,但不要结束回路_Bash_Loops_While Loop_Stream_Pipeline - Fatal编程技术网

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)