【问题标题】:Returning from a second function in a sourced script从源脚本中的第二个函数返回
【发布时间】:2018-09-22 06:36:17
【问题描述】:

这个问题是以前提出的问题的变体,例如How to return an error from a sourced bash script.

然而,我想要的是源函数 X 调用第二个函数 Y,然后将函数 Y 的返回码返回给调用者。

目前,我的脚本使用这种模式工作:

function_x() {
  function_y || return $?
}

function_y() {
  return 1
}

然而,在实践中,这会导致我的代码中出现大量返回语句。

假设函数 Y 实际上是一个使用函数。然后我得到了丑陋的代码,不是很干,像这样:

_usage() {
  echo "Usage: $0 [-h] OPTIONS"
  return 0
}

function_a() {
  [ "$1" == "-h" ] && _usage && return 1
  some_other_condition && _usage && return 1
  yet_another_condition && _usage && return 1
  ...
}

(我的实际代码是here。)

一般来说,函数 X 调用第二个函数 Y,然后将 Y 的返回码返回给调用者,有没有一种简洁的方法?

【问题讨论】:

    标签: bash


    【解决方案1】:

    你不需要做任何事情:Bash 函数或脚本的返回状态是它执行的最后一个命令的返回状态。

    所以这个:

    function_x() {
      # ...
      function_y || return $?
    }
    

    和这个是一样的:

    function_x() {
      # ...
      function_y
    }
    

    return 语句不影响状态,所以如果你想返回一个命令的状态,就在它后面说return

    if [ ... ]; do
      function_y
      return
    fi
    

    最后一个例子:

    [ "$1" == "-h" ] && _usage && return 1
    some_other_condition && _usage && return 1
    yet_another_condition && _usage && return 1
    

    您可以通过这种方式避免重复:

    { [ "$1" == "-h" ] || some_other_condition || yet_another_condition; } && _usage && return 1
    

    【讨论】:

    • 我想我要解决的主要问题是避免对 return 语句的所有重复调用。也许这是不可能的?
    • @AlexHarvey:我在答案的末尾添加了一个解决方案。顺便说一句,使用-h 运行以获得帮助的程序应该返回 0,而不是 1。
    • 哦,我明白了,是的,我可以做到。注意到-h。谢谢。
    • 您可能想强调语法需要分号。很容易错过。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-11-29
    • 2012-01-02
    • 2020-05-06
    • 2018-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多