【问题标题】:Bash: Expect different exit code with set -eBash:使用 set -e 期望不同的退出代码
【发布时间】:2019-10-18 10:51:52
【问题描述】:

考虑一个在启用set -e 的情况下执行的 bash 脚本(出错时退出)。

脚本中的一个命令返回预期的非零退出代码。仅当命令完全返回此退出代码时,如何恢复脚本?请注意,退出代码零也应计为错误。最好是单线解决方案。

例子:

set -e

./mycommand  # only continue when exit code of mycommand is '3', otherwise terminate script

...

【问题讨论】:

  • 请注意,使用set -e 并不是普遍认为的好主意——它的行为通常非常不直观,而且often incompatible 不仅在不同的shell 之间,而且在同一shell 的不同版本之间,造成运行时行为很难预测。强烈推荐阅读BashFAQ #105
  • @CharlesDuffy 感谢您的注释,不幸的是,在这种情况下我无法控制set -e,我只需要解决它
  • 可以被关闭 -- set +e 这样做。

标签: bash exit-code


【解决方案1】:

这将包括两部分:检测错误代码 3,以及将零变为另一个

一个可能的解决方案是这样的

mycommand && false || [ $? -eq 3 ]

第一个 && 运算符将零退出代码变为 1(使用 false - 如果 1 应该被视为“好”,则更改为其他值),然后使用测试将“好的退出代码”更改为3.

一种更简单、更易于维护的方法是使用子shell:

( mycommand; [ $? -eq 3 ] )

此子shell 将正常运行mycommand,其退出代码将是后一个子命令的退出代码。只要确保你不要shopt -s inherit_errexit 破坏这个:)

【讨论】:

    【解决方案2】:

    不使用查尔斯·达菲在评论中指出的set -e 是有问题的:

    # don't use set -e
    
    ./mycommand
    if (( $? != 3 ))
    then
        exit
    fi
    
    # more script contents follow
    

    您可以将其缩短为:

    # don't use set -e
    
    ./mycommand
    (( $? != 3 )) && exit
    
    # more script contents follow
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 2013-05-16
      相关资源
      最近更新 更多