为什么Gnu grep退出状态在标准输入上始终为0?

Ste*_*omb 4 bash grep exit-code

在Ubuntu 14.04中的bash命令行上:

echo "z" | grep -e 'x' ; echo $PIPESTATUS
Run Code Online (Sandbox Code Playgroud)

总是显示0,即使显然"z"中没有"x".但:

echo "z" > /tmp/z
grep -e 'x' /tmp/z ; echo $PIPESTATUS 
Run Code Online (Sandbox Code Playgroud)

按预期工作,如果模式为'x'(如图所示)则返回1,如果模式为'z'则返回0.

为什么?

anu*_*ava 6

PIPESTATUS 实际上是一个BASH数组变量,包含最近执行的前台管道中进程的退出状态值列表.

要打印所有退出状态,您需要将其用作:

echo "z" | grep -e 'x' ; echo ${PIPESTATUS[@]}
0 1
Run Code Online (Sandbox Code Playgroud)

0第一个echo命令的退出状态在哪里,是1grep命令的退出状态.

当你使用echo $PIPESTATUS它时只打印数组的第一个元素.

要检查grep命令状态,您甚至不需要使用PIPESTATUS.

你应该使用$?:

echo "z" | grep -q 'x' ; echo $?
1
Run Code Online (Sandbox Code Playgroud)

  • 是.对于bash数组,`$ ary`实际上是`$ {ary [0]}` (2认同)