如果选择 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
对此行为的任何解释也将受到赞赏。
答案 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 -e
或set -o errexit
应该用于逻辑,它应该用于它的意图,以便在发生意外错误时停止脚本。