为什么 bash broken pipe 错误通常是无声的?

问题描述 投票:0回答:1

例如我有

cat file | head -n 2

其中

file
非常大。这是一个损坏的管道错误,因为读者提前终止,而作者仍然有东西要写。

但是,终端上的输出只是

head -n 2
的输出,没有任何管道损坏错误的指示。为什么它像这样安静?我什么时候可以看到破损的管道错误并受到影响?

bash pipe sh posix
1个回答
2
投票

看起来

cat
程序没有对
SIGPIPE
信号做任何特殊处理,所以默认信号“处置”(或动作)适用。
SIGPIPE
的默认操作是“Term”,即程序简单地终止(请参阅
signal
手册页
,尤其是“标准信号”部分)。

手册页没有提到的一件事是终止操作将退出状态为 128+信号编号的进程。

SIGPIPE
是信号 13,所以它会以状态 141 退出:

$ cat /dev/random | head -n1 >/dev/null
$ echo "${PIPESTATUS[@]}"
141 0

如果程序打印一条错误消息以响应

SIGPIPE
,那是因为该程序为该信号设置了一个处理程序,并且它是打印该消息的处理程序。沉默是默认的。

© www.soinside.com 2019 - 2024. All rights reserved.