即使命令错误,为什么退出代码为 0?

Teo*_*giu 0 shell bash shell-script exit-status

我正在 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}"
Run Code Online (Sandbox Code Playgroud)

我的代码的输出是:

id: 未知选项 -- s

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

您的命令无法执行,退出代码为 0

您的用户名是

我猜它以某种方式显示了 echo 命令的退出代码?即便如此,如果退出码为0,为什么会进入if语句呢?

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

Kus*_*nda 7

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

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

id -uns
err=$?

if [[ $err -ne 0 ]]; then
    printf 'id failed with code %d\n' "$err" >&2
    exit 1
fi
Run Code Online (Sandbox Code Playgroud)