如果bash中的块错误处理

时间:2016-08-13 19:34:50

标签: bash

我在bash中有多行代码的if语句,有时在运行脚本的任何代码行抛出错误消息时,请你告诉我如何处理错误。我只想抓住错误并显示一些错误消息来识别,而且我也不想停止正在运行的脚本,因为它有7800行代码我想继续下一步。如果循环,每个测试步骤都在内部。我想知道如何处理具有一系列代码行的if循环中的错误。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您基本上可以选择在每个命令后检查错误代码。特别是对于失败的命令。这与检查C库函数的返回码非常相似。它通过错误处理来淹没代码,因此最好在可重用的函数中执行它。

您可以通过检查$?错误代码变量来执行此操作,但更常见的是您使用shell评估0退出代码作为布尔值true的事实。

因此,对于单个命令,可以使用||(或)列表运算符来完成,该运算符仅在第一个返回false(也就是非零退出代码,即错误)时评估第二个术语(shell函数):

function die { echo "$1" 1>&2 ; exit 1; }

mkdir ./bla || die "Cannot create directory ./bla errno=$?"

bash(shell)通常在发生错误后继续进行,这可能会产生非常严重的情况。例如,在这种情况下,如果临时目录不存在,脚本将销毁当前目录的内容:

cd /home/user/temp
rm -rf *

通过设置" set -e"来关闭此行为是一件好事。

set -e
cd /home/user/temp
rm -rf *

或者具体说明依赖关系(使用&&和list运算符而不是换行符或;):

# execute rm only if cd was sucessful
cd /home/user/temp && rm -rf *

所以通常一个好主意(caveat)打开"退出错误"模式。 在这种情况下,您希望允许失败的命令需要像以下一样保护:

set -e
cd /home/user/temp
rm -rf * || true # ignore failures

最后,使用完成陷阱处理程序完成对代码块的更复杂的错误处理。它在程序退出时执行,您可以使用它来打印错误。这可以与其他编程语言中的try / catch进行比较,但在某些定义的条件下它是更低级别的背景解释:

function errorhandler
  { echo "Unexpected error while cleaning dir: $1 - $2"; exit 1 }

# try-start - capture errors
trap "errorhandler $LINENO $BASH_COMMAND" ERR

cd /home/user/temp
rm * || true # dont trigger error handler here

# try-end - stop capturing errors
trap - ERR

陷阱(trap "cleanup_function" EXIT)也是typically used(除了信号处理),用于在程序块的(意外)结束时展开/停止更改和临时资源。