我看到很多可以执行的shell脚本:

trap cmd 0 1 2 3 13 15#退出HUP INT QUIT PIPE TERM

目前在我可以访问的每个shell中,除0以外的所有陷阱都是冗余的,如果简单指定陷阱,则在收到信号后将执行cmd:

陷阱cmd 0

后一种规格是否足够?或者某些 shell 是否需要指定其他信号?

最佳答案

我认为陷阱0在所有情况下都在脚本终止之前执行,因此对于清理功能(如删除临时文件等)很有用。其他信号可以进行专门的错误处理,但应终止脚本(即,调用导出)。

我相信您所描述的内容实际上将执行cmd两次。一次输入信号(例如SIGTERM),再一次退出(陷阱0)。

我相信执行此操作的正确方法如下所示(请参阅POSIX规范 trap ):

trap "rm tmpfile" 0
trap "exit 1" TERM HUP ...

这样可确保在脚本完成时删除临时文件,并允许您在信号上设置自定义退出状态。

注意:无论是否遇到信号,都会调用陷阱0。

如果您不关心设置退出状态,则陷阱0就足够了。

关于bash - 是否需要指定除EXIT以外的陷阱?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8122779/

10-12 15:33