4

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

trap 'error_handler' ERR

在我的error_handler函数中,我想给出ERR信号被捕获的原因(例如“权限被拒绝”、“找不到远程主机”等)。

这可能吗?

4

2 回答 2

3

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

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

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

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

于 2012-08-24T03:58:09.913 回答
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
于 2012-08-24T04:13:34.140 回答