有人能解释一下为什么我会从下面得到出口代码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信号,seq退出141.

请参阅《Linux程序员指南》中的"The Infamous SIGPIPE Signal".

Linux相关问答推荐

awk:try 将时间戳字符串转换为unix纪元时间

在shell 中使用排除模式的grep

X86_64程序集中的分段故障:系统调用问题

AWK+向AWK导出值未传递

JSON 转义 CURL/JQ 输出

在正在运行的进程的输出周围添加自定义字符串

加载ELF64头文件为什么会导致分段错误?

如何查明第三方是否杀死或 destruct 了 C++ 中的程序

如何在 Linux 上打印带有屏蔽值的环境名称?

提交SLURM作业(job)时出现nohup问题

如何重新安装最新的 cmake 版本?

Eclipse 的 C# 插件

使用 C/C++ (GCC/G++) 在 Linux 中的套接字编程中发送和接收文件

Pthread mutex互斥断言错误

在 linux 上查看文件大小

什么是适用于 Linux 的好的 Prolog IDE?

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

如何使用终端打开-虚线文件名?

Linux控制台中的模糊文件搜索

Linux(Ubuntu)终端-如何查看以前的页面不再可见