【问题标题】:"DIE" signal handler for bashbash 的“DIE”信号处理程序
【发布时间】:2013-02-08 21:05:54
【问题描述】:

在 Perl 中,您可以编写 $SIG{__DIE__} 处理程序以在程序因错误退出时执行代码。 bash 是否提供类似的功能?

这就是我想要做的:我有一个 bash 脚本,它创建一个新目录并调用几个命令,这些命令又用数据文件填充新目录。我正在使用set -e,以便在任何命令失败时脚本将立即终止。如果发生故障,我希望脚本删除它创建的目录。如果脚本成功完成,那么新的输出当然应该保留。

bash 是否提供了一个 DIE 信号处理程序,或任何可以让我这样做的类似功能?

【问题讨论】:

    标签: perl bash error-handling


    【解决方案1】:

    由于您使用的是set -e,因此您可以安装ERR 处理程序:

    trap errfunc ERR
    

    如果任何命令以非零退出代码退出,则将调用errfunc(并且因为您使用的是set -e,这将终止脚本)。

    您也可以通过这种方式传递参数:

    trap 'errfunc $LINENO' ERR
    

    由于陷阱命令在错误点是eval'd,因此此陷阱会将失败命令的行号传递给errfunc

    【讨论】:

    • 哇,感谢您的快速响应!我忘了问:有没有办法将参数传递给处理函数?
    • 是的,你可以随时写trap 'errfunc arg' ERR
    • 这会在您定义处理程序时修复参数。如果要在调用处理程序时传递有关程序当前状态的信息,则必须从环境中读取。
    • @chepner:实际上,它并不能解决问题。当陷阱执行时,陷阱命令是eval'd。因此,写trap 'errfunc $LINENO' ERR 是获取失败命令的行号的一种非常有效的方法。
    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 2017-11-13
    • 2013-12-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多