当我创建要在脚本退出时删除的临时文件时,通常会在EXIT上设置陷阱。像这样的东西:
function cleanup ()
{
if [[ -d "$mytmp" ]]; then rm -rf --one-file-system -- "$mytmp" || :; fi
}
trap cleanup EXIT
...
我最近偶然发现了另一个脚本,该脚本的设置略有不同。它在EXIT上设置了陷阱,但在实际信号上也设置了 ,即:
function cleanup () { : ... same as above ...; }
trap cleanup EXIT HUP INT QUIT TERM
我在问清单中的其他信号是多余的还是严格的改进。是否有某些版本的bash不能在某些信号上运行EXIT陷阱?
以我的经验,即使没有在INT上显式捕获,CTRL-C(SIGINT)脚本通常也会调用EXIT陷阱。也许我一直很幸运,只是一个孩子先被SIGINT杀死,然后父脚本退出并出现错误(由于set -e
或其他原因)。
就正确性和可移植性而言,最好的清理习惯是什么?
更新:
这与我的问题有关,但是注释中指出的一项可移植性改进是使用缩写形式cleanup () { :; }
而不是function cleanup () { :; }
定义函数。谢谢!
答案 0 :(得分:0)
我最近在较旧的bash版本(3.2,2007年在MacOS上使用的版本)上对此进行了测试,甚至在那里也没有用。
但是,有人可能会认为它的存在是为了提高可读性,以向读者发出信号:“任何信号都没有特殊的行为,只需清理并退出即可。”,因为如果您有两个trap
语句指同一信号,最后执行的信号将被覆盖。