BASH - 将先前语句的状态传递给函数?
BASH - pass status of previous statement to function?
如何将上一个命令的状态传递给函数?
换句话说 - 为什么这些命令按预期工作:
$: 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
.
如何将上一个命令的状态传递给函数?
换句话说 - 为什么这些命令按预期工作:
$: 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
.