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 $TMPDIRoder /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Hintergrund:
Der Befehl GNU mktemp benötigt keine Argumente. Plain mktempfunktioniert und erstellt eine temporäre Datei im temporären Verzeichnis des Systems.
Plain mktemp -derstellt 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.XXXXXXXXXXfür den Namen des Unterverzeichnisses (oder der Datei). Zum Anpassen dieser Vorlage kann die -tOption verwendet werden.
OSXs mktemp hat keine Standardvorlage und erfordert die Angabe einer Vorlage. Wenn GNU mktemp die Vorlage als -tOption verwendet, wird dies unter OSX leider als Positionsargument übergeben. Stattdessen hat OSXs mktemp eine -tOption, die etwas anderes bedeutet. Die -tOption 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 exampleerstellen example.zEJZWCTQ).
Ich war überrascht , dass in Umgebungen viele Linux zu finden $TMPDIRist 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.XXXXXXXXan mktemp oder mkdir gefährlich ist, da sie möglicherweise /example.XXXXXXXXim Stammverzeichnis der lokalen Festplatte erstellt wird (da $ TMPDIR nicht gesetzt ist und eine leere Zeichenfolge wird).
Unter OSX $TMPDIRist 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 $TMPDIRoder /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 mytmpdirPräfix wird nur auf dem Mac verwendet (wo diese Option festgelegt werden muss).