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 $TMPDIRo /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Sfondo:
Il comando GNU mktemp non richiede argomenti. Plain mktempfunzionerà e crea un file temporaneo nella directory temporanea del sistema.
Plain mktemp -dcreerà 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.XXXXXXXXXXper il nome della sottodirectory (o del file). Per personalizzare questo modello, è -tpossibile 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 -topzione, su OSX questo viene passato come argomento posizionale. Invece, mktemp di OSX ha -tun'opzione che significa qualcos'altro. L' -topzione su OSX è documentata come "prefisso" per il modello. Viene espanso in {prefix}.XXXXXXXX, quindi aggiunge automaticamente le X (ad es. mktemp -d -t examplePotrebbe creare example.zEJZWCTQnella 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 $TMPDIRo /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 1risponde con "utilizzo: ...". Ecco perché ignoriamo stderr e invece eseguiamo la variante per Mac. Il mytmpdirprefisso viene utilizzato solo su Mac (dove è necessario impostare tale opzione).