tempfile和mktemp有什么区别?

时间:2013-09-10 10:36:34

标签: linux bash unix

我遇到的大多数系统同时包含tempfile(1)mktemp(1)。存在语法差异,mktemp也可以创建目录,但它们似乎也做同样的事情。

这两者有什么区别吗?为什么两者都存在?比另一个更标准吗?如果我只想安全地创建一个临时文件,是否有理由更喜欢一个而不是另一个?

我怀疑这背后有一些有趣的Unix知识,但我的搜索没有任何结果。

3 个答案:

答案 0 :(得分:34)

  

我怀疑这背后有一些有趣的Unix知识......

mktemp的{​​{3}}可以追溯到history。但是,它后来成为GNU coreutils的一部分。 OpenBSD 2.1帖子宣布mktemp包含coreutils

在此之前,许多程序正在使用tempfile。还有This tempfile使mktemp成为tempfile的封套,proposal阻止使用tempfile

但是,tempfile手册中添加了以下内容:

  

在NFS分区上创建文件时,无法保证独占创建。 tempfile无法创建临时目录。 mktemp(1)已被弃用;你应该使用{{1}}代替。

答案 1 :(得分:4)

在tempfile的手册中说:

tempfile - create a temporary file in a safe manner

在mktemp中:

mktemp - create a temporary file or directory

它们可能几乎相同,只是实现有点不同。

如手册中所述,tempfile实际上有一些预防措施,如:

  

a)如果环境变量TMPDIR存在且包含   使用的适当目录的名称。

     

b)否则,如果指定了--directory参数并且   适当的,它被使用。

     

c)否则,P_tmpdir(如<stdio.h>中所定义)使用时   合适的。

     

d)最后可以使用实现定义的目录(/tmp)。

如果脚本足够信任mktemptempfile以确保创建临时文件或目录,那么它实际上很有用。但是,如果你自己在脚本中运行预防措施,我发现使用mktemp并没有太多问题。您可以使用[ -e ][ -f ][ -d ][ -L ]等来验证文件是否可以实际制作/已经制作。甚至用-r,-w和-x检查某些东西是否可写,可读和/或可执行。在bash中,请参阅help test

仍然为了连续运行时,在多个环境中运行代码时,最好还是依赖tempfile。只要确保它在任何地方都可用。使用whichtype -P,您可以查看其中哪一个可用。一个例子:

create_temp() {
    if type -P tempfile >/dev/null; then
        # use tempfile based from $1
    elif type -P mktemp > /dev/null; then
        # use mktemp based from $1
    else
        echo "Can't find temporary file creator."
        exit 1
    fi
}

答案 2 :(得分:0)

从源代码看东西(在debian上)tempfile来自包debianutils并使用libc函数tempnam()mktemp来自GNU coreutils并且没有不要使用libc函数