请记住,选择的答案是bashism
,这意味着解决方案为
trap "{ rm -f $LOCKFILE }" EXIT
dash
只能在 bash 中工作(如果 shell 是或 classic ,它不会捕获 Ctrl+c sh
),但如果你想要兼容性,那么你仍然需要枚举你想要捕获的所有信号。
另请记住,当脚本退出时,始终执行信号“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
时运行一些代码,如果需要,您可以在实际 EXIT 信号处运行一些代码(退出的最后阶段)