有人可以解释为什么我从下面得到退出代码 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/