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 $TMPDIRni /tmp:
mytmpdir=`mktemp -d 2>/dev/null || mktemp -d -t 'mytmpdir'`
Contexte:
La commande GNU mktemp ne nécessite aucun argument. Plain mktempfonctionnera et créera un fichier temporaire dans le répertoire temporaire du système.
Plain mktemp -dva 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.XXXXXXXXXXpour le nom du sous-répertoire (ou fichier). Pour personnaliser ce modèle, l' -toption 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 -toption, sous OSX, il est passé en argument de position. Au lieu de cela, mktemp d'OSX a une -toption qui signifie autre chose. L' -toption sur OSX est documentée en tant que "préfixe" pour le modèle. Il est développé de {prefix}.XXXXXXXXmanière à y ajouter les X automatiquement (par exemple, mktemp -d -t examplecréer example.zEJZWCTQdans le répertoire temporaire).
J'ai été surpris de constater que dans de nombreux environnements Linux, ce $TMPDIRn'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.XXXXXXXXdans le répertoire racine du disque local (car $ TMPDIR est non défini et devient une chaîne vide).
Sur OSX, $TMPDIRest 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 $TMPDIRou /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 1répond par "usage: ...". C'est pourquoi nous ignorons stderr et exécutons à la place la variante Mac. Le mytmpdirpréfixe n'est utilisé que sur Mac (où cette option doit être définie).