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).