What happened to the TMP environment variable?

核能气质少年 提交于 2019-12-21 03:25:18

问题


I always heard that the proper way to find the temporary folder on a UNIX machine was to look at the TMP environment variable. When writing code that worked on Windows as well as Linux, I would check for TEMP and TMP.

Today, I discovered that my Ubuntu install does not have that environment variable at all.

I know it seems you can always count on /tmp being there to put your temporary files in, but I understood that TMP was the way the user could tell you to put the temporary files someplace else.

Is that still the case?


回答1:


You are probably thinking of TMPDIR.

This variable shall represent a pathname of a directory made available for programs that need a place to create temporary files.




回答2:


A good way to create a temporary directory is using mktemp, e.g.

mktemp -d -t

This way, you can even make sure, that your file names won't collide with existing files.




回答3:


POSIX/FHS says that /tmp is the root for temporary files, although some programs may choose to examine $TEMP or $TMP instead.




回答4:


Similar to what @Chris Lercher said, I find that this works for me:

dirname $(mktemp -u -t tmp.XXXXXXXXXX)

That won't actually create a temp file (because of the -u flag to mktemp) but it'll give you the directory that temp files would be written to. This snippet works on OSX and Ubuntu (probably other *nix too).

If you want to set it into a variable, do something like this:

TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`



回答5:


Global variables command.
# prompt>
printenv | sort
$TMP is not declare(d)
# So, prompt> (i.e. if [ -d /tmp ] is true)
export TMP="/tmp"

export ? In order to pass variables to a subshell.
Also, use $TMPDIR if set, this is the correct var name for Linux. And Yes, I do use the /tmp directory; files will be deleted at least on reboot.!.




回答6:


FYI - ubuntu (and I assume other systemd based distros) does define the XDG_RUNTIME_DIR variable - which is a per-user temp space, so little more secure than just /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

I think XDG_RUNTIME_DIR is maintained by systemd/pam, so it won't be set in Dockers or other non-systemd environments.

You can do something like this in ~/.bashrc if you like:

export TEMP="${XDG_RUNTIME_DIR:-/tmp}"

See: https://standards.freedesktop.org/basedir-spec/basedir-spec-latest.html https://www.freedesktop.org/wiki/

Also - there seems to me some caveats with XDG_RUNTIME_DIR and sudo: https://unix.stackexchange.com/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user



来源:https://stackoverflow.com/questions/2435062/what-happened-to-the-tmp-environment-variable

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!