首页 > 解决方案 > 失败后立即退出并在退出 shell 之前回显错误消息

问题描述

如果命令以非零状态退出并且我想在退出之前回显某事以记录,我有一个脚本应该立即退出:

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),所以它是“假 ||假”,因此在主外壳中退出。我的问题是,是否与以下内容相同:

#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; }

如果不是,有什么区别?在我的测试中,它们的行为相同。

标签: bashshellunixexit

解决方案


在第二个版本中,exit 1退出原始外壳,而不是子外壳。这就是为什么您不需要set -e在发生这种情况时让脚本退出的原因。

你可以像这样得到第一个 shell 的等价物:

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退出 shell。


推荐阅读