我正在查看其他人编写的 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 主义,但mktemp
coreutils 的 GNU 也支持-d
. OS X 中的mktemp
与 BSD 中的相同,因此-d
在实际发布程序的系统之间应该具有很好的可移植性mktemp
。
答案4
我发现确保在/tmp
Linux 和 Mac OS 上的目录上创建临时文件夹的最佳解决方案是mktemp -d '/tmp/mytmpdir.XXXXXX'
希望有帮助。