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

Per*_*eda 10 tmp

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

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

Kus*_*nda 18

$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)
Run Code Online (Sandbox Code Playgroud)

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


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

tmpfile=$(mktemp "${TMPDIR:-/tmp}"/tmp.XXXXXXXX)
tmpdir=$(mktemp -d "${TMPDIR:-/tmp}"/tmp.XXXXXXXX)
Run Code Online (Sandbox Code Playgroud)

上面的命令将创建一个临时文件和目录(分别) in $TMPDIR,或者 in/tmp如果$TMPDIR为空或变量未设置(此变量默认设置为getconf DARWIN_USER_TEMP_DIRmacOS 上的结果)。

  • @cuonglm 什么?POSIX 说(关于它的标准实用程序)“如果应用程序被编写为使用临时文件或中间文件,它们应该使用 *TMPDIR* 环境变量,如果它被设置并代表一个可访问的目录,来选择临时文件的位置。” 怎么不标准? (4认同)
  • @cuonglm,这是来自[标准](http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_04)的直接复制/粘贴。 (2认同)
  • nitpick:如果 `$TMPDIR` 已_set_,${TMPDIR:-/tmp} 仍会扩展为 `/tmp`,但扩展为空字符串。有人可能会争辩说,空的“$TMPDIR”可以被视为表示“当前目录”,但在我看来,最好将空的“$TMPDIR”视为未设置,并强制用户使用“TMPDIR=”指定当前目录。 `,这样就避免了执行`${TMPDIR-/tmp}${TMPDIR:+/}file.tmp.$$`之类的事情 (2认同)