在bash中终止管道程序的政策是什么?

时间:2013-07-28 11:07:41

标签: bash pipe termination sigpipe

管道程序何时终止,谁控制此终止程序?我已阅读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

所以我的问题是:

  • 终止管道计划的政策是什么?
  • 为什么第1行会影响程序行为?
  • 为什么第2行会影响程序行为?

1 个答案:

答案 0 :(得分:2)

正如您所说,如果shell脚本尝试写入已关闭的管道,那么它将会死亡。如果没有,它就不会。

如果删除第二行,a.shstdout之后不会尝试写入echo 3,那么它没有理由失败。

每次运行测试时,删除第一行可能无法获得相同的结果。有一个时间问题。如果在echo尝试从其输入读取之前处理最后两个head语句(并且因为它已达到3行而终止),则a.sh将不会出现管道错误。如果时间是head在两个echo之间读取,那么a.sh将得到管道错误,并且死亡。