tempfile和mktemp有什么区别?

我遇到的大多数系统都有tempfile(1)mktemp(1) 。 有语法上的差异,而且mktemp也可以创build目录,但是它们看起来是一样的。

两者有什么区别? 为什么两者都存在? 比另一个更标准吗? 如果我只想安全地创build一个临时文件,是否有任何理由相对于另一个?

我怀疑在这之后有一些有趣的Unix绝杀,但是我的search没有任何结果。

Solutions Collecting From Web of "tempfile和mktemp有什么区别?"

我怀疑这里有一些有趣的Unix传说

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

在那之前, tempfile正被许多程序使用。 还有一个建议是使tempfile成为mktemp一个包装,而被拒绝阻止使用tempfile

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

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

它在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 } 

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