1

管道程序何时终止,谁控制这个终止过程?我读过Bash:为什么管道被终止?但它只部分涵盖了这个问题。在尝试自己回答这个问题后,我做了几个例子来看看他们的输出。而这个我不明白:(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

从输出中我了解到,在读取前 3 行输入后./a.sh以信号终止,SIGPIPE因为不需要更多数据。但是,当我删除第 1行或第 2 行时输出将更改为以下内容:

a.sh started
1
2
3
a.sh finished

所以我的问题是:

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

1 回答 1

2

正如你所说,如果它试图写入一个封闭的管道,你的 shell 脚本将会死掉。如果没有就不会。

如果您删除第二行,a.sh则不会尝试写入其stdoutafter echo 3,因此它没有失败的理由。

每次运行测试时,删除第一行可能不会得到相同的结果。有时间问题。如果在尝试从其输入读取之前处理了最后两个echo语句(并由于达到 3 行而终止),则不会出现管道损坏错误。如果时间是这样的,在两个s 之间进行读取,那么将得到管道错误,然后死掉。heada.shheadechoa.sh

于 2013-07-28T11:18:01.067 回答