为什么用grep -q退出代码141?

有人可以解释为什么我从下面得到退出代码141吗?

#!/usr/bin/bash

set -o pipefail

zfs list | grep tank

echo a ${PIPESTATUS[@]}

zfs list | grep -q tank

echo b ${PIPESTATUS[@]}

cat /etc/passwd | grep -q root

echo c ${PIPESTATUS[@]}

我懂了

...

a 0 0

b 141 0

c 0 0

根据我的理解,退出代码141是失败的,但是上面的行给出的是零,因此应该成功。

回答:

这是因为grep

-q一旦找到匹配项,就会立即以零状态退出。该zfs命令仍在写入管道,但是没有读取器(因为grep已退出),因此它SIGPIPE从内核发送了信号,并且退出,状态为141

您看到此行为的另一个常见地方是head。例如

$ seq 1 10000 | head -1

1

$ echo ${PIPESTATUS[@]}

141 0

在这种情况下,head读取第一行并终止,产生SIGPIPE信号并以seq退出141

请参阅《Linux程序员指南》中的“臭名昭著的SIGPIPE信号 ”。

以上是 为什么用grep -q退出代码141? 的全部内容, 来源链接: utcz.com/qa/408277.html

回到顶部