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 t开发者_Go百科hat 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?
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.
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.
POSIX/FHS says that /tmp
is the root for temporary files, although some programs may choose to examine $TEMP
or $TMP
instead.
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)`
Global variables command. [ Useful ]
# Let's look at environment variable's
printenv | sort
# search for TMP var
printenv | grep TMP
$TMP is not declared, because it's $TMPDIR [ Answer ]
## [ -d /tmp ] && echo 'is true'
export TMP='/tmp' # In order to pass variables to a subshell.
Use $TMPDIR , this is the correct var name for Linux. Notice: the /tmp directory contents (files) will be deleted on Shutdown/REBOOT, This should be expected/desired.
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
精彩评论