31

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

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

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

4

3 回答 3

38

我怀疑这背后有一些有趣的 Unix 传说......

历史可以mktemp追溯到OpenBSD 2.1。然而,它在很久以后才成为 GNU coreutils 的一部分。 这篇文章宣布包含mktempfor coreutils

在那之前,tempfile被许多程序使用。还有一个建议tempfile一个包装器mktemp,但被拒绝以阻止使用tempfile.

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

在 NFS 分区上创建文件时,不能保证独占创建。 tempfile不能制作临时目录。 tempfile已弃用;你应该mktemp(1)改用。

于 2013-09-10T11:18:25.537 回答
5

它在 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仍然为了连续运行时,在多个环境中运行代码时您可能会更好地依赖它。只要确保它在任何地方都可用。与您一起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
}
于 2013-09-10T10:44:52.137 回答
1

从源代码中看到的东西(在 debian 上)tempfile来自包debianutils 并使用 libc 函数tempnam(),而mktemp来自 GNU coreutils 并且不使用 libc 函数

于 2013-09-10T10:47:35.347 回答