sigspec 是 0 EXIT 或 SIGEXIT 或 exit 吗?

sigspec 是 0 EXIT 或 SIGEXIT 或 exit 吗?

我需要编写一个陷阱来跟踪进程何时退出(除其他外)并删除临时文件。我更喜欢使用 sigspec 而不是数字以获得更好的代码可读性,相关片段是

trap 'rm "$temp"' 0 SIGHUP SIGTERM

sigspec 应该0exit,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 采取了陷阱操作,但没有实际信号——它只是知道它已经停止处理脚本。

相关内容