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

ocebsuys  于 2023-11-17  发布在  Linux
关注(0)|答案(4)|浏览(143)

有人能解释一下为什么我从下面得到退出代码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是一个失败,但上面的一行给零,所以它应该是成功的,我会说。

o2gm4chl

o2gm4chl1#

这是因为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“。

46qrfjad

46qrfjad2#

我不熟悉zfs list,但我猜它会抱怨它的标准输出被关闭了--grep -q在找到匹配时立即退出,不像grep

41ik7eoe

41ik7eoe3#

另一种选择是不使用管道,而是使用进程替换:
grep -q tank <(zfs list)
更新:我猜是一样的,因为在括号内运行的进程也将接收sigpipe。

y53ybaqx

y53ybaqx4#

你可以继续吃输出,例如:

command | { head -n1; cat >/dev/null; }

字符串

相关问题