Bash:如何捕获 set -e,但不退出

9

我的脚本的第一条指令是:

set -e

当错误发生时,脚本会中止。我想捕捉这种情况以显示一个信息提示,但我不想在脚本退出时显示该消息;仅在set -e触发中止时才显示。是否有可能捕捉这种情况?

这个:

set -e

function mytrap {
    echo "Abnormal termination!"
}

trap mytrap EXIT

error

echo "Normal termination"

在任何退出时(无论是否发生错误),都会调用它,这不是我想要的。

在正常退出点调用一个函数,使其设置一个标志以指示正常终止。您的陷阱函数可以检查此值以区分正常和异常终止。 - codeforester
@codeforester 是的,我现在正在考虑这些术语。虽然有点麻烦。 - blueFast
1个回答

7

不要在EXIT事件上使用trap,而是在ERR事件上使用:

trap mytrap ERR

完整代码:

set -e

function mytrap {
   echo "Abnormal termination!"
}

trap mytrap ERR

(($#)) && error

echo "Normal termination"

现在运行它以生成错误:
bash sete.sh 123
sete.sh: line 9: error: command not found
Abnormal termination!

这里是正常退出:

bash sete.sh
Normal termination

2
我之前不知道"ERR"陷阱。@anubhava解释得很好! - codeforester
1
谢谢你,anubhava。这不是我第一次看到你在bash方面的熟练程度了。你有关于高级bash编程的任何技巧吗?链接或书籍都可以! - blueFast
1
(($#)) 表示 $# > 0,也就是说如果脚本传递了参数。(($#)) && error 表示如果脚本传递了参数,则执行 error。关于您之前的评论:感谢鼓励的话语。我在工作中学到了大部分知识,更重要的是通过阅读 Stackoverflow 上的 bash 专家的答案学到了更多。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接