我一直听说在 UNIX 机器上找到临时文件夹的正确方法是查看 TMP 环境变量。在编写适用于 Windows 和 Linux 的代码时,我会检查 TEMP 和 TMP。
今天,我发现我的 Ubuntu 安装根本没有那个环境变量。
我知道您似乎总是可以依靠 /tmp 将您的临时文件放入其中,但我知道 TMP 是用户可以告诉您将临时文件放在其他地方的方式。
还是这样吗?
你大概在想TMPDIR
。
这个变量应该代表一个目录的路径名,该路径名可用于需要一个地方来创建临时文件的程序。
创建临时目录的一个好方法是使用 mktemp,例如
mktemp -d -t
这样,您甚至可以确保您的文件名不会与现有文件冲突。
POSIX/FHS 说这/tmp
是临时文件的根目录,尽管有些程序可能会选择检查$TEMP
或$TMP
代替。
与@Chris Lercher 所说的类似,我发现这对我有用:
dirname $(mktemp -u -t tmp.XXXXXXXXXX)
这实际上不会创建临时文件(因为 mktemp 的 -u 标志),但它会为您提供临时文件将被写入的目录。此代码段适用于 OSX 和 Ubuntu(也可能是其他 *nix)。
如果要将其设置为变量,请执行以下操作:
TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`
# Let's look at environment variable's
printenv | sort
# search for TMP var
printenv | grep TMP
$TMP 未声明,因为它是$TMPDIR [答案]
## [ -d /tmp ] && echo 'is true'
export TMP='/tmp' # In order to pass variables to a subshell.
使用 $TMPDIR ,这是 Linux 的正确 var 名称。 注意:/tmp 目录内容(文件)将在关机/重启时被删除,这应该是预期的/期望的。
仅供参考 - ubuntu(我假设其他基于 systemd 的发行版)确实定义了XDG_RUNTIME_DIR
变量 - 这是一个每个用户的临时空间,所以比 /tmp 更安全:
$ echo $XDG_RUNTIME_DIR
/run/user/1000
$ ls -ld $XDG_RUNTIME_DIR
drwx------ 2 ubuntu ubuntu 40 Dec 22 15:18 /run/user/1000
我认为 XDG_RUNTIME_DIR 由 systemd/pam 维护,因此不会在 Docker 或其他非 systemd 环境中设置。
如果你愿意,你可以这样做~/.bashrc
:
export TEMP="${XDG_RUNTIME_DIR:-/tmp}"
参见: https ://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html https://www.freedesktop.org/wiki/
另外 - 在我看来,XDG_RUNTIME_DIR 和 sudo 有一些警告: https ://unix.stackexchange.com/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target -用户