bash中`set -e`的例外情况

时间:2018-01-03 14:08:49

标签: bash continuous-integration

我有一个用于制作项目的bash脚本。我在脚本顶部有set -e以在任何组件发生故障时中断执行。

其中一个命令会失败,但它很自然会失败。我希望脚本的行为如下:

  • 运行脚本。
  • 到达并运行有问题的命令。
  • 如果失败,请不要执行。仅对此命令执行此操作。

2 个答案:

答案 0 :(得分:3)

我建议:

set +e
# your command which would fail
set -e

your_command_which_would_fail || true

答案 1 :(得分:1)

标志set -e有一堆豁免,在执行的命令失败后(exitcode≠0)它不会立即导致中止。其中包括@cyrus提出的连接(a || b和类似)。有关详细信息,请参阅man bash;它有点难找,也许这会有所帮助:

man bash | grep -B 20 -A 10000 'Exit.*immediately' | less

我的建议是将其放在if

if command
then
    : "worked nicely"
else
    : "failed, but we don't want to abort"
fi

或@ Cyrus的简短版本:

command || true  # do not abort in case of 'set -e'