Linux 什么';tempfile和mktemp之间的区别是什么?

Linux 什么';tempfile和mktemp之间的区别是什么?,linux,bash,unix,Linux,Bash,Unix,我遇到的大多数系统都有tempfile(1)和mktemp(1)。有语法上的差异,mktemp也可以创建目录,但它们在其他方面似乎做了相同的事情 这两者有什么区别吗?为什么两者都存在?一个比另一个更标准吗?如果我只是想安全地创建一个临时文件,有什么理由选择其中一个而不是另一个 我怀疑这背后有一些有趣的Unix知识,但我的搜索结果一无所获。tempfile的手册中说: tempfile-以安全的方式创建临时文件 在mktemp中时: mktemp-创建临时文件或目录 它们可能几乎相同,只是实现有点

我遇到的大多数系统都有
tempfile(1)
mktemp(1)
。有语法上的差异,
mktemp
也可以创建目录,但它们在其他方面似乎做了相同的事情

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


我怀疑这背后有一些有趣的Unix知识,但我的搜索结果一无所获。

tempfile的手册中说:

tempfile-以安全的方式创建临时文件

在mktemp中时:

mktemp-创建临时文件或目录

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

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

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

b) 否则,如果指定了
--directory
参数 在适当的情况下,使用它

c) 否则,当 合适

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

如果脚本信任
mktemp
tempfile
足以确定将创建一个临时文件或目录,那么它实际上非常有用。但如果您自己在脚本中运行预防措施,那么仅使用
mktemp
并没有什么问题。您可以使用
[-e]
[-f]
[-d]
[-L]
等来验证文件是否可以实际生成/已经生成。甚至使用-r、-w和-x检查某些内容是否可写、可读和/或可执行。在bash中,请参见帮助测试

不过,为了实现连续运行,在多个环境中运行代码时,您最好使用
tempfile
。只要确保它在任何地方都有足够的可用性。使用
which
type-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
}

从源代码的角度来看(在debian上)
tempfile
来自包
debianutils
,使用libc函数
tempnam()
,而
mktemp
来自GNU coreutils,不使用libc函数

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

mktemp的
。然而,它很晚才成为GNU coreutils的一部分。《华盛顿邮报》宣布为
coreutils
加入
mktemp

在此之前,许多程序都在使用
tempfile
。还有一种方法是将
tempfile
包装成
mktemp
,这是为了阻止使用
tempfile

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

在NFS分区上创建文件时,不保证独占创建<代码>临时文件
无法创建临时目录
tempfile
已弃用;您应该改用
mktemp(1)


linux tempfile(1)手动notes tempfile已弃用;您应该使用mktemp(1)来代替它。“谢谢!我想我只是忽略了手册页的那一部分:)