为啥标准输入上的 Gnu grep 退出状态始终为 0?
Posted
技术标签:
【中文标题】为啥标准输入上的 Gnu grep 退出状态始终为 0?【英文标题】:Why is Gnu grep exit status always 0 on standard input?为什么标准输入上的 Gnu grep 退出状态始终为 0? 【发布时间】:2015-10-09 14:25:39 【问题描述】:在 Ubuntu 14.04 的 bash 命令行上:
echo "z" | grep -e 'x' ; echo $PIPESTATUS
始终显示 0,即使显然“z”中没有“x”。但是:
echo "z" > /tmp/z
grep -e 'x' /tmp/z ; echo $PIPESTATUS
按我的预期工作,如果模式是“x”(如图所示),则返回 1,如果模式是“z”,则返回 0。
为什么?
【问题讨论】:
【参考方案1】:PIPESTATUS
实际上是一个 BASH 数组变量,其中包含最近执行的前台管道中进程的退出状态值列表。
要打印所有退出状态,您需要将其用作:
echo "z" | grep -e 'x' ; echo $PIPESTATUS[@]
0 1
其中0
是第一个echo
命令的退出状态,1
是 grep 命令的退出状态。
当您使用echo $PIPESTATUS
时,它只会打印数组的第一个元素。
要检查grep
命令状态,您甚至不需要使用PIPESTATUS
。
你应该只使用$?
:
echo "z" | grep -q 'x' ; echo $?
1
【讨论】:
是的。对于 bash 数组,$ary
实际上是 $ary[0]
是的,这是一个很大的“啊哈!”为了我。谢谢。以上是关于为啥标准输入上的 Gnu grep 退出状态始终为 0?的主要内容,如果未能解决你的问题,请参考以下文章
“错误:命令'x86_64-linux-gnu-gcc'失败,退出状态为1”在virtualenv中
致命错误:Python.h:没有这样的文件或目录错误:命令“x86_64-linux-gnu-gcc”失败,退出状态为 1