BASH - 将前一个语句的状态传递给函数?

问题描述 投票:0回答:2

如何将上一个命令的状态传递给函数?

换句话说 - 为什么这些命令按预期工作:

$: false && echo "true" || echo "false"
>> false

$: true && echo "true" || echo "false"
>> true

但这不是:

function status () {
    echo "true" || echo "false"
}

$: true && status
>> true

$: false && status
>>

而且,我如何才能使上述功能按预期工作?

bash function conditional
2个回答
3
投票

您可以显式测试$?以获取最近执行的命令的退出状态:

status() {
  if (( $? == 0 )); then
    echo "true"
  else
    echo "false"
  fi
}

(这比a && b || c更可靠,如果b为真但c在执行期间遇到错误,它可以同时运行ab)。


此后:

$ 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错误记录无意中改变了$?的值。


2
投票

您的原始语句被解析为:

( false && echo "true" ) || echo "false"
( true && echo "true" ) || echo "false"

它没有完全像这样执行,因为没有子shell,但这显示了语句的分组方式。

当您将echo语句移动到函数中时,它更像是:

false && ( echo "true" || echo "false" )
true && ( echo "true" || echo "false" )

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

© www.soinside.com 2019 - 2024. All rights reserved.