Answers:
以下是我最终用来可靠地创建一个在Linux和Darwin(Mac OS X 10.11之前的所有版本)上均可使用的临时目录的信息,而无需进行硬编码$TMPDIR
或/tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
GNU mktemp命令不需要任何参数。Plain mktemp
将起作用,并在系统的临时目录中创建一个临时文件。
Plain mktemp -d
将创建目录而不是文件,而这正是您要在Linux上使用的目录。
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
默认情况下,GNU mktemp使用模板tmp.XXXXXXXXXX
作为子目录(或文件)的名称。要自定义此模板,-t
可以使用该选项。
OSX的mktemp没有默认模板,需要指定模板。不幸的是,在GNU mktemp将模板作为-t
选项的情况下,在OSX上将其作为位置参数传递。相反,OSX的mktemp具有一个-t
表示其他含义的选项。-t
OSX上的选项记录为模板的“前缀”。它被扩展为{prefix}.XXXXXXXX
,因此它会自动向其中添加X(例如mktemp -d -t example
可以example.zEJZWCTQ
在temp目录中创建)。
我惊讶地发现,在许多Linux环境,$TMPDIR
是不是默认设置。设置后,许多CLI程序都支持它,但仍需要使用默认值/tmp
。这意味着传递$TMPDIR/example.XXXXXXXX
给mktemp或mkdir是危险的, 因为它可能会/example.XXXXXXXX
在本地磁盘的根目录中产生(由于$ TMPDIR未被设置并成为空字符串)。
在OSX上,$TMPDIR
始终设置为(至少在默认外壳程序中),而不是设置为/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的。在达尔文(Mac OS X)上,此命令将失败,错误状态代码1
将以“用法:...”作为响应。这就是为什么我们忽略stderr而是执行Mac变体的原因。该mytmpdir
前缀仅在Mac(需要设置该选项)上使用。
mktemp -d
在OS X 10.11.5 El Capitan上运行,它按预期运行file $(mktemp -d)
:: /var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
您必须提供一个模板。 mktemp -d /tmp/foo.XXXX
应该管用。我从未见过--directory
。这--
表明它是GNU扩展。
$TMPDIR
在可用时使用,请执行mktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
。在Mac上可以使用bash,在Debian上可以使用dash,因此看起来可移植。
更改--directory
为-d
。前者是GNU-ism,但mktemp
coreutils的GNU 也支持-d
。在mktemp
OS X中是一样的,从BSD,所以-d
应该是真正推出一款系统间漂亮便携mktemp
的程序。
mktemp -d
,它也不起作用。
mktemp
OS X上需要一个模板。您使用的脚本采用GNU约定,如果未提供,则使用默认模板。
XXXXX
在模板中提供,因为OS X无法确定是否存在兼容的模板标志?
mktemp
在OS X 10.11.5上,El Capitan为我工作file $(mktemp -d)
::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory