如何“捕获”非零退出代码,尽管“set -e”然后回显错误代码

the*_*ole 6 linux bash

我有脚本

#!/bin/bash

set -e

if [[ ! $(asd) ]]; then
   echo "caught command failure with exit code ${?}"
fi

echo "end of script" 
Run Code Online (Sandbox Code Playgroud)

脚本的目的是终止任何非零命令退出代码的执行,set -e除非命令被“捕获”(来自 Java),就像错误命令的情况一样asd

if [[ ! $(asd) ]]; then
   echo "caught command failure with exit code ${?}"
fi
Run Code Online (Sandbox Code Playgroud)

但是,虽然我“捕获”错误并end of script打印到终端,但错误代码是0

echo "caught command failure with exit code ${?}"
Run Code Online (Sandbox Code Playgroud)

所以我的问题是如何“捕获”错误的命令,并打印exit code该命令的?

编辑

我重构了脚本,结果相同,退出代码仍然是0

#!/bin/bash

set -e

if ! asd ; then
   echo "caught command failure with exit code ${?}"
fi

echo "end of script"
Run Code Online (Sandbox Code Playgroud)

Wil*_*ell 5

只需使用短路:

asd || echo "asd exited with $?" >&2
Run Code Online (Sandbox Code Playgroud)

或者:

if asd; then 
    :
else
    echo asd failed with status $? >&2
fi
Run Code Online (Sandbox Code Playgroud)

你不能这样做if ! asd,因为!否定状态,$?如果asd退出非零则设置为 0,$?如果退出 0,则设置为asd1。

但请注意,无论哪种情况,最佳实践都是简单地调用asd. 如果失败,它应该发出一条描述性错误消息,而您的附加错误消息只是不必要的冗长,具有边际效益。如果asd没有发出有用的错误消息,您应该修复它。