如何使子函数的 return 导致父函数的 return?

How to make a return from a child function cause a return to the parent function?

我有父函数和子函数:

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 在父项中引起 return,然后避免执行剩余的子项调用?

没有像这样在每次子调用后添加对 returned 值的检查

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

}

在每次调用的末尾添加 || return。由 return 编辑的值 return 是未指定时执行的最后一个命令的 return 状态。 (感谢小次郎提醒)

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

在您的 parent 函数中添加 set -e

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

然后将其命名为:

( parent )

这将运行 parent函数在子shell和子shell中一旦有非- 任何 chile 函数调用的零退出 状态。

除了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 )