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