tempfile和mktemp有什么区别?

Tho*_*mas 28 unix linux bash

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

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

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

dev*_*ull 35

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

历史mktemp可以追溯到OpenBSD的2.1.但是,它后来成为GNU coreutils的一部分. 后宣布列入mktempcoreutils.

在那之前,tempfile一些程序正在使用它.还有一个提议要做tempfile一个包装mktemp,但被拒绝以阻止使用tempfile.

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

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


kon*_*box 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
}
Run Code Online (Sandbox Code Playgroud)

  • linux tempfile(1) 手册说明 tempfile 已弃用;您应该改用 mktemp(1)。” (2认同)