【问题标题】:How to return from sourced bash script automatically on any error?如何在出现任何错误时自动从源 bash 脚本返回?
【发布时间】:2018-07-07 16:02:27
【问题描述】:

我有一个 bash 脚本,该脚本仅在获取时使用。 我想在出现任何错误时自动返回,类似于set -e 所做的。 但是设置 set -e 对我不起作用,因为它也会退出用户 shell。

现在,对于每个命令,我正在处理像 command || return 1 这样的手动返回。

【问题讨论】:

标签: bash return


【解决方案1】:

您也可以使用command || truecommand || return。 如果您的要求有所不同,请更准确地更新。

【讨论】:

  • command || return 1 - 这就是我现在正在做的事情,并正在寻找一种自动化的方法。 (我最初在主帖中写了command || exit 1,已编辑)
【解决方案2】:

您可以使用trap。例如:

// foo.sh
function func() {
    trap 'if [ $? -ne 0 ]; then  echo "Trapped!"; return ; fi' DEBUG
    echo 'foo'
    find -name "foo" . 2> /dev/null
    echo 'bar'
}

func

两个音符。首先,trap 需要在函数内部,如图所示。如果它只是在脚本中,它将不起作用。

第二,有一个很大的限制。即使您设置了返回陷阱(例如,return 1),而在错误的find 命令之后存在func,无论如何$? 仍然为零。我不确定是否有办法解决这个问题,所以如果保留失败命令的退出值很重要,这可能不起作用。

例如,如果您有:

func
func_return=$?
echo "return value is: $func_return"

func_return 将始终为零。我一直在尝试让失败命令的退出值从函数陷阱传递到函数退出值,但还没有找到方法。

如果需要保留返回值,可以在调试陷阱中更新全局变量。

【讨论】:

    【解决方案3】:

    如果我理解得很好,您可以在每个函数中本地设置 -e。

    cat sourced
    
    f1 () {
      local -
      set -e
      [ "$1" -eq "$1" ] 2> /dev/null && echo "$1"
    }
    
    cat script.sh
    
    . sourced
    param='bad'
    ret=$(f1 "$param")
    [ $? -eq 0 ] && echo "result = $ret" || \
      echo "error in sourced file with param $param"
    param=3
    ret=$(f1 "$param")
    [ $? -eq 0 ] && echo "result = $ret" || \
      echo "error in sourced file with param $param"
    

    【讨论】:

    • 在一个简单的命令之后放置一个&& 使其“被检查”,所以set -e 忽略它。您只会看到返回的非零退出状态,因为函数末尾的 $?[ 命令的退出状态,因为当 && echo 不执行时,无论如何这是函数​​中的最后一个命令 i>.
    • 参见ideone.com/wzd9KT -- 请注意f2 的退出状态为0,尽管set -e
    猜你喜欢
    • 2017-02-07
    • 2015-07-27
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-02
    • 2011-02-21
    相关资源
    最近更新 更多