假设我有这样的事情:
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