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

标签 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[@]}

我明白了

...
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”。

关于linux - 为什么用 grep -q 退出代码 141?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19120263/

相关文章:

linux - 如何在 Linux 中以用户身份为 gfortran 设置环境?

linux - 脚本会在超过物理内存的95%时自动重启Tomcat

regex - 使用 sed 删除两个空格字符之间的字符串

python - Python 对 FreeBSD 的支持是否与对 CentOS/Ubuntu/其他 Linux 版本的支持一样好?

linux - 没有管理员权限无法设置hadoop多节点集群

Linux:用一个进程从串口读取数据,用另一个进程写入

linux - Sed 在第一次匹配之前插入

linux - 如何读出CF卡的供应商ID

python - 错误请求 (400) Nginx + Gunicorn + Django + FreeBSD

linux - FreeBSD 指定部分目录名称以使用 find 进行搜索