I have a script that needs to create temporary files for its work, and clean up after itself. My question is about finding the right base directory for the temporary files.
The script needs to work on multiple platforms: Git Bash (Windows), Solaris, Linux, OSX. On each platform, the preferred temp directory is expressed differently:
%TMP%
(and possibly %TEMP%
)$TMPDIR
$TMPDIR
but appears to be unset on multiple systems I triedSo …
Posix 是否需要任何设备?例如,/dev/urandom
,/dev/zero
或/dev/null
?
我怀疑不是因为非 *nix 操作系统,而是想要求完整性。
我之前已经注意到这一点,但在我回答“如何将目录移动到同名目录中? ”时它又被提出来了:
的mktemp
在MacOS实用程序不表现一样在Linux或BSD(或至少OpenBSD的)的同名的相对于所述公用事业TMPDIR
环境变量。
在当前目录下创建一个临时文件,我通常可以说
tmdfile=$(TMPDIR=. mktemp)
Run Code Online (Sandbox Code Playgroud)
或者
tmpfile=$(TMPDIR=$PWD mktemp)
Run Code Online (Sandbox Code Playgroud)
(对于带有 的临时目录也类似mktemp -d
)。
在 macOS 上,我必须通过给它一个实际模板来强制该实用程序使用当前目录,如
tmpfile=(mktemp ./tmp.XXXXXXXX)
Run Code Online (Sandbox Code Playgroud)
因为使用更方便的tmpfile=$(TMPDIR=. mktemp)
将忽略该TMPDIR
变量并/var/folders/qg/s5jp5ffx2p1fxv0hy2l_p3hm0000gn/T
在类似命名的目录下或中创建文件。
mktemp
macOS 上的手册提到
如果
-t prefix
给出该选项,mktemp
将根据前缀和_CS_DARWIN_USER_TEMP_DIR
配置变量(如果可用)生成模板字符串。如果_CS_DARWIN_USER_TEMP_DIR
不可用,回退位置 是TMPDIR
和/tmp
。
在我的系统上,_CS_DARWIN_USER_TEMP_DIR
似乎未设置:
$ getconf _CS_DARWIN_USER_TEMP_DIR
getconf: no such configuration parameter `_CS_DARWIN_USER_TEMP_DIR'
Run Code Online (Sandbox Code Playgroud)
但是例如
tmpfile=$(TMPDIR=. mktemp -t hello)
Run Code Online (Sandbox Code Playgroud)
仍然在下创建一个文件/var/folders/.../
(也在使用$PWD
代替 时.
)。
我注意到
$ getconf …
Run Code Online (Sandbox Code Playgroud)