如何使bash函数在任何错误上返回1

时间:2015-05-27 16:53:51

标签: bash exit-code

我有一个虚假的bash函数,例如:

has_error() {
  true
  echo "Ok..."
  false
  echo "Shouldn't be here!"
}

当我运行此功能并检查错误状态时,我希望发生什么:

> has_error; echo $?
Ok...
1

但实际发生了什么:

> has_error; echo $?
Ok...
Shouldn't be here!
0

问题是该函数在抛出错误后继续执行,而且,我甚至无法检测到抛出了错误。我怎么能改变这个?我可以在函数的开头放一个set -e,但是如果抛出错误,我的整个shell都会终止。我想要的是简单地让它返回并将退出状态设置为1.我可以通过在命令之间放置&&,或者用|| return 1后缀每一行来完成它,但两者都没有那些都很优雅。这样做的正确方法是什么?

修改

似乎我不够清楚,因为很多回复似乎表明我实际上并不知道如何在bash中执行测试。正如我上面提到的,我知道我可以在我的函数中手动测试每个命令,并根据需要返回或处理错误。我也知道我可以set -e并导致我的shell会话因错误而终止。但我要问的是:有没有办法让函数停止继续执行 - 没有明确的测试 - 如果该函数中的任何命令返回非零状态?

2 个答案:

答案 0 :(得分:12)

如果您的函数不需要设置任何全局变量,则可以让该函数创建一个使用set -e的子shell。子shell将退出,而不是调用has_error的shell。

has_error () (    # "(", not "{"
  set -e
  true
  echo "Ok..."
  false
  echo "Shouldn't be here!"
)

答案 1 :(得分:5)

@chepner的回答帮助了我,但它不完整。

如果要检查函数返回码,不要在if语句中放入函数调用,请使用$?变量。

randomly_fail() (
  set -e
  echo "Ok..."
  (( $RANDOM % 2 == 0 ))
  echo "I'm lucky"
)

FAILED=0
SUCCESS=0
for (( i = 0; i < 10; i++ )); do
  randomly_fail
  if (( $? != 0 )); then
      (( FAILED += 1 ))
  else
    (( SUCCESS += 1 ))
  fi
done

echo "$SUCCESS success, $FAILED failed"

这将输出类似

的内容
Ok...
I'm lucky
Ok...
I'm lucky
Ok...
I'm lucky
Ok...
Ok...
I'm lucky
Ok...
Ok...
I'm lucky
Ok...
Ok...
Ok...
I'm lucky
6 success, 4 failed