好的,所以我在工作中看到了一个使用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的东西具体
答案 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