我有一个脚本,如果命令以非零状态退出,并且我想在退出之前回显 sth 以记录,则应立即退出:
set -e
command A || (echo "A failed";exit 1)
command B || (echo "B failed";exit 1)
if Condition C;
then
command D || (echo "D failed";exit 1)
它做我想做的事。如果命令 A/B/D 失败,请向我回显正确的消息并退出。我知道 (( 表示子壳,在子壳中它回显某些内容然后在子壳(出口 1(中返回 false,所以它是"假 ||假",从而在主外壳中退出。我的问题是,这是否与:
#set -e
command A || { echo "A failed";exit 1; }
command B || { echo "B failed";exit 1; }
if Condition C;
then
command D || {echo "D failed";exit 1; }
如果不是,有什么区别?在我的测试中,它们的行为相同。
在第二个版本中,exit 1
退出原始 shell,而不是子 shell。这就是为什么发生这种情况时不需要set -e
使脚本退出的原因。
你可以得到第一个外壳的等效值,如下所示:
set -e
command A || { echo "A failed";false; }
command B || { echo "B failed";false; }
if Condition C;
then
command D || {echo "D failed";false; }
false
以非零状态退出,这将触发set -e
退出外壳。