Go to main content

手册页部分 1:用户命令

退出打印视图

更新时间: 2018年8月8日 星期三
 
 

mktemp(1)

名称

mktemp - 创建临时文件名

用法概要

mktemp [-dtqu] [--directory] [--quiet] [--dry-run] [-p directory]
     [--suffix=suff] [--tmpdir[=dir]] [template]

描述

mktemp 实用程序可创建临时文件名。要执行此操作,mktemp 会采用指定文件名模板并覆盖该模板的某部分以创建唯一文件名。请参见“操作数”部分。

可使用 mktemp(3C)mkdtemp(3C)mkstemp(3C)mkstemps(3C) 库函数将该模板转换为路径名。

如果 mktemp 可以成功生成唯一文件名,则会创建具有以下文件权限的文件(或目录):只有文件所有者可读取和写入该文件(除非给出 –u 标志)且文件名将输出到标准输出。

mktemp 允许 shell 脚本安全使用临时文件。传统上,许多 shell 脚本都采用程序的名称加 PID 前缀,并将其用作临时文件名。这种命名方案具有可预测性,在竞争情况下,它为攻击者的成功提供了可趁之机。差一点但比较安全的方法是使用相同的命名方案来创建临时目录。这种方法能保证临时文件不被破坏,同时能够简便地拒绝服务攻击。改为使用 mktemp

选项

支持以下选项:

–d, ––directory

创建目录,而不是文件。

–p directory

生成临时文件名时,使用指定目录作为前缀。用户的 TMPDIR 环境变量(如果已设置)可以覆盖目录。此选项隐式指定 –t 标志。

–q, ––quiet

如果发生错误,则会失败而不进行提示。如果脚本不希望错误输出转为标准错误,则该选项十分有用。

––suffix=suff

suff 附加到模板。suff 不得包含斜杠 (/)。当模板以可替代的 X 字符以外的其他字符结束,且不会删除包括此类 X 字符的要求时,会隐式使用该选项。

––tmpdir[=dir]

“模板”与 dir 相关。如果没有指定 dir,则会使用用户的环境变量 TMPDIR(如果已设置),否则会使用 /tmp。该选项不支持带有绝对名称的模板,与 –t 的用法不同,模板可以包含斜杠。

–t

生成以临时目录为根的路径。选择该目录的情况如下:如果用户的 TMPDIR 环境变量已设置,则会使用其中所包含的目录。否则,如果提供了 –p 标志,则会使用指定目录。如果以上条件均不适用,则使用 /tmp。在此模式下,模板(如果已指定)应该为目录组成部分(与完整路径相对),因此不应该包含任何正斜杠。

–u, ––dry-run

在不安全模式下操作。在 mktemp 退出前为临时文件解除了链接。这稍好于 mktemp(3C),但仍然会引入竞争情况。不建议使用该选项。

操作数

支持下列操作数:

template

template 可以为具有三到六个 X 的任何文件名,例如 /tmp/tfile.XXXXXX

如果未指定 template,则会使用缺省名 tmp.XXXXXX,并会隐含 –t 标志。

如果 template 具有多个 X 系列,则会使用最后一个系列作为替换文本,除非另行指定 –-suffix

如果 template 在最后一组 X 之后具有字符,则暗示 –-suffix 选项为所有此类字符,除非有显式指定。

示例

示例 1 使用 mktemp

以下示例说明了 mktempsh(1) 脚本中的简单使用。在此示例中,如果脚本无法获取安全的临时文件,则会退出。

TMPFILE=`mktemp /tmp/example.XXXXXX`
if [ -z "$TMPFILE" ]; then exit 1; fi
echo "program output" >> $TMPFILE
示例 2 使用 mktemp 支持 TMPDIR

以下示例使用 mktemp 支持用户的 TMPDIR 环境变量:

TMPFILE=`mktemp -t example.XXXXXX`
if [ -z "$TMPFILE" ]; then exit 1; fi
echo "program output" >> $TMPFILE
示例 3 在不指定临时文件名称的情况下使用 mktemp

