我有脚本
#!/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)
只需使用短路:
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,则设置为asd
1。
但请注意,无论哪种情况,最佳实践都是简单地调用asd
. 如果失败,它应该发出一条描述性错误消息,而您的附加错误消息只是不必要的冗长,具有边际效益。如果asd
没有发出有用的错误消息,您应该修复它。
归档时间: |
|
查看次数: |
2875 次 |
最近记录: |