【问题标题】: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。

为什么?

【问题讨论】:

    标签: bash grep exit-code


    【解决方案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]}
    • 是的,这是一个很大的“啊哈!”为了我。谢谢。
    猜你喜欢
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-29
    • 2019-11-22
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多