在bash中是否有关于错误/警告类型的交易?

时间:2013-07-10 02:56:43

标签: bash scripting

好的,所以我在工作中看到了一个使用DCL脚本语言在OpenVMS上的脚本,他们有办法捕获所有警告或错误等...

这里有一个关于它的页面。 http://h71000.www7.hp.com/doc/84final/9996/9996pro_150.html基本上是ON warning THEN GOTO sendfailemail或类似的东西。我想知道没有使用一堆if语句是否有办法在bash中做这样的事情?

我正在寻找可以做陷阱的东西,不仅仅是基于ERR而是返回代码。关于vms的好处是你可以做警告哪些在vms上是退出状态0 vs error是退出状态2.所以我知道我可以做陷阱... ERR但是我想要一些可以捕获退出状态1或2的东西具体

2 个答案:

答案 0 :(得分:2)

要明确要做的“正常”事情:

set -e
trap 'echo "Failed"' ERR

echo "Start"
false
echo "End"

在此示例中,如果任何内容返回非0(运行set -e陷阱之后),ERR将导致脚本退出。在unix中,非0表示“错误”。 “警告”没有返回值。因此,如果您为脚本创建特殊的返回值,则无法正确地适应unix命令管道。你真的,真的需要在成功时返回0,其他任何事情都应该是某种失败。

那就是说,让我们说这里有一些非常好的理由,你有一个具有特殊回报值的脚本生态系统。你可以肯定这样做。只需抓住ERR并检查$?(请注意我已移除set -e,因为您exit手动):

trap 'if [ $? == 2 ]; then echo "Failed"; exit 2; fi' ERR

echo "Start"
false
echo "End"

这不会失败,因为false会返回1.

如果你只需要在一些地方需要它并且想要明确,你可以创建自己的包装器函数来管理它而无需太多额外的编码。

function run() {
  $*
  if [ $? == 2 ]; then
    echo "Failure"
    exit 2
  fi
}

run echo Start
run true
run false
run echo "End"

答案 1 :(得分:-1)

简单:

if yourcommandhere; then
    echo 'No error'
else
    echo "Error! Exit status of the last command is $?"
fi