Answers:
$()
保留退出状态;您只需要在没有自己状态的语句(例如赋值)中使用它。
输出= $(内部)
此后,$?
将包含的退出状态inner
,您可以对其进行各种检查:
output=$(inner) || exit $?
echo $output
要么:
if ! output=$(inner); then
exit $?
fi
echo $output
要么:
if output=$(inner); then
echo $output
else
exit $?
fi
(注意:exit
不带参数的裸露等效于exit $?
–即,它以最后一条命令的退出状态退出。我仅出于清晰起见使用第二种形式。)
另外,记录:source
在这种情况下是完全无关的。您只需inner()
在outer-scope.sh
文件中进行定义即可获得相同的结果。
echo $()
,则可能是因为当行(该echo
命令)具有自己的退出代码(通常为0)时,会忽略子外壳的退出代码。
if ! $(exit 1) ; then echo $?; fi
,我得到了0
。if
如果您需要保留该退出值,则不确定该走的路。
if ! output=$(inner); then exit $?; fi
将以0的返回码退出,因为$?
它将给出的返回码为!
而不是的返回码inner
。您可以用达到预期的行为,if output=$(inner); then : ; else exit $?; fi
但这显然更为冗长
如果您同时需要(输出和退出状态):
output=$(command)
status=$?
请注意有关函数局部变量的棘手情况,请比较以下代码:
f() { local v=$(echo data; false); echo output:$v, status:$?; }
g() { local v; v=$(echo data; false); echo output:$v, status:$?; }
我们会得到:
$ f # fooled by 'local' with inline initialization
output:data, status:0
$ g # a good one
output:data, status:1
当子外壳程序的输出用于初始化local
变量时,退出状态不再是子外壳程序的退出状态,而是命令的退出状态,最有可能是。local
0