我想在shell脚本中捕获错误,然后针对错误的原因生成一些报告:
trap 'error_handler' ERR
在我的error_handler
函数中,我想说明为什么ERR
信号被捕获的原因(例如“权限被拒绝”,“无法找到远程主机”等)。
这可能吗?
答案 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