mktemp
mktemp 用来安全地创建临时文件或临时目录,并把路径打印到标准输出。名字里带随机段,避免多个进程同时写死 /tmp/foo 时互相踩踏或被抢占。
脚本里需要临时落盘时,优先用 mktemp,不要手写固定路径。
基本用法
不传参数时,默认在 $TMPDIR(未设置则为 /tmp)下创建文件,模板类似 tmp.XXXXXXXXXX:
tmp=$(mktemp)
echo "path=$tmp"
echo hello > "$tmp"
rm -f "$tmp"
输出示例:
/tmp/tmp.aB3kX9pQ2r
自定义模板
模板最后一个路径分量里至少要有 3 个连续的 X,X 会被替换成随机字符:
# file under /tmp
f=$(mktemp /tmp/myapp.XXXXXX)
# with suffix
f=$(mktemp --suffix=.log /tmp/myapp.XXXXXX)
创建临时目录
-d / --directory 创建目录而不是文件:
workdir=$(mktemp -d)
# or
workdir=$(mktemp -d /tmp/build.XXXXXX)
权限:文件一般为 u+rw,目录一般为 u+rwx(再受 umask 约束)。
指定父目录
-p DIR / --tmpdir[=DIR]:相对某个目录解释模板。未写 DIR 时用 $TMPDIR,再否则 /tmp:
f=$(mktemp -p /var/tmp myapp.XXXXXX)
d=$(mktemp -d --tmpdir="$HOME/tmp" work.XXXXXX)
脚本里的常见写法
创建后记得清理。可用 trap 在退出时删除:
#!/usr/bin/env bash
set -euo pipefail
tmp=$(mktemp)
trap 'rm -f "$tmp"' EXIT
printf 'data\n' > "$tmp"
# ... use "$tmp"
临时目录同理:
workdir=$(mktemp -d)
trap 'rm -rf "$workdir"' EXIT
注意
| 选项 | 说明 |
|---|---|
-u / --dry-run |
只打印名字、不创建实体,存在竞态,一般不要用 |
-q / --quiet |
创建失败时少打诊断信息 |
-t |
旧用法,已废弃,改用 -p / --tmpdir |
GNU coreutils 文档:info '(coreutils) mktemp invocation' 或 mktemp invocation。