如何将上一个命令的状态传递给函数?
换句话说 - 为什么这些命令按预期工作:
$: false && echo "true" || echo "false"
>> false
$: true && echo "true" || echo "false"
>> true
但这不是:
function status () {
echo "true" || echo "false"
}
$: true && status
>> true
$: false && status
>>
而且,我如何才能使上述功能按预期工作?
您可以显式测试$?
以获取最近执行的命令的退出状态:
status() {
if (( $? == 0 )); then
echo "true"
else
echo "false"
fi
}
(这比a && b || c
更可靠,如果b
为真但c
在执行期间遇到错误,它可以同时运行a
和b
)。
此后:
$ true; status
true
$ false; status
false
顺便说一句,我个人会以反转流量控制的方式写这个:
run_with_status() {
local retval
if "$@"; then
echo "true"
else
retval=$?
echo "false"
return "$retval"
fi
}
run_with_status true
run_with_status false
这种形式将更好地与set -e
(否则将在错误之前退出打印false
的能力)或ERR
陷阱,并避免潜在的错误,其中有人添加echo
错误记录无意中改变了$?
的值。
您的原始语句被解析为:
( false && echo "true" ) || echo "false"
( true && echo "true" ) || echo "false"
它没有完全像这样执行,因为没有子shell,但这显示了语句的分组方式。
当您将echo
语句移动到函数中时,它更像是:
false && ( echo "true" || echo "false" )
true && ( echo "true" || echo "false" )
在这种情况下,false
或true
的结果控制整个组的执行,而不仅仅是单个echo
。