为什么命令错误但退出代码为 0?

为什么命令错误但退出代码为 0?

我正在 bash 脚本中测试不同的东西,但遇到了一个问题,我无法得到解释。

我故意写了一个错误的命令,以获得与 0 不同的退出代码,但不知何故,我似乎仍然得到 0。

我正在执行的代码是:

USER_NAME=$(id -uns)

if [[ ${?} -ne 0 ]]
then
    echo "Your command failed to execute with exit code ${?}"
    exit 1
fi
echo "Your username is ${USER_NAME}"

我的代码的输出是:

id: 未知选项 -- s

尝试“id --help”以获取更多信息。

您的命令执行失败,退出代码为 0

您的用户名是

我猜想它在某种程度上显示了 echo 命令的退出代码?即使如此,如果退出代码为0,为什么会进入if语句呢?

如果是这样,那么我怎样才能让它显示应该显示的实际退出代码?

答案1

在您的代码中,在if语句中,获取的退出状态打印是测试的退出状态[[ ${?} -ne 0 ]]。该值$?始终是最近执行的命令的退出状态,并且测试算作一个命令,至少在将 的值设置$?为其结果方面是如此。

如果要打印 的退出状态id,请将其分配给一个值不会改变的变量,

id -uns
err=$?

if [[ $err -ne 0 ]]; then
    printf 'id failed with code %d\n' "$err" >&2
    exit 1
fi

相关内容