有人能解释一下为什么我从下面得到退出代码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是一个失败,但上面的一行给零,所以它应该是成功的,我会说。
4条答案
按热度按时间o2gm4chl1#
这是因为
grep -q
在找到匹配后立即以零状态退出。zfs
命令仍然在向管道写入,但没有读取器(因为grep
已经退出),因此它从内核发送SIGPIPE
信号,并以141
状态退出。另一个常见的地方是
head
。字符串
在这种情况下,
head
读取第一行并终止,这产生了SIGPIPE
信号,seq
退出141
。请参阅《Linux程序员指南》中的“The Infamous SIGPIPE Signal“。
46qrfjad2#
我不熟悉
zfs list
,但我猜它会抱怨它的标准输出被关闭了--grep -q
在找到匹配时立即退出,不像grep
。41ik7eoe3#
另一种选择是不使用管道,而是使用进程替换:
grep -q tank <(zfs list)
更新:我猜是一样的,因为在括号内运行的进程也将接收sigpipe。
y53ybaqx4#
你可以继续吃输出,例如:
字符串