4

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

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

}
4

3 回答 3

6

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

或者只是使用set -eifash支持它(尽管它有一些关于它何时无法正常工作的非明显限制,这使得一些人建议你避免使用它)。在您的命令之前运行set -e,任何“简单命令”失败都会导致 shell 立即退出,但之前的解决方案更加灵活。

于 2015-02-16T14:21:29.113 回答
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,子 shell就会终止。chile

于 2015-02-16T14:24:14.213 回答
2

set -e除了和之外,还有一个解决方案|| return

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

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 )
于 2015-02-19T08:50:03.587 回答