问题
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