例如我有
cat file | head -n 2
其中
file
非常大。这是一个损坏的管道错误,因为读者提前终止,而作者仍然有东西要写。
但是,终端上的输出只是
head -n 2
的输出,没有任何管道损坏错误的指示。为什么它像这样安静?我什么时候可以看到破损的管道错误并受到影响?
看起来
cat
程序没有对SIGPIPE
信号做任何特殊处理,所以默认信号“处置”(或动作)适用。 SIGPIPE
的默认操作是“Term”,即程序简单地终止(请参阅 signal
手册页,尤其是“标准信号”部分)。
手册页没有提到的一件事是终止操作将退出状态为 128+信号编号的进程。
SIGPIPE
是信号 13,所以它会以状态 141 退出:
$ cat /dev/random | head -n1 >/dev/null
$ echo "${PIPESTATUS[@]}"
141 0
如果程序打印一条错误消息以响应
SIGPIPE
,那是因为该程序为该信号设置了一个处理程序,并且它是打印该消息的处理程序。沉默是默认的。