Quello che segue è quello che ho finito per creare in modo affidabile una directory temporanea che funziona sia su Linux che su Darwin (tutte le versioni precedenti a Mac OS X 10.11), senza hardcoding $TMPDIR
o /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Sfondo:
Il comando GNU mktemp non richiede argomenti. Plain mktemp
funzionerà e crea un file temporaneo nella directory temporanea del sistema.
Plain mktemp -d
creerà una directory anziché un file, che è quello che vorresti usare su Linux.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
Per impostazione predefinita, GNU mktemp usa il modello tmp.XXXXXXXXXX
per il nome della sottodirectory (o del file). Per personalizzare questo modello, è -t
possibile utilizzare l' opzione.
Mktemp di OSX non ha un modello predefinito e richiede un modello da specificare. Sfortunatamente, dove GNU mktemp accetta il modello come -t
opzione, su OSX questo viene passato come argomento posizionale. Invece, mktemp di OSX ha -t
un'opzione che significa qualcos'altro. L' -t
opzione su OSX è documentata come "prefisso" per il modello. Viene espanso in {prefix}.XXXXXXXX
, quindi aggiunge automaticamente le X (ad es. mktemp -d -t example
Potrebbe creare example.zEJZWCTQ
nella directory temp).
Sono stato sorpreso di scoprire che in molti ambienti Linux non$TMPDIR
è impostato di default. Molti programmi CLI lo supportano quando sono impostati, ma necessitano ancora di un valore predefinito per . Ciò significa che passare a mktemp o mkdir è pericoloso perché può produrre nella directory principale del disco locale (a causa del fatto che $ TMPDIR non viene impostato e diventa una stringa vuota)./tmp
$TMPDIR/example.XXXXXXXX
/example.XXXXXXXX
Su OSX, $TMPDIR
è sempre impostato e (almeno nella shell predefinita) non è impostato su /tmp
(che è un collegamento simbolico a /private/tmp
) ma su /var/folders/dx/*****_*************/T
. Quindi, qualunque cosa facciamo per OSX, dovrebbe rispettare quel comportamento predefinito.
In conclusione, il seguente è quello che ho finito per usare a creare in modo affidabile una directory temporanea che funziona sia su Linux e Darwin (Mac OS X), senza hardcoding sia $TMPDIR
o /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
La prima parte è per Linux. Questo comando fallirà su Darwin (Mac OS X) con il codice di stato dell'errore che 1
risponde con "utilizzo: ...". Ecco perché ignoriamo stderr e invece eseguiamo la variante per Mac. Il mytmpdir
prefisso viene utilizzato solo su Mac (dove è necessario impostare tale opzione).