【问题标题】:How to make a return from a child function cause a return to the parent function?如何从子函数返回导致返回父函数?
【发布时间】:2015-02-16 14:19:23
【问题描述】:

我有一个父函数和子函数:

parent() {

   child aa1 bb1 cc1
   child aa2 bb2 cc2
   child aa3 bb3 cc3
   child aa4 bb4 cc4

}

child() {
  ....
  if [ some error reason ]; then return 1; fi
  ...
}

如何使return 1(子级)在父级中引起返回,然后避免执行剩余的子级调用?

在这样的每个子调用之后不添加对返回值的检查

parent() {

   child aa1 bb1 cc1
   e=$?; [ "$e" != "0" ] && return $e
   child aa2 bb2 cc2
   e=$?; [ "$e" != "0" ] && return $e
   child aa3 bb3 cc3
   e=$?; [ "$e" != "0" ] && return $e
   child aa4 bb4 cc4
   e=$?; [ "$e" != "0" ] && return $e

}

【问题讨论】:

    标签: linux bash shell ash


    【解决方案1】:

    在每次通话的末尾添加|| returnreturn返回的值是未指定时最后执行的命令的返回状态。 (感谢小次郎的提醒)。

    或者,如果ash 支持,则仅使用set -e(尽管some non-obvious limitations 表示它无法正常工作,这使得一些人建议您避免使用它)。在你的命令之前运行set -e,任何“简单命令”失败都会导致shell立即退出,但之前的解决方案更灵活。

    【讨论】:

    • 使用 set -e 的例子?
    • 对不起@EtanReisner,但我必须接受我的回答,因为它现在是正确的
    【解决方案2】:

    parent 函数中添加set -e

    parent() {
       set -e
       child aa1 bb1 cc1
       child aa2 bb2 cc2
       child aa3 bb3 cc3
       child aa4 bb4 cc4
    }
    

    然后称它为:

    ( parent )
    

    这将在子 shell 中运行 parent 函数,并且子 shell 将在任何 chile 函数调用出现非零退出状态时终止。

    【讨论】:

    • Etan 在他的回答中说the set -e has some non-obvious limitations about when it fails to work correctly that make some people avoid using it。使用 set -e 时存在无法正常工作的风险? ash 已经支持 set -e
    【解决方案3】:

    除了set -e|| return之外还有其他解决方案

    很简单,只需使用exit 而不是return 并且父级应该在子shell 中调用:

    parent() {
       child aa1 bb1 cc1
       child aa2 bb2 cc2
       child aa3 bb3 cc3
       child aa4 bb4 cc4
    }
    
    child() {
      ....
      if [ some error reason ]; then exit 1; fi
      ...
    }
    

    我这样称呼父母:

    ( parent )
    

    【讨论】:

      猜你喜欢
      • 2020-07-13
      • 2016-08-14
      • 1970-01-01
      • 2021-10-02
      • 1970-01-01
      • 2015-02-13
      • 1970-01-01
      • 2010-10-01
      • 1970-01-01
      相关资源
      最近更新 更多