Écrire un script fiable : bonnes pratiques
Objectifs de la séance
- Comprendre pourquoi le quoting des variables est une question de sécurité, pas seulement de style
- Utiliser
set -eupour rendre un script plus strict face aux erreurs - Structurer un script selon un plan reconnaissable (en-tête, options, constantes, fonctions, programme principal)
- Distinguer sortie standard et sortie d'erreur, et utiliser des codes de sortie explicites
- Découvrir
shellchecket le mode débogagebash -x - Faire le bilan des 6 séances précédentes de Bash niveau 1
Notions théoriques
Le quoting : la règle numéro 1
Nous avons déjà recommandé, séance après séance, d'entourer vos variables de guillemets doubles. Voici pourquoi c'est réellement important, et pas une simple habitude esthétique.
Imaginez ce script :
rm -rf $dossier/*
Si la variable dossier n'a jamais été définie (faute de frappe dans son nom, argument manquant...), elle est vide. La commande devient alors rm -rf /*, qui tente de supprimer l'intégralité du système de fichiers.
Avec des guillemets, rm -rf "$dossier"/*, une variable vide donne rm -rf "/*" — toujours risqué, mais le comportement reste au moins prévisible et le problème est plus facile à anticiper avec les vérifications vues en séance 4.
Le quoting protège aussi contre les espaces et les caractères spéciaux dans les valeurs de vos variables, comme nous l'avons vu dès la séance 2.
set -e et set -u
Deux options, à placer juste après le shebang, rendent un script bien plus strict :
#!/bin/bash
set -eu
set -e: le script s'arrête immédiatement dès qu'une commande échoue (code de retour différent de 0), au lieu de continuer comme si de rien n'était.set -u: le script s'arrête si vous utilisez une variable qui n'a jamais été définie — cela aurait évité l'exemple catastrophique ci-dessus.
Vous croiserez aussi set -o pipefail, qui améliore la détection d'erreur dans une chaîne de commandes reliées par des tubes (|). Nous l'aborderons au niveau 2, avec les pipelines.
set -e ne remplace pas les vérifications explicites vues en séance 4 : certaines commandes (dans un if, par exemple) ont le droit d'échouer sans arrêter le script, c'est même tout l'intérêt d'un test. set -e est un filet de sécurité pour les échecs inattendus, pas un substitut à une gestion d'erreur réfléchie.
La structure canonique d'un script propre
À ce stade du cours, un bon script d'administration suit un plan reconnaissable :
- Shebang (
#!/bin/bash) - En-tête commentée (rôle, auteur)
set -eu- Constantes
- Fonctions
- Programme principal
exit 0final explicite
Des codes de sortie cohérents
Il est utile d'adopter une convention personnelle, par exemple :
0: tout s'est bien passé1: erreur d'usage (mauvais arguments)2: erreur pendant l'exécution (commande qui a échoué)
Un script appelant un autre script peut ainsi réagir différemment selon le code reçu.
Sortie standard et sortie d'erreur
Toute commande Linux dispose de deux canaux de sortie distincts : la sortie standard (le résultat normal) et la sortie d'erreur (les messages de diagnostic). Rediriger un message vers la sortie d'erreur se fait avec >&2 :
echo "Erreur : dossier introuvable" >&2
Cela permet de séparer, par exemple avec ./script.sh > resultat.txt 2> erreurs.txt, ce qui est un résultat exploitable de ce qui est un message de diagnostic.
Déboguer un script
bash -x script.shexécute le script en affichant chaque commande avant de la lancer, avec les variables déjà remplacées.- À l'intérieur d'un script,
set -xactive ce mode pour la suite, etset +xle désactive — pratique pour n'observer qu'une portion suspecte.
shellcheck
shellcheck est un analyseur qui relit votre script et signale les erreurs fréquentes (variable non quotée, faute de syntaxe, piège classique), un peu comme un correcteur orthographique pour le Bash. Sous Debian :
sudo apt install shellcheck
shellcheck sauvegarde.sh
Prenez l'habitude de lancer shellcheck sur chacun de vos scripts avant de les considérer terminés — c'est un réflexe autant apprécié en entreprise qu'un linter pour un langage de développement classique.