技术与生活 / 一篇记录
临时文件的善后交给 trap
临时资源需要在成功和失败两条路径上都能释放。
脚本中间某一步失败时,普通写在末尾的清理语句未必还能执行。退出处理器能集中释放临时资源,让主要流程不必在每个错误分支重复清理代码。
从一个例子看起
以下示例使用 Bash,请在独立测试目录中理解输入、输出和退出码。
tmp=$(mktemp); trap 'rm -f -- "$tmp"' EXIT; printf 'demo\n' > "$tmp"
退出脚本后确认临时文件已被清理。
排查时再往前走一步
在成功和主动报错两条路径上分别测试,确认都只删除自己创建的文件。重要业务操作仍需有恢复方案,清理临时文件不能替代事务。
退出处理器应尽量简单,不依赖已被覆盖的变量。若还需保留原始错误状态,可以先保存退出码,再执行清理并返回该状态,避免清理动作的成功掩盖主要任务的失败。
trap 无法处理所有断电或强制终止场景,清理逻辑还应具备幂等性。
参考:Shell 文档。