Table of Contents

Comment créer un répertoire temporaire dans un script shell

Parfois, lorsqu'on fait un script shell, on souhaite enregistrer temporairement des fichiers quelque part, cloner temporairement un référentiel Git, etc. Ces données temporaires doivent être supprimées une fois le script terminé.

Créer un répertoire temporaire

On peut utiliser la commande mktemp pour créer un fichier ou un répertoire temporaire à l'emplacement approprié en fonction du système d'exploitation :

mktemp -d -t mon-script
/var/dossiers/a0/8alqx_yap8dl30000ap/T/mon-script.J3Fv0NWl

Le répertoire est créé avec le mode 0700 par défaut, ce qui signifie qu'il ne doit être accessible que par l'utilisateur :

ls -la "$tmp_dir"
total 0
drwx------ 2 vous votre groupe 64 6 février 17:19 .
drwx------@ 98 vous votre groupe 3136 6 février 17:19 ..

On peut ce répertoire temporaire dans une variable :

tmp_dir=$( mktemp -d -t mon-script )

Définir une fonction de nettoyage

Cette fonction nettoiera le répertoire temporaire, en s'assurant d'abord qu'il existe (en cas d'échec de la commande mktemp) :

clean_up() {
  test -d "$tmp_dir" && rm -fr "$tmp_dir"
}

Nettoyer automatiquement à la sortie

On ne veut pas appeler cette fonction de nettoyage manuellement, mais le script pourrait échouer avant qu'il ne soit terminé, il pourrait recevoir un signal et sortir.

Cependant, On peut utiliser la commande trap intégrée de Bash pour intercepter le pseudo-signal EXIT. Le script recevra ce signal lorsqu'il se fermera, que ce soit avec succès, sans succès ou en raison d'une interruption (par exemple, l'utilisateur appuyant sur Ctrl-C).

trap "clean_up $tmp_dir" EXIT

Version complète du script

On peut maintenant écrire le reste du script et mettre ce qu'on veut dans le répertoire temporaire, en sachant qu'il sera automatiquement nettoyé à la fin.

Voici la version complète :

#!/usr/bin/env bash

clean_up() {
  test -d "$tmp_dir" && rm -fr "$tmp_dir"
}

tmp_dir=$( mktemp -d -t my-script )
trap "clean_up $tmp_dir" EXIT

echo Do the magic...