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

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

请参阅《Linux 程序员指南》中的“The Infamous SIGPIPE Signal”。

https://stackoverflow.com/questions/19120263/

相关文章:

linux - 如何使用 mount(8) 和 fstab 注册 FUSE 文件系统类型?

linux - 列出包含字符串但 *NOT* 包含另一个字符串的文件的 Unix 命令

linux - 在 Docker 容器中挂载 SMB/CIFS 共享

linux - 将任何当前目录 './' 添加到 Linux 中的搜索路径

linux - 在 shell 脚本的 for 循环中迭代行而不是单词

python - 如何使用 Python 获取硬盘序列号

linux - 将 AWK 结果分配给变量

python - 这是在 Python 中运行 shell 脚本的正确方法吗?

linux - 来自 shell 的 GROUP BY/SUM

c - 格式化结构时间规范