我需要编写一个陷阱来跟踪进程何时退出(除其他外)并删除临时文件。我更喜欢使用 sigspec 而不是数字以获得更好的代码可读性,相关片段是
trap 'rm "$temp"' 0 SIGHUP SIGTERM
sigspec 应该0
是exit
,EXIT
还是SIGEXIT
?
答案1
Shell 命令语言、陷阱POSIX 规范读取
条件可以是 EXIT、0(相当于 EXIT)或使用符号名称指定的信号,不带 SIG 前缀,如<信号.h>XBD headers 中定义的 header;例如,HUP、INT、QUIT、TERM。实现可能允许带有 SIG 前缀的名称或忽略信号名称中的大小写作为扩展。为 SIGKILL 或 SIGSTOP 设置陷阱会产生未定义的结果。
重击允许信号以 SIG 为前缀,
信号名称不区分大小写,并且 SIG 前缀是可选的。如果 sigspec 为 EXIT (0),则在退出 shell 时执行命令 arg。
但由于 EXIT 没有信号(参见man 7 signal
或<信号.h>)即使在 Bash 中也不能使用 SIGEXIT。
答案2
去尝试一下。巴什会告诉你:
paul $ trap 'echo Foop' EXIT
paul $ trap 'echo Foop' SIGEXIT
bash: trap: SIGEXIT: invalid signal specification
paul $
“真实”信号名称可以带有或不带有 SIG... 部分。但信号 0 并不真正存在(并且没有名称):kill -0
检查 PID 是否存在,但不发送任何信号。 Bash 采取了陷阱操作,但没有实际信号——它只是知道它已经停止处理脚本。