如何正确处理bash脚本中的错误?

时间:2014-10-15 06:18:21

标签: bash error-handling

我在bash脚本之上使用set -e选项来停止执行任何错误。但我也可以在echo命令上使用-e,如下所示:

echo -e "Some text".

我有两个问题:

  1. 如何正确处理bash脚本中的错误?
  2. -e选项在echo命令中的含义是什么?

3 个答案:

答案 0 :(得分:3)

"正确"处理bash错误的方法取决于具体情况和你想要完成的事情。

在某些情况下,if描述的barmar语句方法是处理问题的最佳方法。

set -e

的变幻莫测 一旦出现未被捕获的错误,

set -e将默默地停止脚本。它不会打印任何消息。所以,如果你想知道为什么或什么行导致脚本失败,你会感到沮丧。

此外,正如Greg's FAQ所述,set -e的行为从一个bash版本到另一个bash版本各不相同,可能会非常令人惊讶。

总之,set -e的用途有限。

A die函数

在其他情况下,当命令失败时,您希望脚本立即退出并显示消息。在perl中,die函数提供了一种方便的方法。可以使用函数在shell中模拟此功能:

die () {
    echo "ERROR: $*. Aborting." >&2
    exit 1
}

然后可以轻松地将对die的调用附加到必须成功的命令,否则必须停止脚本。例如:

cp file1 dir/ || die "Failed to cp file1 to dir."

这里,由于使用了bash的OR控制运算符||die命令只有在之前的命令失败时才会执行

答案 1 :(得分:2)

如果您想处理错误而不是在脚本发生时停止,请使用if

if ! some_command 
then 
    # Do whatever you want here, for instance...
    echo some_command got an error
fi

echo -e无关。此-e选项告诉echo命令在其参数中处理转义序列。有关转义序列列表,请参阅man echo

答案 2 :(得分:1)

处理错误的一种方法是在脚本开始时在shebang中使用-e并使用trap ERR处理程序,如下所示:

#!/bin/bash -e

errHandler () {
   d=$(date '+%D %T :: ')
   echo "$d Error, Exiting..." >&2
   # can do more things like print to a log file etc or some cleanup
   exit 1
}

trap errHandler ERR

现在,只有在您的脚本中发生错误时,此函数errHandler才会被称为