有人可以解释为什么我从下面得到退出代码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程序员指南》中的“The Infamous SIGPIPE Signal”。

关于linux - 为什么用grep -q退出代码141?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19120263/

10-11 17:22