Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 基于shell脚本中错误的条件操作_Bash_Shell - Fatal编程技术网

Bash 基于shell脚本中错误的条件操作

Bash 基于shell脚本中错误的条件操作,bash,shell,Bash,Shell,我有一个bash脚本,它是一个用于上传的目录。当它在目录中看到xml文件时。脚本获取文件并调用java命令行程序,该程序使用xslt转换文件。如果脚本或java命令行程序在处理过程中抛出错误,我希望将文件移动到不同的目录错误。然后把错误发电子邮件给我 我本来打算 exec 2>邮件-s“语句错误处理” 在脚本顶部捕获stderr的输出。但这看起来不太优雅,也不会移动有问题的文件 您可以在bash语句中捕获错误条件,该语句返回未内联处理的非零条件: trap func ERR 然后在func中定

我有一个bash脚本,它是一个用于上传的目录。当它在目录中看到xml文件时。脚本获取文件并调用java命令行程序,该程序使用xslt转换文件。如果脚本或java命令行程序在处理过程中抛出错误,我希望将文件移动到不同的目录错误。然后把错误发电子邮件给我

我本来打算 exec 2>邮件-s“语句错误处理”


在脚本顶部捕获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看起来并没有什么好处-