# Comment créer un répertoire temporaire dans un script shell {{METATOC 4-5}} 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 ``` * L'option **-d** crée un répertoire au lieu d'un fichier (par défaut). * L'option **-t ** spécifie un préfixe pour que le répertoire temporaire soit nommé avec une racine fixe et un suffixe aléatoire. Il sera créé à l'emplacement standard du système d'exploitation pour les fichiers temporaires (défini par la variable d'environnement **$TMPDIR**). 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... ```