当前位置: 首页 > 面试题库 >

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

司徒修能
2023-03-14
问题内容

有人可以解释为什么我从下面得到退出代码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程序员指南》中的“臭名昭著的SIGPIPE信号 ”。



 类似资料:
  • 问题内容: 我正在尝试使用docker-compose服务启动容器,但不幸的是, 容器退出了代码0 。容器的建立要归功于.tar.gz归档文件中的存储库。这个档案是一个Centos VM。 我想从同一档案创建6个容器。我想创建一个docker-compose.yml文件,而不是键入6次docker命令,我可以在其中总结其命令和标签。 我已经开始写docker-compose.yml文件只是为了创建

  • 我正在研究lib,它使用了很多文件系统函数。 我想要的是,我的函数根据errno返回各种错误代码(而不仅仅是-1作为错误),以防文件系统函数失败。 虽然我可以直接使用errno值,但我希望在函数,错误代码和系统errno之间创建一些抽象层(例如,我的错误值从-1000开始,并且是负值,而errno值是正值)。 我的问题是什么是最好的实现方式。 现在我看到两种可能的解决方案: 使用带有错误代码的枚举

  • 问题内容: 我一直在尝试编译和测试使用Gradle的大型项目。测试运行良好,直到它们意外死亡。我挖了一下,有资源说这是由于内存问题造成的。如果我减少套件中的测试数量,它将运行良好。 我将内存增加了4倍,从而提高了调试级别,但是我仍然不了解导致此问题的原因。这是可怕的隐秘堆栈跟踪。最后一行(向右滚动)显示了我定义的内存设置。 问题答案: 此问题似乎与Linux有关,而不是Jenkins文档中所述的G

  • 我习惯于在我的 vscode 中使用 WSL 来编写 cpp 代码。 今天我在vscode中配置了Go,并在powershell cmd中成功运行。 但是,当我转到WSL时,它以“4294967295”终止。我搜索了很多资源,但不知道如何解决它。 这是我的设置.json文件和快照在 vs 代码。有人可以帮助我吗?谢谢! 在此处输入图像描述在此输入图像描述

  • 问题内容: 用一些错误代码退出程序的惯用方式是什么? 的文档说:“程序立即终止;延迟的函数不运行。”,仅调用。对于不是严重错误的事情,终止程序而不运行延迟函数似乎是极端的。 我是否应该绕过一些表明存在错误的状态,然后在某个我知道可以安全退出并已运行所有延迟函数的位置进行调用? 问题答案: 我在大多数实际软件包中都遵循了这些原则,以便尽快采用该约定并适当终止该约定: