Voici ce que j’ai utilisé pour créer de manière fiable un répertoire temporaire fonctionnant à la fois sous Linux et Darwin (toutes les versions antérieures à Mac OS X 10.11), sans codage en dur $TMPDIR
ni /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Contexte:
La commande GNU mktemp ne nécessite aucun argument. Plain mktemp
fonctionnera et créera un fichier temporaire dans le répertoire temporaire du système.
Plain mktemp -d
va créer un répertoire à la place d'un fichier, ce que vous voudriez utiliser sous Linux.
(gnu-coreutils)$ man mktemp
> ..
> If DIR is not specified, uses $TMPDIR if set, else /tmp.
> ..
Par défaut, GNU mktemp utilise le modèle tmp.XXXXXXXXXX
pour le nom du sous-répertoire (ou fichier). Pour personnaliser ce modèle, l' -t
option peut être utilisée.
La mktemp d'OSX n'a pas de modèle par défaut et nécessite la spécification d'un modèle. Malheureusement, lorsque GNU mktemp prend le modèle en -t
option, sous OSX, il est passé en argument de position. Au lieu de cela, mktemp d'OSX a une -t
option qui signifie autre chose. L' -t
option sur OSX est documentée en tant que "préfixe" pour le modèle. Il est développé de {prefix}.XXXXXXXX
manière à y ajouter les X automatiquement (par exemple, mktemp -d -t example
créer example.zEJZWCTQ
dans le répertoire temporaire).
J'ai été surpris de constater que dans de nombreux environnements Linux, ce $TMPDIR
n'est pas défini par défaut. De nombreux programmes CLI le prennent en charge une fois défini, mais nécessitent toujours une valeur par défaut pour /tmp
. Cela signifie que passer $TMPDIR/example.XXXXXXXX
à mktemp ou mkdir est dangereux car cela peut produire /example.XXXXXXXX
dans le répertoire racine du disque local (car $ TMPDIR est non défini et devient une chaîne vide).
Sur OSX, $TMPDIR
est toujours défini et (du moins dans le shell par défaut), il est défini non sur /tmp
(ce qui est un lien symbolique /private/tmp
), mais sur /var/folders/dx/*****_*************/T
. Donc, quoi que nous fassions pour OSX, nous devrions respecter ce comportement par défaut.
En conclusion, voici ce que je fini par utiliser pour créer de manière fiable un répertoire temporaire qui fonctionne aussi bien sur Linux et Darwin (Mac OS X), sans hardcoding soit $TMPDIR
ou /tmp
:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
La première partie est pour Linux. Cette commande échouera sur Darwin (Mac OS X) et le code d’état de l’erreur 1
répond par "usage: ...". C'est pourquoi nous ignorons stderr et exécutons à la place la variante Mac. Le mytmpdir
préfixe n'est utilisé que sur Mac (où cette option doit être définie).
mktemp -d
exécuter sur OS X 10.11.5 El Capitan, et cela a fonctionné comme prévufile $(mktemp -d)
::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp -d -t 'mytmpdir'
Linux (testé avecmktemp
fromcoreutils 8.26
), cela fonctionne comme prévu.Vous devez fournir un modèle.
mktemp -d /tmp/foo.XXXX
devrait marcher. Je n'ai jamais vu--directory
. Le--
suggère qu'il s'agit d'une extension GNU.la source
$TMPDIR
quand disponible, faitesmktemp -d "${TMPDIR:-/tmp}"/foo.XXXX
. Cela fonctionne bash sur Mac et dash sous Debian, donc cela semble portable.Changer
--directory
en-d
. Le premier est un GNU-isme, mais GNUmktemp
de coreutils le supporte également-d
. Lemktemp
système d'exploitation sous OS X est identique à celui de BSD, il-d
devrait donc être assez portable parmi les systèmes qui livrent unmktemp
programme.la source
mktemp -d
, et ça ne marche pas non plus.mktemp
sur OS X nécessite un modèle. Le script que vous utilisez suppose les conventions GNU, qui utilisent un modèle par défaut si aucun n'est fourni.XXXXX
à être fourni dans le modèle alors qu’OS X ne sait pas s’il existe un indicateur de modèle compatible.mktemp
sur El Capitan fonctionne pour OS X 10.11.5file $(mktemp -d)
::/var/folders/j4/htlnmbf97vlcdszj7_x8g0vh4k3_fp/T/tmp.JXmsrQnL: directory
mktemp
pour BSD (y compris OSX ) nécessite un modèle, mais il permet un nombre quelconque deX
s dans le modèle.mktemp
pour Linux ne nécessite pas de modèle. Toutefois, si un modèle est spécifié, le nombre deX
s doit être 6.Notez que cette méthode
-t
est obsolète pour GNUmktemp
. Par conséquent, un code plus évolutif seraitla source