OS X 中 mktemp 的修复或替代方案

OS X 中 mktemp 的修复或替代方案

我正在查看其他人编写的 bash 脚本,它使用mktemp

TEMP=`mktemp --directory`

然而,这条线在我的机器(OS X 10.6)上不起作用。

我将如何修复这条线,使其跨 un*x 类平台兼容?编辑:替代命令也足够了。

答案1

以下是我最终用来可靠地创建一个在 Linux 和 Darwin(Mac OS X 10.11 之前的所有版本)上运行的临时目录的内容,无需硬编码$TMPDIR/tmp

mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')

背景:

GNU mktemp 命令不需要参数。 Plainmktemp将工作并在系统的临时目录中创建一个临时文件。

Plainmktemp -d将创建一个目录而不是文件,这正是您想要在 Linux 上使用的。

(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..

tmp.XXXXXXXXXX默认情况下,GNU mktemp 使用子目录(或文件)名称的模板。要自定义此模板,-t可以使用该选项。

OSX 的 mktemp 没有默认模板,需要指定模板。不幸的是,GNU mktemp 将模板作为-t选项,而在 OSX 上,它作为位置参数传递。相反,OSX 的 mktemp 有一个-t具有其他含义的选项。 OSX 上的选项-t被记录为模板的“前缀”。它扩展为{prefix}.XXXXXXXX,因此它会自动向其中添加 X(例如可以在临时目录中mktemp -d -t example创建)。example.zEJZWCTQ

$TMPDIR我惊讶地发现在很多Linux环境中,不是默认设置。许多 CLI 程序在设置时确实支持它,但仍然需要默认值/tmp。这意味着传递$TMPDIR/example.XXXXXXXX给 mktemp 或 mkdir 是危险的 因为它可能会/example.XXXXXXXX在本地磁盘的根目录中产生(由于$TMPDIR被取消设置并成为空字符串)。

在 OSX 上,$TMPDIR总是被设置并且(至少在默认 shell 中)它不是被设置为/tmp(这是到 的符号链接/private/tmp)而是被设置为/var/folders/dx/*****_*************/T。因此,无论我们为 OSX 做什么,都应该尊重默认行为。

总之,以下是我最终使用的可靠地创建一个适用于 Linux 和 Darwin 的临时目录(Mac OS X),无需硬编码$TMPDIR/tmp

mytmpdir=$(mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir')

第一部分是针对 Linux 的。此命令在 Darwin (Mac OS X) 上将失败,错误状态代码1响应为“usage: ...”。这就是为什么我们忽略 stderr 并执行 Mac 变体的原因。该mytmpdir前缀仅在 Mac 上使用(需要设置该选项)。

答案2

您必须提供一个模板。 mktemp -d /tmp/foo.XXXX应该管用。我从未见过--directory。这--表明它是一个 GNU 扩展。

答案3

改成。--directory-d前者是 GNU 主义,但mktempcoreutils 的 GNU 也支持-d. OS X 中的mktemp与 BSD 中的相同,因此-d在实际发布程序的系统之间应该具有很好的可移植性mktemp

答案4

我发现确保在/tmpLinux 和 Mac OS 上的目录上创建临时文件夹的最佳解决方案是mktemp -d '/tmp/mytmpdir.XXXXXX'

希望有帮助。

相关内容