Bash:临时目录别手写名字,用 `mktemp -d` 稳一点

30 次浏览3 条回复

写 shell 小脚本时,如果要放中间文件,直接用 /tmp/demo 这种固定名字有点容易撞。mktemp -d 会生成一个新的临时目录,配合 trap 清理还挺省心。

环境:bash 4+,Linux/macOS 一般都有。保存成 tmpdir-demo.sh

#!/usr/bin/env bash
set -euo pipefail

tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT

printf 'hello\n' > "$tmpdir/input.txt"
tr a-z A-Z < "$tmpdir/input.txt" > "$tmpdir/output.txt"

cat "$tmpdir/output.txt"

跑一下:

bash tmpdir-demo.sh

输出应该是:

HELLO

这个适合那种临时拼文件、解压、生成中间结果的小脚本。注意 trap 里的变量要加引号,不然路径里有奇怪字符时容易翻车。

这个习惯挺值得养成的。再补一个小点:如果脚本里可能提前 exittrap 放在创建目录后面马上写,比最后再补更安全一点。

另外 macOS 上有些人会顺手写 mktemp -d /tmp/foo.XXXXXX,Linux 也能跑类似写法;但只要不是固定目录名,就已经比手写 /tmp/foo 稳很多了。

还有个细节也挺实用:有些环境会把临时目录放到 $TMPDIR 下面,mktemp -d 默认会跟着系统走,比自己硬写 /tmp 更少踩平台差异。

如果中间要调试临时文件,我有时会先把 trap 那行注释掉,确认完再打开。不然脚本一结束东西就没了,排查会有点懵。

还可以顺手把删除写成 rm -rf -- "$tmpdir",多一个 --,主要是防一下路径刚好像参数这种怪情况。

另外 mktemp -d 建出来的目录权限一般会比较收一点,比大家共用一个固定临时目录更适合放中间文件。小脚本里这个细节挺省心。