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
mktemppour créer des fichiers ou dossiers temporaires. Ne jamais utiliser de noms prévisibles, surtout dans/tmp. - Toujours utiliser
trappour 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 (%mpour le mois,%Mpour les minutes). timeet les pipes : Le comportement detimepeut être surprenant avec des pipelines. Pour mesurer un pipeline entier, il faut souvent le grouper :time { commande1 | commande2; }.
Exercices
-
Script de travail temporaire :
- Écrivez un script qui :
- Crée un dossier temporaire sécurisé.
- Affiche le chemin de ce dossier.
- Crée un fichier
note.txtà l’intérieur avec le contenu “test”. - Met en place un
trappour que le dossier et son contenu soient supprimés à la fin. - Ajoutez un
sleep 20pour avoir le temps de vérifier (dans un autre terminal) que le dossier existe bien pendant l’exécution.
- Écrivez un script qui :
-
Archivage daté :
- Écrivez un script qui crée une archive
tardu dossier/etc. - Le nom de l’archive doit être
backup_etc_JJ-MM-AAAA_HH-MM.tar.gz. Utilisez la commandedatepour formater le nom.
- Écrivez un script qui crée une archive
-
Benchmark simple :
- Utilisez la commande
timepour mesurer et comparer le temps d’exécution des deux commandes suivantes :find /usr -name "lib*"ls -R /usr
- Observez les différences entre le temps
real,useretsys.
- Utilisez la commande