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).
mktemp -d
auf OS X 10.11.5 El Capitan, und es funktionierte wie erwartetfile $(mktemp -d)
:/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp -d -t 'mytmpdir'
unter Linux laufen (getestet mitmktemp
fromcoreutils 8.26
), funktioniert es wie erwartet.Sie müssen eine Vorlage angeben.
mktemp -d /tmp/foo.XXXX
sollte arbeiten. Ich habe noch nie gesehen--directory
. Das--
deutet darauf hin, dass es sich um eine GNU-Erweiterung handelt.quelle
$TMPDIR
wenn verfügbar, tun Sie diesmktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
. Das funktioniert in Bash auf dem Mac und Dash auf Debian, also scheint es portabel zu sein.Wechseln Sie
--directory
zu-d
. Ersteres ist ein GNU-Ismus, aber GNUmktemp
von coreutils unterstützt auch-d
. Dasmktemp
in OS X ist das gleiche wie von BSD,-d
sollte also unter Systemen, die tatsächlich einmktemp
Programm liefern, ziemlich portabel sein .quelle
mktemp -d
, und es funktioniert auch nicht.mktemp
OS X ist eine Vorlage erforderlich. Das Skript, das Sie verwenden, setzt GNU-Konventionen voraus, die eine Standardvorlage verwenden, wenn keine angegeben ist.XXXXX
, in der Vorlage geliefert zu werden, wo als OS X nicht sicher ist, ob es ein kompatibles Vorlagenflag gibt?mktemp
Unter OS X 10.11.5 funktioniert El Capitan für michfile $(mktemp -d)
:/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp
Für BSD (einschließlich OSX ) ist eine Vorlage erforderlich, die jedoch eine beliebige Anzahl vonX
s in der Vorlage zulässt .mktemp
für Linux erfordert keine Vorlage. Wenn jedoch eine Vorlage angegeben ist, muss die Anzahl derX
s 6 betragen.Beachten Sie, dass dies
-t
für GNUmktemp
veraltet ist , so dass ein zukunftssicherer Code wärequelle