从bash脚本中启动的命令中检索错误代码

时间:2013-03-13 06:54:19

标签: bash error-handling

好吧我对bash脚本[高级的东西]有点新意,我需要一些帮助。我甚至不知道如何说出这个,所以我只是解释我在做什么以及我需要知道什么。 在我的脚本中我运行./configure并且我需要能够捕获配置中是否有错误并在bash脚本中做出相应的反应。

代码是:

function dobuild {
echo -e "\e[1;35;40mExecuting Bootstrap and Configure\e[0m"
cd /devel/xbmc
if [ $Debug = "1" ];
then
#either outputs to screen or nulls output
./bootstrap >/dev/null
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray  >/dev/null
else
./bootstrap
/usr/bin/auto-apt run ./configure --prefix=/usr --enable-gl --enable-vdpau --enable-crystalhd --enable-rtmp --enable-libbluray
fi
}

并说配置返回错误1或2如何捕获它并对其进行操作?

TIA

3 个答案:

答案 0 :(得分:2)

执行每个shell命令后,它的返回值是0到255之间的数字,在shell变量?中可用。您可以通过在$运算符前添加前缀来获取此变量的值。

你需要对?小心谨慎,因为它会被每个命令重置,甚至是测试。例如:

some_command
if (( $? != 0 ))
then
   echo "Error detected! $?" >&2
fi

提供:Error detected! 0因为?已被测试条件重置。最好将?存储在另一个变量中,如果您稍后再使用它,包括对其进行多次测试

要在bash中进行数值测试,请使用(( ... ))数字测试构造:

some_command
result=$?
if (( $result == 0 ))
then
   echo "it worked!"
elif (( $result == 1 ))
then
    echo "Error 1 detected!" >&2
elif (( $result == 2 ))
then
    echo "Error 2 detected!" >&2
else
    echo "Some other error was detected: $result" >&2
fi

或者使用case语句。

答案 1 :(得分:1)

执行命令后,返回的值存储在shell变量$?中。所以你必须将它与成功和失败的返回值相匹配

if [ $? == 1 ]
then
    #do something
else
    #do something else
fi

答案 2 :(得分:0)

关于$的其他答案?很好(虽然注意假设0以外的值而不是0 - 不同的命令。或者同一命令的不同版本可能会因不同的值而失败),但是如果你只需要立即采取行动或失败,你可以简化事情:

if command ; then
    # success code here
else
    # failure code here
fi

或者如果你只是想在失败时采取行动,这里有一个老shell的黑客攻击(冒号是一个空命令,但它满足then子句):

if command ; then : 
else
    # failure code here
fi

但是在像bash这样的现代shell中,这更好:

if ! command ; then   # use the ! (not) operator 
    # failure code here
fi

而且,如果你只需要做简单的事情,你可以使用“短路”操作符:

   command1 && command2_if_command1_succeeds
   command1 || command2_if_command1_fails

这些仅适用于单个命令,串联更多&&和||在大多数情况下,他们没有做你想象的事情,所以大多数人都避免这样做。但是,如果对它们进行分组,则可以执行多个命令:

   command1 && { command2; command3; command4; }

这可能很难阅读,所以如果你全部使用它,最好保持简单:

   command1 || { echo "Error, command1 failed!" >&2; exit 1; }