mktemp(1)有多便携?

32

正如标题所述 - 我能否合理地确定在我可能遇到的任何类Unix操作系统上都存在mktemp


请参见 https://unix.stackexchange.com/a/84980/37512。 - Timo Tijhof
4个回答

26

POSIX似乎没有规定mktemp(1)

看起来现代大多数系统都有它,但可用功能和选项的语义在实现之间会有所不同(因此特定的调用可能不可移植):

因此,如果您想要一个可移植的解决方案,您可能需要坚持在所有感兴趣的平台上意味着相同事情的功能和选项。


1
它曾经是相当可移植的,并由POSIX定义,但似乎通过形成新函数'mkstemp()'解决了其中一些弱点。"4.3BSD,POSIX.1-2001。 POSIX.1-2008删除了对mktemp()的规范说明。" http://man7.org/linux/man-pages/man3/mktemp.3.html较新的替代品为http://man7.org/linux/man-pages/man3/mkstemp.3.html - TafT
3
@TafT提到的mktemp是C库函数,而OP所问的mktemp是命令行程序。 - onlynone
@onlynone是一件很薄的外衣,通常包裹在其他事物周围的东西之一吗? - TafT
4
有点像,但并不是那么简单。GNU Coreutils中的mktemp.c有350行:http://lingrok.org/xref/coreutils/src/mktemp.c 。实际上它似乎从未调用过mktemp(3),而是使用一些gnulib函数(而非glibc)来执行自己的逻辑,它所做的唯一系统调用是open - onlynone
@TafT 没有适当的 mktemp 实现,命令行工具将使用已弃用的 C 函数 mktemp - mtraceur
显示剩余3条评论

7

mktemp函数(也称为mktemp(3))最初出现在Unix V7中,因此可能无处不在。但是,mktemp命令(又称mktemp(1))我认为最初出现在OpenBSD 2.1上,所以如果您必须处理真正古老的Unix系统,您可能需要担心——除非您可以分发非常便携的mktemp.org版本(以解决某些客户端古老系统上可能缺少此实用程序的潜在问题)。当然,您有多大可能遇到古老的系统对我们来说几乎是不可能猜测的——例如,在HP-UX中,mktemp(1)已经存在至少8年了(即使是大多数企业也可能在该时间范围内更新了其Unix操作系统),在Xenix中,我相信它出现在3.0中(1992年),等等。


简而言之,你可以合理地依赖于mktemp的存在。 - mpez0

5

请注意,Solaris 9(2002/2003年发布)似乎没有包含mktemp - 我今天刚发现:

$ uname -a
SunOS dcmnapp02 5.9 Generic_122300-47 sun4u sparc SUNW,Sun-Fire-V440
$ mktemp
bash: mktemp: command not found
$ man mktemp
bash-2.05$ man mktemp
重新格式化页面。请稍后...完成
标准C库函数 mktemp(3C)
名称 mktemp - 创建唯一文件名
用法 #include
char *mktemp(char *template);

2
是的,Solaris 10是第一个在操作系统中包含mktemp(1)命令的Solaris版本。 - alanc

2
在Solaris 9中,它包含在SMCmktemp软件包中,可以查看http://sunfreeware.com/indexsparc9.html

uname -s
SunOS
uname -r
5.9
/usr/sbin/pkgchk -l -p /usr/local/bin/mktemp
路径名:/usr/local/bin/mktemp
类型:普通文件
预期模式:0555
预期所有者:bin
预期组:bin
预期文件大小(字节):8884
预期内容的sum(1):6493
预期最后修改时间:Nov 05 08:48:17 2002
被以下软件包引用:
SMCmktemp
当前状态:已安装


2
链接已损坏。 - Nicolas Raoul
是的,该服务已经迁移到https://unixpackages.com并成为付费服务。 - thecarpy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接