Retour au cours

temps et fichiers temp

Objectifs

  • Créer des fichiers et dossiers temporaires de manière sûre avec mktemp.
  • Garantir le nettoyage de ces fichiers à la fin du script avec trap.
  • Obtenir et formater la date et l’heure avec la commande date.
  • Mesurer le temps d’exécution d’une commande avec time.

Explications détaillées

Notions clés

Fichiers Temporaires : Le piège de la simplicité

Il est tentant de créer un fichier temporaire avec un nom simple comme /tmp/mon_script.tmp. C’est une très mauvaise pratique et une faille de sécurité potentielle. Si un autre utilisateur ou processus crée ce fichier avant vous (potentiellement avec des droits spécifiques), votre script pourrait lire ou écrire des données incorrectes, ou pire, exécuter des actions dangereuses.

mktemp : La solution sûre

mktemp est la commande standard pour créer des fichiers ou des dossiers temporaires de manière sécurisée. Elle génère un nom de fichier unique et aléatoire, crée le fichier/dossier avec des permissions restrictives, et affiche son nom pour que vous puissiez le stocker dans une variable.

  • mktemp : Crée un fichier temporaire.
  • mktemp -d : Crée un dossier temporaire.

La commande date

La commande date est votre outil pour tout ce qui concerne le temps.

  • date : Affiche la date et l’heure actuelles.
  • date +FORMAT : Permet de formater la sortie. Les formats les plus courants sont :
    • %Y : Année (ex: 2025)
    • %m : Mois (01-12)
    • %d : Jour (01-31)
    • %H : Heure (00-23)
    • %M : Minute (00-59)
    • %S : Seconde (00-59)
    • %F : Raccourci pour %Y-%m-%d.
    • %s : Timestamp Unix (secondes depuis le 1er janvier 1970).

La commande time

time n’est pas une commande externe, mais un mot-clé du shell. Il s’utilise en préfixe d’une autre commande pour mesurer son temps d’exécution.

Il affiche trois valeurs :

  • real : Le temps total écoulé (“temps du mur”).
  • user : Le temps CPU passé en mode utilisateur.
  • sys : Le temps CPU passé en mode noyau (appels système).

Syntaxe / Usages

# Créer un fichier temporaire et stocker son nom
TMP_FILE=$(mktemp)
echo "Fichier créé à : $TMP_FILE"

# Créer un dossier temporaire
TMP_DIR=$(mktemp -d)
echo "Dossier créé à : $TMP_DIR"

# Créer un nom de fichier de log formaté
LOG_FILE="app-$(date +'%Y-%m-%d').log"
echo "Le log du jour est : $LOG_FILE"

# Mesurer le temps d'une commande
time sleep 2

Le motif complet et robuste pour les fichiers temporaires

Ce motif combine mktemp et trap pour une gestion parfaite.

#!/usr/bin/env bash
set -euo pipefail

# On crée le dossier temporaire au début
# L'option -d garantit que c'est bien un dossier
TMP_DIR=$(mktemp -d)

# On programme le nettoyage. Quoi qu'il arrive, ce 'trap' sera exécuté.
# Le 'rm -rf' est sûr car la variable TMP_DIR a été créée par mktemp.
trap 'rm -rf "$TMP_DIR"' EXIT

echo "Dossier de travail temporaire : $TMP_DIR"
# On peut maintenant travailler dedans en toute sécurité
touch "$TMP_DIR/fichier1.txt"
ls -l "$TMP_DIR"

echo "Fin du script. Le nettoyage sera automatique."

Bonnes pratiques

  • Toujours utiliser mktemp pour créer des fichiers ou dossiers temporaires. Ne jamais utiliser de noms prévisibles, surtout dans /tmp.
  • Toujours utiliser trap pour garantir que vos fichiers temporaires sont supprimés, même si le script est interrompu ou rencontre une erreur.
  • Pour les noms de fichiers, préférez le format ISO YYYY-MM-DD (%F), car il se trie naturellement par ordre alphabétique.

Pièges courants

  • Ne pas nettoyer les fichiers temporaires : Ils peuvent s’accumuler et remplir le disque.
  • Les formats de date : Ils sont sensibles à la casse (%m pour le mois, %M pour les minutes).
  • time et les pipes : Le comportement de time peut être surprenant avec des pipelines. Pour mesurer un pipeline entier, il faut souvent le grouper : time { commande1 | commande2; }.

Exercices

  1. Script de travail temporaire :

    • Écrivez un script qui :
      1. Crée un dossier temporaire sécurisé.
      2. Affiche le chemin de ce dossier.
      3. Crée un fichier note.txt à l’intérieur avec le contenu “test”.
      4. Met en place un trap pour que le dossier et son contenu soient supprimés à la fin.
      5. Ajoutez un sleep 20 pour avoir le temps de vérifier (dans un autre terminal) que le dossier existe bien pendant l’exécution.
  2. Archivage daté :

    • Écrivez un script qui crée une archive tar du dossier /etc.
    • Le nom de l’archive doit être backup_etc_JJ-MM-AAAA_HH-MM.tar.gz. Utilisez la commande date pour formater le nom.
  3. Benchmark simple :

    • Utilisez la commande time pour mesurer et comparer le temps d’exécution des deux commandes suivantes :
      1. find /usr -name "lib*"
      2. ls -R /usr
    • Observez les différences entre le temps real, user et sys.