bash的鲁棒性:什么是用于“退出时”清理例程的陷阱的正确且便携式的方法是什么?

时间:2019-06-14 19:24:15

标签: bash signals

当我创建要在脚本退出时删除的临时文件时,通常会在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 () { :; }定义函数。谢谢!

1 个答案:

答案 0 :(得分:0)

我最近在较旧的bash版本(3.2,2007年在MacOS上使用的版本)上对此进行了测试,甚至在那里也没有用。

但是,有人可能会认为它的存在是为了提高可读性,以向读者发出信号:“任何信号都没有特殊的行为,只需清理并退出即可。”,因为如果您有两个trap语句指同一信号,最后执行的信号将被覆盖。