Che cosa è successo alla variabile d'ambiente TMP?
Domanda
Ho sempre sentito dire che il modo corretto per trovare la cartella temporanea su una macchina UNIX è stato quello di esaminare la variabile di ambiente TMP. Quando si scrive il codice che ha lavorato su Windows così come Linux, vorrei verificare per TEMP e TMP.
Oggi, ho scoperto che la mia installazione di Ubuntu non ha che variabile di ambiente a tutti.
So che sembra si può sempre contare su / tmp essere lì per mettere i file temporanei, ma ho capito che TMP era il modo in cui l'utente potrebbe dirvi di mettere i file temporanei da qualche altra parte.
E 'ancora il caso?
Soluzione
Probabilmente state pensando di TMPDIR
.
Questa variabile deve rappresentare un percorso di una directory messo a disposizione per i programmi che hanno bisogno di un posto per creare i file temporanei.
Altri suggerimenti
Un buon modo per creare una directory temporanea sta usando mktemp, per es.
mktemp -d -t
In questo modo, si può anche fare in modo che i nomi di file non si scontrerà con i file esistenti.
POSIX / FHS dice che /tmp
è la radice per i file temporanei, anche se alcuni programmi possono decidere di esaminare $TEMP
o $TMP
posto.
Simile a quello che ha detto @ Chris Lercher, trovo che questo funziona per me:
dirname $(mktemp -u -t tmp.XXXXXXXXXX)
Non sarà effettivamente creare un file temporaneo (a causa della bandiera -u per mktemp), ma vi darà la directory che file temporanei sarebbero stati scritti. Questo frammento di codice funziona su OSX e Ubuntu (probabilmente altri * nix troppo).
Se si desidera impostare in una variabile, fare qualcosa di simile:
TMPDIR=`dirname $(mktemp -u -t tmp.XXXXXXXXXX)`
# prompt>
printenv | sort
$ TMP non è dichiarare (d)
# So, prompt> (i.e. if [ -d /tmp ] is true)
export TMP="/tmp"
export
? Per passare variabili ad una subshell.
Inoltre, utilizzare $ TMPDIR se impostato, questo è il nome var corretto per Linux E sì, io uso la directory / tmp.; i file saranno cancellati almeno al riavvio.!.
A proposito - ubuntu (e presumo altre distribuzioni basate systemd) non definire la variabile XDG_RUNTIME_DIR - che è uno spazio temporaneo per utente, in modo da po 'più sicuro di un semplice / tmp:
$ echo $ XDG_RUNTIME_DIR / Eseguire / user / 1000
$ ls -ld $ XDG_RUNTIME_DIR drwx ------ 2 ubuntu ubuntu 40 dic 22 15:18 / run / user / 1000
Credo XDG_RUNTIME_DIR è mantenuto da systemd / pam, in modo da Non sarà impostato in Dockers o in altri ambienti non systemd.
Si può fare qualcosa di simile in ~ / .bashrc se ti piace:
export TEMP = "$ {XDG_RUNTIME_DIR: - / tmp}"
Vedi: https://standards.freedesktop.org/basedir-spec/basedir- spec-latest.html https://www.freedesktop.org/wiki/
Inoltre - non mi sembra che alcuni avvertimenti con XDG_RUNTIME_DIR e sudo: https: // unix.stackexchange.com/questions/346841/why-does-sudo-i-not-set-xdg-runtime-dir-for-the-target-user