-->

What happened to the TMP environment variable?

2019-03-22 16:53发布

问题:

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



标签: bash tmp