获取临时路径的通用方法?

获取临时路径的通用方法?

我听说过$TEMP$TMP,但我认为它们并不是每个发行版的标准。

据我所知,获取临时目录的最佳方法就是/tmp,是否有任何发行版无法使用该路径工作?

答案1

$TMPDIR比两者都更标准$TEMP$TMP正如 POSIX 标准提到的那样。

/tmp目录保留在 POSIX.1-2008 中,以容纳假定其可用性的历史应用程序。鼓励实现在环境变量中提供合适的目录名称,TMPDIR并鼓励应用程序使用 的内容TMPDIR来创建临时文件。

参考:http://pubs.opengroup.org/onlinepubs/9699919799/xrat/V4_xbd_chap10.html

至少在 macOS 上,默认情况下$TMPDIR不会设置为/tmp,而是设置为类似/var/folders/4r/504v61kx02gczk_454db345c0000gn/T/./tmp尽管如此,作为符号链接/private/tmp(无论出于何种原因)仍然可用。

tmpdir="${TMPDIR:-/tmp}"例如,您可以在脚本中使用$TMPDIR它是否已设置或未/tmp设置(或为空)。

非标准mktemp实用程序将默认创建一个文件或目录$TMPDIR并输出其名称(但不在 macOS 上,见下文):

tmpfile=$(mktemp)
tmpdir=$(mktemp -d)

检查您系统上的手册mktemp以了解如何使用它。并非所有实现都是相同的。


在 macOS 上,由于原因,您必须为mktemp实用程序提供一个带有显式路径的模板:

tmpfile=$(mktemp "${TMPDIR:-/tmp}"/tmp.XXXXXXXX)
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}"/tmp.XXXXXXXX)

上述命令将在$TMPDIR、 或 中(分别)创建一个临时文件和目录,/tmp如果为空或变量未设置(在 macOS 上$TMPDIR该变量默认设置为 的结果)。getconf DARWIN_USER_TEMP_DIR


在 Cygwin 上,$TMPDIR默认情况下未设置:

$ echo $TMPDIR


$ echo $TEMP
/tmp

$ echo $TMP
/tmp

考虑使用${TMPDIR:-${TEMP:-${TMP:-/tmp}}}代替。

答案2

注意:操作员的问题是“获取临时路径的通用方法?”;它不是“如何创建临时文件/目录?”

Linux 手册页mktemp包含以下选项:

mktemp [OPTION]... [TEMPLATE] 
...
-u, --dry-run
    do not create anything; merely print a name
... 
--tmpdir[=DIR]
    interpret TEMPLATE relative to DIR. If DIR is not specified, 
use $TMPDIR if set, else /tmp. With this option, TEMPLATE must 
not be an absolute name. Unlike with -t, TEMPLATE may contain 
slashes, but mktemp creates only the final component. 

因此,以下任一方法是等效的并且应该有效:

dirname $(mktemp -u --tmpdir)

或者

echo ${TMPDIR:-/tmp}

可以想象,前者可能可以工作,而后者则不能在使用或未使用但已实现规范的系统上使用TMPDIR/tmp尽管mktemp在选项下有不同的解释--tmpdir[=DIR]。 (但是我目前无法测试。)

答案3

我建议通过检查所有可能设置的环境来采用更全面的方法。另外,我们不要忘记通过检查 .XDG 基本目录规范XDG_RUNTIME_DIR

https://specations.freedesktop.org/basedir-spec/basedir-spec-latest.html

echo ${XDG_RUNTIME_DIR:-${TMPDIR:-${TMP:-${TEMP:-/tmp}}}}

/run/user/1000对于遵循 XDG 基本目录的系统,这很可能会返回,如果没有,将按顺序检查TMPDIRTMP和。TEMP如果没有设置任何内容,那么它将返回/tmp

相关内容