使用 POSIX 退出陷阱

Joe*_*Joe 6 shell signals posix trap

我有一个在 Bash 中编写的脚本,我正在尝试将其修改为符合 POSIX 标准。我已经设法让一切正常工作,除了当进程以 killall、CTRL+C 或关闭终端终止时,我无法触发 EXIT 陷阱 - 就像在 Bash 中所做的那样。这是我的退出陷阱:

#!/bin/sh

TMP=$(mktemp /tmp/countdown.XXXXX)
trap 'rm -rf $TMP' EXIT
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 6

在严格的 POSIX shell 中,在EXITshell 由于执行exit或执行脚本中的最后一个命令而退出之前,会评估陷阱。如果 shell 由于信号而退出,则不会执行它。

你想 catch Ctrl+C,你就必须捕获INT(“中断”信号)。如果关闭终端向脚本发送HUP(“挂断”)信号,您也必须捕获它。

trap 'rm -rf "$TMP"; trap - EXIT; exit' EXIT INT HUP
Run Code Online (Sandbox Code Playgroud)

您可能还想捕获TERM默认情况下发送的通用“终止”信号kill

上面的陷阱明确地重置了EXIT陷阱,以便在脚本由于接收到列出的信号之一而退出时不会再次调用它。