我有一个父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 )