我有剧本
#!/bin/bash
set -e
if [[ ! $(asd) ]]; then
echo "caught command failure with exit code ${?}"
fi
echo "end of script"
脚本的目的是用set -e
终止对任何非零命令退出代码的执行,除非命令是“抓到的”(来自Java),例如错误的命令asd
if [[ ! $(asd) ]]; then
echo "caught command failure with exit code ${?}"
fi
但是,尽管我“捕获”了错误并且end of script
打印到终端,但错误代码是0
echo "caught command failure with exit code ${?}"
所以我的问题是我如何才能“捕获”一个错误的命令,并同时打印该命令的exit code
?
修改
我已将脚本重构为相同结果,退出代码仍为0
#!/bin/bash
set -e
if ! asd ; then
echo "caught command failure with exit code ${?}"
fi
echo "end of script"
答案 0 :(得分:1)
只需短路:
asd || echo "asd exited with $?" >&2
答案 1 :(得分:1)
如何“捕获”错误的命令,并打印该命令的退出代码?
我经常这样做:
asd && ret=$? || ret=$?
echo asd exited with $ret
整个表达式的退出状态为0
,因此set -e
不会退出。如果asd
成功,则第一个ret=$?
会在$?
设置为0
的情况下执行,如果失败,则第一个ret=$?
会被省略,第二个会执行
有时候我这样做:
ret=0
asd || ret=$?
echo asd exited with $ret
它的工作原理相同,我忘记了应该先使用&&
还是||
。您也可以这样做:
if asd; then
ret=0
else
ret=$?
fi
echo asd exited with $ret