mktemp 命令详解
概述
mktemp
用于安全地创建临时文件或目录,并输出其名称。它通过生成唯一的文件名/目录名避免竞争条件(如被其他进程恶意猜测或篡改),是脚本中处理临时文件的推荐工具。
临时文件/目录的名称由用户提供的模板(TEMPLATE)生成,模板需包含至少3个连续的 X
(位于最后一部分),mktemp
会用随机字符替换这些 X
以保证唯一性。
命令格式
mktemp [选项]... [模板]
- 模板(TEMPLATE):可选参数,指定临时文件/目录的名称模板,需包含至少3个连续的
X
(如mytemp.XXX
)。若未指定,默认模板为tmp.XXXXXXXXXX
,且隐含--tmpdir
选项。
选项详解
选项 | 全称 | 说明 |
---|---|---|
-d , --directory | 无 | 创建临时目录,而非临时文件。 |
-u , --dry-run | 无 | 仅打印生成的临时文件/目录名称,不实际创建(不安全,因名称可能被其他进程抢占)。 |
-q , --quiet | 无 | 抑制创建失败时的错误信息(如权限不足导致无法创建)。 |
--suffix=SUFF | 无 | 为模板添加后缀 SUFF (后缀不可包含斜杠 / )。若模板不以 X 结尾,此选项会被自动启用(例如模板 mytemp 会隐含 --suffix ,实际生成 mytemp.XXX 类名称)。 |
-p DIR , --tmpdir[=DIR] | 无 | 指定临时文件/目录的父目录: - 若提供 DIR ,模板相对于 DIR 解析;- 若未提供 DIR ,优先使用环境变量 $TMPDIR ,否则默认 /tmp ;- 模板不可为绝对路径(如 /tmp/xxx ),但可包含斜杠(如 subdir/temp.XXX ,仅创建最后一级 temp.XXX )。 |
-t | 无 | 将模板视为单个文件名组件,父目录优先级:$TMPDIR > -p 指定的目录 > /tmp 。已过时,建议使用 -p 替代。 |
--help | 无 | 显示帮助信息并退出。 |
--version | 无 | 输出版本信息并退出。 |
默认行为
- 若未指定模板,默认使用
tmp.XXXXXXXXXX
,并在$TMPDIR
(若存在)或/tmp
中创建。 - 临时文件权限为
u+rw
(用户读写),临时目录权限为u+rwx
(用户读写执行),实际权限会减去当前umask
的限制(例如umask 022
时,文件权限为644
,目录为755
)。
注意事项
- 模板要求:必须包含至少3个连续的
X
,且X
需位于模板的最后一部分(如valid.XXX
有效,XXX.valid
无效)。 - 安全性:
mktemp
生成的名称具有随机性,可避免被其他进程猜测,比手动指定临时文件名(如temp.txt
)更安全。 -u
风险:--dry-run
仅打印名称不创建,可能导致后续实际创建时名称已被占用,不建议在脚本中依赖此选项。-t
过时:-t
选项已被--tmpdir
替代,使用-t
可能导致非预期行为。
示例
-
创建默认临时文件(在
/tmp
中,模板tmp.XXXXXXXXXX
):mktemp # 输出示例:/tmp/tmp.abc123def4
-
创建临时目录,模板为
mydir.XXX
:mktemp -d mydir.XXX # 输出示例:mydir.789(当前目录下的临时目录)
-
在
/var/tmp
中创建带后缀.log
的临时文件:mktemp -p /var/tmp "logfile.XXX" --suffix=.log # 输出示例:/var/tmp/logfile.xyz.log
-
模拟创建临时文件(不实际生成):
mktemp -u test.XXXX # 输出示例:test.abcd(仅显示名称,未创建文件)
-
在
$TMPDIR
中创建临时文件(若$TMPDIR
未设置,使用/tmp
):export TMPDIR=/mytmp mktemp data.XXX # 输出示例:/mytmp/data.123(若/mytmp存在)