Folgendes habe ich letztendlich verwendet, um zuverlässig ein temporäres Verzeichnis zu erstellen, das sowohl unter Linux als auch unter Darwin (alle Versionen vor Mac OS X 10.11) ohne Hardcodierung $TMPDIR
oder /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Hintergrund:
Der Befehl GNU mktemp benötigt keine Argumente. Plain mktemp
funktioniert und erstellt eine temporäre Datei im temporären Verzeichnis des Systems.
Plain mktemp -d
erstellt ein Verzeichnis anstelle einer Datei, die Sie unter Linux verwenden möchten.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
Standardmäßig verwendet GNU mktemp die Vorlage tmp.XXXXXXXXXX
für den Namen des Unterverzeichnisses (oder der Datei). Zum Anpassen dieser Vorlage kann die -t
Option verwendet werden.
OSXs mktemp hat keine Standardvorlage und erfordert die Angabe einer Vorlage. Wenn GNU mktemp die Vorlage als -t
Option verwendet, wird dies unter OSX leider als Positionsargument übergeben. Stattdessen hat OSXs mktemp eine -t
Option, die etwas anderes bedeutet. Die -t
Option unter OSX ist als "Präfix" für die Vorlage dokumentiert. Es wird auf erweitert {prefix}.XXXXXXXX
, so dass es die Xs automatisch hinzufügt (z. B. im temporären Verzeichnis mktemp -d -t example
erstellen example.zEJZWCTQ
).
Ich war überrascht , dass in Umgebungen viele Linux zu finden $TMPDIR
ist nicht standardmäßig aktiviert. Viele CLI-Programme unterstützen diese Einstellung, benötigen jedoch weiterhin eine Standardeinstellung für /tmp
. Dies bedeutet, dass die Übergabe $TMPDIR/example.XXXXXXXX
an mktemp oder mkdir gefährlich ist, da sie möglicherweise /example.XXXXXXXX
im Stammverzeichnis der lokalen Festplatte erstellt wird (da $ TMPDIR nicht gesetzt ist und eine leere Zeichenfolge wird).
Unter OSX $TMPDIR
ist immer gesetzt und (zumindest in der Standardshell) nicht gesetzt /tmp
(was ein Symlink zu ist /private/tmp
), sondern zu /var/folders/dx/*****_*************/T
. Was auch immer wir für OSX tun, sollte dieses Standardverhalten berücksichtigen.
Abschließend habe ich Folgendes verwendet, um zuverlässig ein temporäres Verzeichnis zu erstellen, das sowohl unter Linux als auch unter Darwin (Mac OS X) funktioniert, ohne entweder eine Hardcodierung $TMPDIR
oder /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Der erste Teil ist für Linux. Dieser Befehl schlägt unter Darwin (Mac OS X) mit dem Fehlerstatuscode 1
"usage: ..." fehl . Deshalb ignorieren wir stderr und führen stattdessen die Mac-Variante aus. Das mytmpdir
Präfix wird nur auf dem Mac verwendet (wo diese Option festgelegt werden muss).