如何禁用单个命令的 set -e?

如何禁用单个命令的 set -e?

当任何命令返回非零退出代码时,set -e 命令会使 bash 脚本立即失败。

  1. 是否有一种简单而优雅的方法来禁用脚本中单个命令的这种行为?

  2. 在 Bash 参考手册的哪些地方记录了此功能(http://www.gnu.org/software/bash/manual/bashref.html)?

答案1

  1. 像这样:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line
    

    跑步:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
    
  2. set内置帮助中对此进行了描述:

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

这里也有同样的记录:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin

答案2

取消错误保释的另一种方法是无论如何都强制成功。你可以这样做:

cmd_to_run || true

这将返回 0(真),因此不应触发 set -e

答案3

如果您尝试捕获返回/错误代码(函数或分叉),则可以这样做:

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

答案4

我发现另一种方法相当简单(并且set除了 之外还适用于其他选项-e):

利用$-恢复设置。

例如:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

但具体来说-e,其他人提到的选项(|| true或“放在里面if”)可能更符合惯用语。

相关内容