San*_*ing 35 linux bash freebsd
有人可以解释为什么我从下面得到退出代码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[@]}
Run Code Online (Sandbox Code Playgroud)
我明白了
...
a 0 0
b 141 0
c 0 0
Run Code Online (Sandbox Code Playgroud)
从我的理解退出代码141失败,但上面的行给出零,所以它应该是成功,我会说.
dog*_*ane 53
这是因为grep -q一找到匹配就立即退出零状态.该zfs命令仍在写入管道,但没有读取器(因为grep已退出),因此它SIGPIPE从内核发送信号并以状态为退出141.
另一个你看到这种行为的常见地方是head.例如
$ seq 1 10000 | head -1
1
$ echo ${PIPESTATUS[@]}
141 0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,head读取第一行并终止生成SIGPIPE信号并seq退出141.
请参阅Linux程序员指南中的" 臭名昭着的SIGPIPE信号 ".