为什么 Gnu grep 在标准输入上的退出状态总是为 0?

4

在Ubuntu 14.04的bash命令行上:

echo "z" | grep -e 'x' ; echo $PIPESTATUS

即使"z"中明显没有"x",它也始终显示为0。但是:

echo "z" > /tmp/z
grep -e 'x' /tmp/z ; echo $PIPESTATUS 

此函数按照我的期望工作,如果模式为'x'(如所示),则返回1,如果模式为'z',则返回0。

为什么?

1个回答

6

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

2
是的。在Bash数组中,$ary实际上是${ary[0]} - glenn jackman
1
是的,这对我来说是一个极大的“啊哈!”。谢谢。 - Steve Newcomb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接