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

时间:2019-07-24 19:12:06

标签: linux bash

我有剧本

#!/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"

2 个答案:

答案 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