bash set -e 无效

bash set -e 无效

我希望当库函数失败时,提供该库的 bash 应用程序被终止。

有人告诉我set -e这样做。

库文件

#!/bin/bash

function die
{
    echo "dying: $1"
    exit 1
}

function get_info
{
    die "oops an error"
}

应用程序

#!/bin/bash

set -e

source "lib.sh"

echo "info: $(get_info)"

echo "ok"

运行

$> bash app.sh
info: dying: oops an error
ok

die以 1 退出,因此app.shset -e应该被杀死,对吗?

为什么这不起作用?

答案1

我认为您使用它的方式令人困惑。问题是您不只是在调用get_info,而是将其结果用作另一个命令的一部分(echo此处)。该其他命令成功,因此错误条件永远不会触发退出 bash。如果您稍微扩展一下脚本,就会看到这一点:

echo "info: $(get_info)"
echo "ok"

v=$(get_info)
printf 'info2: %s\n' "$v"
printf 'ok2\n'

永远不会打印info2,因为它在变量赋值期间退出。

set -e确实很棘手,通常不推荐。您可以阅读更多相关信息这里这里

相关内容