我听说过$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 基本目录的系统,这很可能会返回,如果没有,将按顺序检查TMPDIR
、TMP
和。TEMP
如果没有设置任何内容,那么它将返回/tmp
。