非流行等同于“陷阱ERR”

dja*_*dja 2 bash shell

我正在尝试从shell脚本中删除一些bashisms。

我无法弄清楚如何复制“ trap ERR”:ERR不是信号,也不在标准中,而是常见的bashism(请参阅例如LDP指南)。

如何trap ERR在符合标准的/bin/sh脚本中进行复制?

che*_*ner 5

您可以使用的组合set -etrap ... EXIT

#!/bin/sh

set -e

err_handler () {
    [ $? -eq 0 ] && exit
    # Code for non-zero exit status here
}

trap err_handler EXIT
Run Code Online (Sandbox Code Playgroud)

set -e每当不受保护的命令的退出状态为非零时,它将导致脚本退出。当脚本退出时,错误处理程序将被无条件调用,但是如果当前退出状态为0,则可以在该处理程序内部简单地退出,即我们到达该错误处理程序而没有发生任何错误。

所谓“不受保护的”命令,是指不在合理预期会出现非零退出状态(例如在if语句条件下)的上下文中不运行的命令。