Shell mktemp(1)的便携性如何?

Shell mktemp(1)的便携性如何?,shell,portability,Shell,Portability,正如标题所示-我是否可以合理地确定mktemp将存在于我可能遇到的任何unix-y操作系统上?一个mktemp函数(又名mktemp(3))首先出现在unix V7中,因此它可能无处不在。然而,我相信OpenBSD2.1上首先出现了一个mktemp命令(也称为mktemp(1)),因此,如果您必须处理真正的旧式Unix系统,您可能不得不担心——除非您可以分发非常便携的版本(以修复某些客户的旧式系统上可能缺少此实用程序)。当然,我们几乎无法猜测您遇到过时系统的可能性——例如,在HP-UX中,mkt

正如标题所示-我是否可以合理地确定
mktemp
将存在于我可能遇到的任何unix-y操作系统上?

一个
mktemp
函数(又名
mktemp(3)
)首先出现在unix V7中,因此它可能无处不在。然而,我相信OpenBSD2.1上首先出现了一个
mktemp
命令(也称为
mktemp(1)
),因此,如果您必须处理真正的旧式Unix系统,您可能不得不担心——除非您可以分发非常便携的版本(以修复某些客户的旧式系统上可能缺少此实用程序)。当然,我们几乎无法猜测您遇到过时系统的可能性——例如,在
HP-UX
中,
mktemp(1)
已经存在至少8年了(甚至大多数企业可能已经在该时间范围内更新了Unix操作系统),在Xenix中,我相信它出现在3.0(1992年)中,等等,等等。

POSIX似乎没有指定mktemp(1)

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

  • -mktemp(1)源自OpenBSD 2.1
  • -几乎始终与FreeBSD相同
  • sudo的名声
  • -这一项似乎与此处列出的大多数其他项特别不同

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

仅供参考,Solaris 9(2002/2003发布)中似乎不包括MKTEM—今天刚刚遇到了:

$ 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 Reformatting page. Please Wait... done Standard C Library Functions mktemp(3C) NAME mktemp - make a unique file name SYNOPSIS #include char *mktemp(char *template); $uname-a SunOS dcmnapp02 5.9通用_122300-47 sun4u sparc SUNW,Sun-Fire-V440 $mktemp bash:mktemp:未找到命令 $man mktemp bash-2.05美元曼恩mktemp 重新格式化页面。请稍候。。。完成 标准C库函数mktemp(3C) 名称 mktemp-创建唯一的文件名 提要 #包括 char*mktemp(char*template);
在Solaris 9上,它位于SMCMKTEM包中,请参阅:

uname-s
苏诺斯
uname-r
5.9
/usr/sbin/pkgchk-l-p/usr/local/bin/mktemp
路径名:/usr/local/bin/mktemp
类型:常规文件
预期模式:0555
预期所有者:bin
预期组:bin
预期文件大小(字节):8884
预计内容总数(1):6493
预计最后修改时间:2002年11月5日08:48:17
由以下软件包引用:
SMCMKTEM
当前状态:已安装


因此,简短的总结是:是的,您可以合理地依赖mktemp。是的,Solaris 10是第一个在操作系统中包含mktemp(1)命令的Solaris版本。它过去是可移植的,由POSIX定义,但似乎通过形成新函数“mkstemp()”解决了其中的一些弱点。“4.3BSD,POSIX.1-2001.POSIX.1-2008删除了mktemp()的规范。”较新的替代品是
mktemp
@TafT正在寻址的是C库函数,而
mktemp
OP询问的是命令行程序。@onlyone是其中一个东西,而不是另一个东西周围很薄的一层?@TafT类。但它不是很薄mktemp.c为350行:。实际上,它看起来从来没有调用过
mktemp(3)
,而是使用了一些gnulib函数(不是glibc)这是它自己的逻辑,它所做的唯一系统调用是
open
@TafT No-没有正确实现
mktemp
命令行工具将使用
mktemp
不推荐的C函数。链接已断开。另请参阅。