请记住,选择的答案是bashism
,这意味着解决方案是
trap "{ rm -f $LOCKFILE }" EXIT
只能在bash中工作(如果shell是dash
或者classic sh
,它将无法捕获Ctrl + c ),但是如果您希望兼容,则仍然需要枚举所有要捕获的信号。
还请记住,当脚本退出时,始终会执行信号“ 0”(又名EXIT)的陷阱,从而导致trap
命令的两次执行。
就是说如果有EXIT信号,则不将所有信号堆叠在一行中的原因。
为了更好地理解它,请查看以下脚本,该脚本无需更改即可在不同系统上运行:
#!/bin/sh
on_exit() {
echo 'Cleaning up...(remove tmp files, etc)'
}
on_preExit() {
echo
echo 'Exiting...' # Runs just before actual exit,
# shell will execute EXIT(0) after finishing this function
# that we hook also in on_exit function
exit 2
}
trap on_exit EXIT # EXIT = 0
trap on_preExit HUP INT QUIT TERM STOP PWR # 1 2 3 15 30
sleep 3 # some actual code...
exit
该解决方案将为您提供更多控制权,因为您可以在最终退出(preExit
功能)之前,在实际信号出现时运行一些代码,如果需要,您可以在实际退出信号(退出的最后阶段)运行一些代码。