shell脚本中用mktemp创建临时文件需避免硬编码路径、防止竞态条件并确保自动清理:先用tmpfile=$(mktemp)或tmpdir=$(mktemp -d)生成唯一路径,再通过trap cleanup exit注册清理函数,确保退出时精准删除。

在 Shell 脚本中用 mktemp 创建临时文件,核心是避免硬编码路径、防止竞态条件,并确保退出时自动清理。关键不在于“多复杂”,而在于“每步都可靠”。
用 mktemp 生成唯一安全路径
mktemp 默认创建带随机后缀的临时文件或目录,避开手动拼接(如 /tmp/myapp_$$)带来的安全隐患。直接调用会输出路径,建议用命令替换捕获:
- 创建临时文件:
tmpfile=$(mktemp)(路径类似/tmp/tmp.XXXXXX) - 创建临时目录:
tmpdir=$(mktemp -d)(加-d确保是目录) - 指定模板(可选):
mktemp /tmp/myapp_XXXXXX,但不要省略末尾六个X,否则报错
设置 trap 捕获信号并清理
脚本退出(无论成功、Ctrl+C 还是被 kill)时自动删临时资源,靠 trap 实现。最常用的是 EXIT 信号:
- 定义清理函数:
cleanup() { rm -f "$tmpfile"; rmdir "$tmpdir" 2>/dev/null; } - 注册陷阱:
trap cleanup EXIT - 若需响应中断,可追加:
trap cleanup INT TERM
注意:变量必须在 trap 前赋值,且函数内引用要用双引号包裹变量,防止含空格路径出错。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
避免常见坑:权限、作用域与调试
mktemp 创建的文件默认权限为 600(仅属主可读写),目录为 700,通常足够安全。但要注意:
- 不要在子 shell 中创建再想清理——变量作用域丢失。所有
mktemp和trap应在主 shell 执行 - 调试时想看临时文件?加
set -x或临时注释trap,但上线前务必恢复 - 不用
rm -rf /tmp/myapp_*这类模糊清理——可能误删他人文件,mktemp + trap是精准方案
完整小例子:处理日志片段
(复制即用,含错误检查)
#!/bin/bash
# 创建临时文件和目录
tmpfile=$(mktemp) || { echo "mktemp failed"; exit 1; }
tmpdir=$(mktemp -d) || { echo "mktemp -d failed"; exit 1; }
<h1>注册清理</h1><p>cleanup() {
rm -f "$tmpfile"
rmdir "$tmpdir" 2>/dev/null
}
trap cleanup EXIT</p><h1>示例操作:写入、处理、读取</h1><p>echo "processed at $(date)" > "$tmpfile"
grep "processed" "$tmpfile" > "$tmpdir/result.txt"
cat "$tmpdir/result.txt"
</p>
运行完,$tmpfile 和 $tmpdir 自动消失,无需手动干预。










