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更可靠,后者可以运行 bc如果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" )

在这种情况下,falsetrue 的结果控制整个组的执行,而不仅仅是单个 echo.