如何在一个脚本中运行多个脚本,即使一个脚本失败

如何在一个脚本中运行多个脚本,即使一个脚本失败

我有一个简单的 bash 脚本,可以执行许多其他脚本……

#/bin/bash
./update_artifact1.sh $ARTIFACT_VERSION
./update_artifact2.sh $ARTIFACT_VERSION
./update_artifact3.sh $ARTIFACT_VERSION

问题是,如果第一个命令(或第二个命令)因错误而终止,则不会运行任何后续命令。有没有办法可以运行所有三个命令,保存每个命令的退出状态,然后如果所有三个命令都成功执行,则返回成功退出状态?脚本不必同时运行。

答案1

您可以用这种方式稍微修改一下脚本

#!/bin/bash
./update_artifact1.sh $ARTIFACT_VERSION
exit_state_1=$?
./update_artifact2.sh $ARTIFACT_VERSION
exit_state_2=$?
./update_artifact3.sh $ARTIFACT_VERSION
exit_state_3=$?
exit_state_all=$[ $exit_state_1 &&  $exit_state_2 && $exit_state_3 ]
exit $exit_state_all

笔记:

  • bash每个命令都会返回一个存储在中的退出代码$?0如果没有错误,则为 ,如果有错误,则为不同的数字。
    每行之后的值$?都会更新,因此您需要将其存储在一个变量中(在本例中我们使用了exit_state_1... exit_state_n)。
    最后,如果一切正常,您希望脚本只返回一个错误代码 0,我们用 来实现它$[ $a || $b || $c ]
    请注意,为$[ 0|| 0 || 0 ]0,同时$[ $a || $b || $c ]至少有一个$a,$b,$c不等于时0返回 1。
  • 重要的是在第一行,你必须写信#!/bin/bash告诉系统这是一个必须在bashshell 中执行的脚本。
    你可能会对阅读更多关于舍邦这里。
  • 正如注释中所述,如果您将set -e脚本中的某处放在这些行之前,则脚本将在第一个错误处中断,而不会处理另一行,并且它将返回错误代码(最后执行的命令之一)。

相关内容