如何从子函数返回导致返回父函数?

时间:2015-02-16 14:19:23

标签: linux bash shell ash

我有父功能和子功能:

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

}

3 个答案:

答案 0 :(得分:6)

在每次通话结束时添加|| returnreturn返回的值是未指定时执行的最后一个命令的返回状态。 (感谢kojiro的提醒)。

如果set -e支持ash,那么只需使用set -e(虽然有some non-obvious limitations关于何时无法正常工作,但有些人建议您不要使用它)。在命令之前运行{{1}},任何“简单命令”失败都会导致shell立即退出,但之前的解决方案更灵活。

答案 1 :(得分:4)

set -e函数中添加parent

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

然后将其称为:

( parent )

这将在子shell中运行parent函数,并且只要{{1}中的任何一个存在非零退出状态,子shell 就会终止函数调用。

答案 2 :(得分:2)

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