我有一个bash脚本,它监视上传的目录。当它在目录中看到一个xml文件时。脚本获取文件并调用一个使用xslt转换文件的java命令行程序。如果脚本或java命令行程序在处理期间引发错误,我想将文件mv到不同的目录(错误)。然后给我发电子邮件错误。基于shell脚本错误的条件操作
我打算把 EXEC 2>邮件-S“语句错误处理”
的脚本来捕获输出标准错误的顶部。但是这看起来不太优雅,并且不会移动有问题的文件。
我有一个bash脚本,它监视上传的目录。当它在目录中看到一个xml文件时。脚本获取文件并调用一个使用xslt转换文件的java命令行程序。如果脚本或java命令行程序在处理期间引发错误,我想将文件mv到不同的目录(错误)。然后给我发电子邮件错误。基于shell脚本错误的条件操作
我打算把 EXEC 2>邮件-S“语句错误处理”
的脚本来捕获输出标准错误的顶部。但是这看起来不太优雅,并且不会移动有问题的文件。
你可以在bash陷阱错误条件(即返回非零条件未办理任何内嵌语句):
trap func ERR
然后在FUNC(函数定义),你可以做任何你需要清理。
例如:
#!/bin/bash
function foo() {
echo "cleaning up"
}
trap foo ERR
echo "about to execute false"
false
echo "exiting"
运行,这将导致:
./foo.sh
about to execute false
cleaning up
exiting
你需要两样东西在这里。首先,确定程序是否失败。这通常由程序的main()
函数的返回值知道。如果该程序返回任何不同于0的值,则会出现错误。
在任何情况下,您必须做的第二件事是将标准错误输出捕获到文件中以便稍后将其发送。所以:
if ! program inputfile 2> errorfile ; then
mv inputfile error_directory
mail -s "error" < errorfile
fi
rm errorfile
但是,如果你的程序遵循这个约定来表示错误,你必须检查。
'test'不应该是字面值。该程序应该在'!'关键字后面直接调用,不涉及'test'内建工具。 – jilles 2010-10-22 22:13:47
糟糕。你是对的。纠正。谢谢! – 2010-10-22 22:34:54
如果只有一个命令检查,'ERR'陷阱或'set -e'似乎并不有益;-) – jilles 2010-10-22 22:21:05