我遇到的大多数系统同时包含tempfile(1)
和mktemp(1)
。存在语法差异,mktemp
也可以创建目录,但它们似乎也做同样的事情。
这两者有什么区别吗?为什么两者都存在?比另一个更标准吗?如果我只想安全地创建一个临时文件,是否有理由更喜欢一个而不是另一个?
我怀疑这背后有一些有趣的Unix知识,但我的搜索没有任何结果。
答案 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
)。
如果脚本足够信任mktemp
或tempfile
以确保创建临时文件或目录,那么它实际上很有用。但是,如果你自己在脚本中运行预防措施,我发现使用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
}
答案 2 :(得分:0)
从源代码看东西(在debian上)tempfile
来自包debianutils
并使用libc函数tempnam()
而mktemp
来自GNU coreutils并且没有不要使用libc函数