用mktemp生成临时文件并配合trap自动清理,可避免命名冲突、权限泄露和残留问题:temp_file=$(mktemp)创建唯一文件,temp_dir=$(mktemp -d)创建目录,需用trap cleanup exit确保退出时清理。

直接用 mktemp 生成临时文件,配合 trap 自动清理,就能避免命名冲突、权限泄露和残留问题。
基础用法:生成即用的唯一文件
不加参数时,mktemp 默认在 /tmp(或 $TMPDIR)下创建带随机后缀的文件,权限为 u+rw(仅属主可读写),其他用户无法访问:
-
temp_file=$(mktemp)—— 返回类似/tmp/tmp.aBcDeFgH的路径 -
temp_dir=$(mktemp -d)—— 创建临时目录,权限为u+rwx - 模板必须含至少三个连续
X,如mktemp /var/tmp/myapp.XXXXXX
脚本中必须做的两件事:捕获路径 + 自动清理
临时文件一旦创建,就必须在脚本退出前删除。推荐用 trap 注册清理函数,确保无论正常退出还是被信号中断都能执行:
- 用变量保存
mktemp输出,后续所有操作都通过该变量引用 - 定义清理函数,用
rm -f删除文件、rm -rf删除目录 - 用
trap cleanup EXIT绑定到脚本生命周期末尾
增强安全性与可维护性的建议
避免默认行为带来的隐性风险:
- 显式指定
--tmpdir=/tmp或--tmpdir=/var/tmp,不依赖环境变量波动 - 添加
--suffix=.log或--suffix=.json提高可读性,不影响唯一性 - 不用
-u(dry-run)模式——它不真正创建文件,易引发竞态条件,已被标记为不安全 - 不手写
temp_$$或$(date +%s%N)类命名——无法防冲突,且权限不可控
一个完整可用的脚本片段
以下代码可直接复用,已包含错误检查和权限隔离:
#!/bin/bash
# 创建临时文件和目录
temp_file=$(mktemp --tmpdir=/tmp --suffix=.out) || { echo "无法创建临时文件"; exit 1; }
temp_dir=$(mktemp -d --tmpdir=/tmp) || { echo "无法创建临时目录"; exit 1; }
<h1>清理函数</h1><p>cleanup() {
rm -f "$temp_file"
rm -rf "$temp_dir"
}
trap cleanup EXIT</p><h1>使用示例</h1><p>echo "处理中..." > "$temp_file"
cp config.conf "$temp_dir/"</p><h1>后续逻辑...</h1>











