管道程序何时终止,谁控制此终止程序?我已阅读Bash: why the pipe is terminated?,但它只是部分涵盖了这个问题。在尝试自己回答这个问题后,我做了几个例子来看看他们的输出。而这个我不明白:(a.sh
):
#!/bin/bash
echoerr() { echo $@ 1>&2; }
echoerr a.sh started
sleep 1
echo 1
sleep 1
echo 2
sleep 1
echo 3
sleep 1 # Line 1
echo 4 # Line 2
echoerr a.sh finished
我将其作为./a.sh | head -3
运行。输出是:
a.sh started
1
2
3
从输出中我了解到./a.sh
在读取前3行输入后以SIGPIPE
信号终止,因为不再需要数据。但当我删除 第1行 第2行时,输出更改为以下内容:
a.sh started
1
2
3
a.sh finished
所以我的问题是:
答案 0 :(得分:2)
正如您所说,如果shell脚本尝试写入已关闭的管道,那么它将会死亡。如果没有,它就不会。
如果删除第二行,a.sh
在stdout
之后不会尝试写入echo 3
,那么它没有理由失败。
每次运行测试时,删除第一行可能无法获得相同的结果。有一个时间问题。如果在echo
尝试从其输入读取之前处理最后两个head
语句(并且因为它已达到3行而终止),则a.sh
将不会出现管道错误。如果时间是head
在两个echo
之间读取,那么a.sh
将得到管道错误,并且死亡。