2

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

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

我正在寻找一种不仅可以基于 ERR 还可以基于返回码的陷阱。vms 的好处是你可以在警告上做 vms 上的退出状态 0 和错误退出状态 2。所以我知道我可以做陷阱 ... ERR 但我想要一些可以捕获退出状态 1 或 2 的东西具体来说。

4

2 回答 2

2

只是要清楚“正常”的事情要做:

set -e
trap 'echo "Failed"' ERR

echo "Start"
false
echo "End"

在此示例中,set -e如果任何返回非 0(在运行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"
于 2013-08-20T13:43:41.003 回答
-1

简单的:

if yourcommandhere; then
    echo 'No error'
else
    echo "Error! Exit status of the last command is $?"
fi
于 2013-08-20T10:15:42.663 回答