为什么标准输入上的 Gnu grep 退出状态始终为 0?
Why is Gnu grep exit status always 0 on standard input?
在 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
为什么?
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
在 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为什么?
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