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

我有一个父function和子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导致父母的回报,然后避免执行剩余的子女电话?

而不需要像这样在每个子调用之后添加一个返回值的检查

 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的值是未指定时执行的最后一个命令的返回状态。 (感谢kojiro的提醒)。

或者只要使用set -e如果ash支持的话)(虽然这对于无法正常工作的一些非显而易见的限制 ,使一些人建议你避免使用它)。 在命令之前运行set -e ,任何“简单命令”失败都会导致shell立即退出,但以前的解决方案更加灵活。

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函数,并且在任何一个chile函数调用有非零退出状态时,子shell 将被终止

有一个解决方案,而不是set -e|| return || 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 )