bash:如果grep管道选择任何行,则退出

时间:2015-08-04 20:04:25

标签: bash grep

如果选择 no 行,我希望grep管道成功:

set -o errexit
echo foo | grep -v foo
# no output, pipeline returns 1, shell exits
! echo foo | grep -v foo
# no output, pipeline returns 1 reversed by !, shell continues

同样,我希望管道失败(并且当设置errexit时,封闭的shell退出)如果有任何行出现结束。上述方法不起作用:

echo foo | grep -v bar
# output, pipeline returns 0, shell continues
! echo foo | grep -v bar
# output, ???, shell continues
! (echo foo | grep -v bar)
# output, ???, shell continues

我终于找到了一种方法,但它似乎很难看,我正在寻找一种更好的方法。

echo foo | grep -v bar | (! grep '.*')
# output, pipeline returns 1, shell exits

对此行为的任何解释也将受到赞赏。

2 个答案:

答案 0 :(得分:4)

set -e,又名set -o errexit,只处理未经检查的命令;其目的是防止错误被忽视,而不是一个明确的流程控制机制。在这里明确检查是有道理的,因为这是一个你积极关心的案例,而不是一个可能会出乎意料的错误。

echo foo | grep -v bar && exit

更重要的是,您的一些命令明确表示您关心(因此可能已经手动处理)退出状态 - 因此设置“已检查”标志,使errexit无效。

特别是,运行! pipeline会为管道设置checked标志 - 这意味着您明确地使用其退出状态执行某些操作,这意味着自动故障案例处理不需要应用

答案 1 :(得分:1)

这不是单行,但它有效:

if echo foo | grep foo ; then
    exit 1
fi

如果grep发现某些内容,则表示shell退出1。此外,我不认为set -eset -o errexit应该用于逻辑,它应该用于它的意图,以便在发生意外错误时停止脚本。