Bash 基于shell脚本中错误的条件操作
我有一个bash脚本,它是一个用于上传的目录。当它在目录中看到xml文件时。脚本获取文件并调用java命令行程序,该程序使用xslt转换文件。如果脚本或java命令行程序在处理过程中抛出错误,我希望将文件移动到不同的目录错误。然后把错误发电子邮件给我 我本来打算 exec 2>邮件-s“语句错误处理”Bash 基于shell脚本中错误的条件操作,bash,shell,Bash,Shell,我有一个bash脚本,它是一个用于上传的目录。当它在目录中看到xml文件时。脚本获取文件并调用java命令行程序,该程序使用xslt转换文件。如果脚本或java命令行程序在处理过程中抛出错误,我希望将文件移动到不同的目录错误。然后把错误发电子邮件给我 我本来打算 exec 2>邮件-s“语句错误处理” 在脚本顶部捕获stderr的输出。但这看起来不太优雅,也不会移动有问题的文件 您可以在bash语句中捕获错误条件,该语句返回未内联处理的非零条件: trap func ERR 然后在func中定
在脚本顶部捕获stderr的输出。但这看起来不太优雅,也不会移动有问题的文件 您可以在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
您可以在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
你需要两样东西。首先,确定程序是否失败。这通常由程序主函数的返回值知道。如果程序返回与0不同的值,则存在错误 在任何情况下,您必须做的第二件事是将标准错误输出捕获到一个文件中,以便稍后将其发送。因此:
if ! program inputfile 2> errorfile ; then
mv inputfile error_directory
mail -s "error" < errorfile
fi
rm errorfile
但是,您必须检查您的程序是否遵循此约定来发出错误信号。这里需要两件事。首先,确定程序是否失败。这通常由程序主函数的返回值知道。如果程序返回与0不同的值,则存在错误 在任何情况下,您必须做的第二件事是将标准错误输出捕获到一个文件中,以便稍后将其发送。因此:
if ! program inputfile 2> errorfile ; then
mv inputfile error_directory
mail -s "error" < errorfile
fi
rm errorfile
不过,您必须检查您的程序是否遵循此约定来发出错误信号。此处的测试不应是文字测试。该程序应在启动后直接调用!关键字,不涉及测试内置实用程序。此处的测试不应为文本。该程序应在启动后直接调用!关键字,则不涉及测试内置实用程序。如果只有一个命令要检查,则ERR trap或set-e似乎并不真正有用-如果只有一个命令需要检查,那么errtrap或set-e看起来并没有什么好处-