首页 > 解决方案 > BASH - 将先前语句的状态传递给函数?

问题描述

如何将先前命令的状态传递给函数?

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

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

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

但这不会:

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

$: true && status
>> true

$: false && status
>>

而且,我怎样才能让上面的功能按预期工作?

标签: bashfunctionconditional

解决方案


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

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错误日志记录无意中更改了$?.


推荐阅读