Bash:如何捕获错误原因?

时间:2012-08-24 02:51:00

标签: bash error-handling bash-trap

我想在shell脚本中捕获错误,然后针对错误的原因生成一些报告:

trap 'error_handler' ERR

在我的error_handler函数中,我想说明为什么ERR信号被捕获的原因(例如“权限被拒绝”,“无法找到远程主机”等)。

这可能吗?

2 个答案:

答案 0 :(得分:3)

不是真的。您保证在错误处理程序中可用的唯一信息是在ERR中触发$?的进程的退出状态。您甚至不知道进程的名称或进程ID。我认为错误处理程序在退出脚本之前用于通用清理,因此哪个进程具有非零退出状态或原因并不重要。

最好在发生错误时立即报告或处理错误,如下所示:

rm foo || { echo "File removal failed"; }

请注意,大多数命令会将自己的失败通知打印到标准错误。

答案 1 :(得分:1)

我认为错误陷阱处理程序不会收到有关导致它运行的精确错误的任何信息。您可以从失败的命令中获取退出代码,但是当陷阱运行时,您甚至不知道哪个命令失败。

您可以尝试编写一个简单的C程序来获取perror或其他类似的最新系统错误。

...更新:它不起作用;回想起来,原因很明显。我将把它留在这里为后代发现。 / - :

vnix$ cat perror.c
#include <stdio.h>
#include <errno.h>

int main (int argc, char **argv)
{
  perror("");
}

vnix$ gcc perror.c

vnix$ touch /fnord
touch: cannot touch `/fnord': Permission denied

vnix$ ./a.out
Success