我有bash中有多行代码的语句,有时候在运行脚本时会出现任何代码行出现错误信息,因此请让我知道如何处理错误。我只想捕捉错误并显示一些错误消息来识别,并且我也不想停止正在运行的脚本,因为它有7800行代码,我想继续执行下一步。每个测试步骤都在循环内部。我想知道如何处理具有一系列代码行的if循环中的错误。如果bash中的块错误处理
非常感谢您的帮助。
我有bash中有多行代码的语句,有时候在运行脚本时会出现任何代码行出现错误信息,因此请让我知道如何处理错误。我只想捕捉错误并显示一些错误消息来识别,并且我也不想停止正在运行的脚本,因为它有7800行代码,我想继续执行下一步。每个测试步骤都在循环内部。我想知道如何处理具有一系列代码行的if循环中的错误。如果bash中的块错误处理
非常感谢您的帮助。
基本上可以选择在每个命令之后检查错误代码。特别是对于失败的命令。这与检查C库函数的返回码非常相似。它将错误处理代码放在代码中,所以最好在可重用函数中完成。
您可以通过检查$?
错误代码变量来做到这一点,但更常见的情况是您使用shell将0退出代码评估为布尔值true的事实。
因此对于单命令,它可以用||
(或)列表,其评价的第二项(壳函数)运算完成仅当第一返回false(又名非零退出代码又名错误):
function die { echo "$1" 1>&2 ; exit 1; }
mkdir ./bla || die "Cannot create directory ./bla errno=$?"
bash(shell)通常会在出现错误后继续执行,这可能会产生相当大的情况。例如,在这种情况下,如果temp目录不存在,该脚本将detroy当前目录的内容:
cd /home/user/temp
rm -rf *
因此,它是通过设置关闭该行为是件好事“设置-e”。
set -e
cd /home/user/temp
rm -rf *
还是要具体说明的依赖关系(通过使用&&
和列表操作符,而不是换行或;
):
# 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相比,但它是在一定规定的条件更低水平的背景解释:放卷/ ceaning变化
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(信号处理旁)和程序块(意外)末端的临时资源。
请看看[如何创建最小,完整和可验证的示例](http://stackoverflow.com/help/mcve)。 – Cyrus
首先,Bash没有任何“抛出”错误的概念,所以你必须误解发生了什么。为了解决你的问题,你必须弄清楚这些命令真的在做什么。其次,* 7800行* ??这是一个非常糟糕的迹象。这个脚本可能是疯了,可能需要大量的修改。 – ruakh
取决于错误。有很多错误会导致继续存在危险。我建议使用7800行代码的脚本是不好的设计,它应该至少分解成可以隔离和测试的函数。更有可能它应该被拆分成不同的脚本,或者你使用的语言不对。 – cdarke