以下示例在不指定临时文件的情况下使用 mktemp。此情况暗含 –t 标志。

TMPFILE=`mktemp`
if [ -z "$TMPFILE" ]; then exit 1; fi
echo "program output" >> $TMPFILE
示例 4 /tmp 之外的缺省临时目录使用 mktemp

以下示例在 /extra/tmp 中创建临时文件,除非用户的 TMPDIR 环境变量另有指定:

TMPFILE=`mktemp -p /extra/tmp example.XXXXX`
if [ -z "$TMPFILE" ]; then exit 1; fi
echo "program output" >> $TMPFILE
示例 5 使用 mktemp 删除文件

以下示例尝试创建两个临时文件。如果创建第二个临时文件失败,则 mktemp 会在退出前删除第一个文件:

TMP1=`mktemp -t example.1.XXXXXX`
if [ -z "$TMP1" ]; then exit 1; fi
TMP2=`mktemp -t example.2.XXXXXX`
if [ -z "$TMP2" ]; then
        rm -f $TMP1
        exit 1
fi
示例 6 使用 mktemp

如果 mktemp 无法创建文件,则以下示例不会退出。脚本的该部分已受到保护。

TMPFILE=`mktemp -q -t example.XXXXXX`
if [ ! -z "$TMPFILE" ]
then
        # Safe to use $TMPFILE in this block
        echo data > $TMPFILE
        ...
        rm -f $TMPFILE
fi
示例 7 使用带后缀选项的 mktemp

以下命令说明了如何使用后缀选项。该命令的作用是创建临时文件 ex.q5N.SUFF

# mktemp --suffix=.SUFF ex.XXXXXX
ex.q5Ngid.SUFF
示例 8 使用后缀选项和 Tmpdir 选项

以下命令说明了如何使用后缀选项和 tmpdir 选项。

# mktemp --tmpdir=$HOME --suffix=.bar foo.XXXXXX
/root/foo.7ZaO_N.bar
示例 9 使用目录选项和后缀选项

以下命令使用目录选项和后缀选项。

# mktemp --directory --suffix=.bar foo.XXXXXX
foo.GSaO3d.bar
# ls -l
drwx------   2 root     staff        512 Mar 19  2012 foo.GSaO.bar
示例 10 支持带有非结尾 X 的模板

以下命令显示了如何使用带有非结尾 X 字符的目录选项。此命令中暗含了 ––suffix=suff 选项,其中 bar 用作后缀。

# mktemp XXfooXXXXXXbar
XXfooaFY0N6bar
示例 11 使用静默选项和 Tmpdir 选项

以下命令说明了如何使用静默选项和 tmpdir 选项。

# mktemp --quiet --tmpdir=/tmp foo
[No diagnostic message is returned]
示例 12 使用带多个选项的 mktemp

以下命令组合使用了预运行选项、tmpdir 选项和后缀选项。

# mktemp --dry-run --tmpdir=$HOME --suffix=SUFF
/root/tmp.qdaGcOSUFF
# ls -l /root/tmp.qdaGcOSUFF
/root/tmp.qdaGcOSUFF: No such file or directory

环境变量

有关影响带 –t 选项的 mktemp 执行的以下环境变量的说明,请参见 environ(7):TMPDIR。

TMPDIR

指定用于创建临时文件以覆盖系统缺省值的目录;由 mktemp 使用。

退出状态

将返回以下退出值:

0

成功完成。

1

出现错误。

属性

有关下列属性的说明,请参见 attributes(7)

属性类型
属性值
可用性
system/core-os
接口稳定性
Committed(已确定)

另请参见

sh(1)mkdtemp(3C)mkstemp(3C)mkstemps(3C)mktemp(3C)attributes(7)environ(7)

附注

mktemp 实用程序出现在 OpenBSD 2.1 中。Solaris 实现仅使用对 mktemp(3C)mkstemp(3C)mkstemps(3C) 有意义的多个 X。