为什么使用 grep -q 时退出代码 141?
- 2024-10-29 08:35:00
- admin 原创
- 62
问题描述:
有人可以解释为什么我得到下面的退出代码 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 表示失败,但上面一行显示为零,所以我想说它应该是成功。
解决方案 1:
这是因为grep -q
一旦找到匹配项,就会立即以零状态退出。该zfs
命令仍在写入管道,但没有读取器(因为grep
已退出),因此它会从内核发送SIGPIPE
信号并以状态退出141
。
另一个常见的地方是head
. 例如
$ seq 1 10000 | head -1
1
$ echo ${PIPESTATUS[@]}
141 0
在这种情况下,head
读取第一行并终止,从而生成一个SIGPIPE
信号并seq
以 退出141
。
请参阅《Linux 程序员指南》中的“臭名昭著的 SIGPIPE 信号”。
解决方案 2:
我不熟悉zfs list
,但我猜它抱怨它的标准输出被关闭 -grep -q
当找到匹配时立即退出,不像grep
。
解决方案 3:
另一种选择是不使用管道,而是使用进程替换:
grep -q tank <(zfs 列表)
更新:我猜是同一件事,因为括号内运行的进程也会收到sigpipe。
解决方案 4:
您可以继续吃输出,例如:
command | { head -n1; cat >/dev/null; }
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD