Introduction
Créer un fichier ou un dossier temporaire semble anodin : touch /tmp/monfichier ou mkdir /tmp/mondossier suffiraient. Mais dans un script, ce réflexe pose deux problèmes : un nom prévisible qu’un autre processus (ou un utilisateur malveillant) peut deviner et créer avant vous, et un risque de collision si le script tourne plusieurs fois en parallèle. mktemp règle ça : il génère un nom garanti unique et crée le fichier ou dossier de façon atomique, avec des permissions restreintes par défaut.
Syntaxe de base
mktemp [OPTION]... [TEMPLATE]
Sans argument, mktemp crée un fichier vide dans /tmp et affiche son chemin :
mktemp
# /tmp/tmp.X7fK2pQljZ
Créer un fichier temporaire
fichier=$(mktemp)
echo "Fichier créé : $fichier"
Créer un dossier temporaire
L’option -d bascule en mode dossier :
dossier=$(mktemp -d)
echo "Dossier créé : $dossier"
Personnaliser le nom avec un template
Le template doit se terminer par au moins 3 X consécutifs, remplacés par des caractères aléatoires :
mktemp /tmp/monapp.XXXXXX
mktemp -d /tmp/monapp.XXXXXX
Plus il y a de X, plus le nom est difficile à deviner :
mktemp monbackup.XXXXXXXXXX
Choisir l’emplacement
Par défaut, mktemp utilise /tmp (ou $TMPDIR si elle est définie). Pour cibler un autre répertoire sans toucher au template :
mktemp -p /var/tmp
mktemp -p /var/tmp modele.XXXXXX
Équivalent avec --tmpdir :
mktemp --tmpdir=/var/tmp
Nettoyage automatique dans un script
L’intérêt de mktemp prend tout son sens combiné à trap, pour garantir que le fichier temporaire est supprimé même si le script plante ou est interrompu (Ctrl-C) :
#!/bin/bash
set -euo pipefail
tmpfile=$(mktemp)
trap 'rm -f "$tmpfile"' EXIT
curl -s https://exemple.com/data.json -o "$tmpfile"
jq '.status' "$tmpfile"
trap ... EXIT s’exécute quelle que soit la façon dont le script se termine (fin normale, erreur, signal) — c’est la garantie qu’aucun fichier temporaire ne traîne derrière vous.
Pour un dossier temporaire à nettoyer récursivement :
tmpdir=$(mktemp -d)
trap 'rm -rf "$tmpdir"' EXIT
Prévisualiser sans créer le fichier
L’option -u affiche un nom disponible sans créer le fichier. À réserver aux tests : le nom peut être pris par un autre processus entre l’affichage et l’utilisation réelle.
mktemp -u
Permissions par défaut
mktemp
ls -l /tmp/tmp.X7fK2pQljZ
# -rw------- 1 user user 0 ... /tmp/tmp.X7fK2pQljZ
Un fichier créé par mktemp est lisible et inscriptible uniquement par son propriétaire — pas besoin de chmod manuel après coup.
Commandes fréquentes
mktemp # fichier temporaire dans /tmp
mktemp -d # dossier temporaire dans /tmp
mktemp /tmp/app.XXXXXX # fichier avec préfixe personnalisé
mktemp -d /tmp/app.XXXXXX # dossier avec préfixe personnalisé
mktemp -p /var/tmp # dans un répertoire précis
mktemp -u # nom disponible sans créer le fichier
Conclusion
mktemp évite deux pièges classiques du scripting bash : les noms de fichiers prévisibles, source de vulnérabilités, et les fichiers temporaires oubliés qui finissent par polluer /tmp. Combiné à trap ... EXIT, il devient le réflexe à adopter dès qu’un script bash a besoin d’un espace de travail éphémère — téléchargement, traitement intermédiaire, ou stockage du résultat d’une commande avant de le consommer.
