/tmp 保证存在吗?

Ayu*_*ush 43 tmp

/tmp在写入其中的文件之前是否需要检查和创建?假设没有人跑,sudo rm -rf /tmp因为这是一种非常罕见的情况

Ste*_*itt 61

FHS是任务/tmp存在,如同POSIX所以你可以依靠它在那里(至少在兼容的系统,但实际上它几乎是保证是出现在类Unix系统)。但您不应该这样做:系统管理员或用户可能更喜欢其他位置的临时文件。有关更多详细信息,请参阅在多个平台上查找正确的 tmp 目录


Gil*_*il' 46

在实践中,/tmp几乎可以保证存在。但是,即使它存在,也不意味着您应该将临时文件放在那里。

标准惯例是使用TMPDIR环境变量。如果存在,它指向一个存放临时文件的目录。如果它不存在,请将临时文件放入/tmp.

在 shell 脚本中,您可以将其"${TMPDIR:-/tmp}"用作临时文件位置:TMPDIR如果它已设置¹,则扩展为值,/tmp否则为。或者您可以TMPDIR使用命令有条件地设置以防未设置

: "${TMPDIR:=/tmp}"
Run Code Online (Sandbox Code Playgroud)

然后在里面创建临时文件"$TMPDIR"

请注意,任何应用程序都可以在/tmp或下创建文件$TMPDIR。此外,该目录可能会在用户之间共享,因此您在创建文件时需要注意权限。许多系统(Linux、*BSD)都有一个命令mktemp,可以在正确的目录中安全地创建文件。mktemp用于创建临时文件和目录通常是一个好主意——尤其是从 shell 脚本中,由于符号链接攻击的可能性,不可能在共享目录中安全地创建文件(mkdir如果您正确处理错误,那很好)。

¹和非空——如果变量是空的,那么它无论如何都不能使用,如果空或未设置的变量应该包含文件名,那么以相同的方式处理它们通常是个好主意。

  • 也许您可以提到用户必须预料到文件名冲突。因此,IMO 在 /tmp 中创建文件的唯一推荐方法是命令 `mktemp`,这也应该自动处理 $TMPDIR"。 (11认同)
  • 很遗憾地发现 `mktemp` 不在 POSIX 中,尽管它已经在大多数流行的操作系统中使用,例如 [GNU (Linux)](https://www.gnu.org/software/coreutils/manual/html_node/mktemp-invocation .html), [OpenBSD](http://man.openbsd.org/man1/mktemp.1), [FreeBSD](https://www.freebsd.org/cgi/man.cgi?query=mktemp&apropos=0&sektion =1&manpath=FreeBSD+11.0-stable&arch=default&format=html) 和 [macOS](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/mktemp.1.html)。 (3认同)

mat*_*tdm 6

虽然它很可能存在,但您应该检查另一个原因:它不能保证很大。在许多系统上,/tmp由 RAM 而不是磁盘支持,并且可能限制为几 GB。(在 Fedora 系统上,默认情况下它是 RAM 的一半。)因此,您不仅应该检查是否存在,还应该检查是否有空间放置您打算放置的任何内容。

如果您有大的东西,请使用/var/tmp/.

  • 我不确定在继续之前检查可用空间是否是“Unix 方式”,特别是因为它并不总是知道您需要多少空间。在任何情况下,您都必须准备好优雅地处理写入错误,以防文件系统变满;如果您打算这样做,那么通过进行容易出现假阴性和假阳性的预先检查有什么好处? (2认同)
  • 我猜这取决于您处理失败情况的优雅程度。重点是不要假设`/tmp` 可以处理大文件。假设这是通过中速链接下载 10GB 的内容。“Unix方式”与否,发现几个小时无法正常工作是非常痛苦的。 (2认同)