即使 set -e 已切换,如何运行下一个 bash 行

即使 set -e 已切换,如何运行下一个 bash 行

假设我有这样的事情:

set -e;
echo 'doing some stuff'
false;
status=$?
post_hook send-message-elsewhere-with-status $status

做我想做的事情的一种方法是:

set -e;
echo 'doing some stuff'
(
set +e
false;
status=$?
post_hook send-message-elsewhere-with-status $status
)

但还有其他办法吗?

答案1

您的问题没有提供大量上下文来确定您实际想要完成的任务,但是男人狂欢很明显,set -e当收到非零退出状态时,您的脚本将立即退出,除非失败的命令是:

  • while紧随or关键字之后的命令列表until
  • if或保留字之后的测试elif
  • &&在 a或列表中执行的任何命令,但最后的或||后面的命令除外;&&||
  • 管道中除最后一个命令外的任何命令;或者
  • 如果命令的返回值与'!'.

因此,除了子 shell 之外,您还有多个选项来将命令安排为其中的一部分,以确保在命令失败并返回非零时执行下一行

答案2

如果有一个特定的行有条件地不受 影响set -e,则可以这样做:

false || true

这可以缩短为:

false || :

或者最神秘的是:

false||:

如果有多行,请将它们用大括号括起来:

{ false; false; } || true

请注意,false此处代表任何可能返回错误代码的代码。当然false不打印任何输出;但类似的东西ls /bin/bash /bin/bbbbbbbash会打印到标准输出标准错误错误率,并且使用上述方法仍然会。

或者用语句包围要免疫的代码set

set +e; false ; set -e

注意:无论相关行返回错误代码还是成功,上述方法都有效。如果知道特定行肯定会返回错误,那么所需要的只是一个前导!

! false

相关内容