如何在任何错误上创建 bash 函数 return 1
How to make a bash function return 1 on any error
我有一个像这样的假 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 将终止。我想要的是简单地拥有它 return 并将退出状态设置为 1。我可以通过在命令之间放置 &&
或在每一行后缀 || return 1
来做到这一点,但它们都不是很优雅。执行此操作的正确方法是什么?
编辑:
看来我说得不够清楚,因为很多回复似乎都在暗示我实际上并不知道如何在bash中进行测试。正如我上面提到的,我知道我可以手动测试函数中的每个命令,return 或根据需要处理错误。我也知道我可以 set -e
并导致我的 shell 会话因错误而终止。但我要问的是:如果该函数中的任何命令处于 return 非零状态,是否有一种方法可以让函数停止继续执行——无需显式测试?
如果您的函数不需要设置任何全局变量,您可以让函数创建一个子shell,其中使用了set -e
。 subshell 将退出,而不是调用 has_error
的 shell。
has_error () ( # "(", not "{"
set -e
true
echo "Ok..."
false
echo "Shouldn't be here!"
)
@chepner 的回答对我有帮助,但不完整。
如果要检查函数 return 代码,请不要将函数调用放在 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
我有一个像这样的假 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 将终止。我想要的是简单地拥有它 return 并将退出状态设置为 1。我可以通过在命令之间放置 &&
或在每一行后缀 || return 1
来做到这一点,但它们都不是很优雅。执行此操作的正确方法是什么?
编辑:
看来我说得不够清楚,因为很多回复似乎都在暗示我实际上并不知道如何在bash中进行测试。正如我上面提到的,我知道我可以手动测试函数中的每个命令,return 或根据需要处理错误。我也知道我可以 set -e
并导致我的 shell 会话因错误而终止。但我要问的是:如果该函数中的任何命令处于 return 非零状态,是否有一种方法可以让函数停止继续执行——无需显式测试?
如果您的函数不需要设置任何全局变量,您可以让函数创建一个子shell,其中使用了set -e
。 subshell 将退出,而不是调用 has_error
的 shell。
has_error () ( # "(", not "{"
set -e
true
echo "Ok..."
false
echo "Shouldn't be here!"
)
@chepner 的回答对我有帮助,但不完整。
如果要检查函数 return 代码,请不要将函数调用放在 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