Pièges courants de l'écriture de scripts Bash et comment les éviter
L'écriture de scripts Bash est un outil essentiel pour l'automatisation, l'administration système et le prototypage rapide. Cependant, la flexibilité et la simplicité puissante de Bash peuvent également entraîner des erreurs subtiles, des vulnérabilités de sécurité et des problèmes de portabilité si les meilleures pratiques sont ignorées. Un script robuste doit gérer les entrées inattendues, gérer gracieusement les erreurs et être maintenable.
Ce guide complet explore les pièges les plus courants rencontrés dans l'écriture de scripts Bash, fournissant des solutions applicables, des meilleures pratiques modernes et des exemples de code pour vous aider à écrire des scripts sécurisés, fiables et efficaces.
1. Établir les valeurs par défaut de sécurité des scripts
De nombreux pièges les plus dommageables proviennent d'échecs silencieux. En définissant des options critiques au début de votre script, vous forcez Bash à être plus rigoureux et à arrêter l'exécution immédiatement lors de la rencontre d'erreurs.
Piège : Ignorer les échecs de commandes
Par défaut, Bash continue souvent d'exécuter les commandes suivantes même si une commande précédente dans un pipeline ou une séquence a échoué (a renvoyé un statut de sortie non nul).
Solution : Activer la vérification stricte des erreurs (set -e)
L'utilisation de set -e (errexit) garantit que le script se termine immédiatement si une commande échoue. Cela évite les erreurs en cascade et empêche l'exécution de commandes destructrices basées sur des données erronées.
#!/usr/bin/env bash
set -e # Quitte immédiatement si une commande se termine avec un statut non nul.
# Exemple où set -e aide :
mkdir /tmp/temp_dir_that_exists # Succès (code de sortie 0)
rm -rf non_existent_file # Échec (code de sortie > 0)
# Sans set -e, le script continue ici, masquant potentiellement l'échec.
# Avec set -e, le script se termine immédiatement.
Piège : Utiliser des variables non initialisées
Les erreurs de frappe dans les noms de variables ($FIEL_NAME au lieu de $FILE_NAME) peuvent entraîner l'expansion des variables en une chaîne vide, causant des conséquences potentiellement catastrophiques (par exemple, rm -rf / si une variable de chemin de répertoire n'est pas définie).
Solution : Exiger l'initialisation des variables (set -u)
L'utilisation de set -u (nounset) garantit que le script se termine immédiatement s'il tente d'utiliser une variable non initialisée.
#!/usr/bin/env bash
set -u
echo "Le fichier est : $FILE_PATH"
# Le script échoue ici si FILE_PATH n'a pas été défini précédemment.
2. Pièges liés aux guillemets et à l'expansion des variables
Les variables non mises entre guillemets sont sans doute la plus grande source de bugs de scripts, en particulier lorsqu'il s'agit de noms de fichiers ou de chemins contenant des espaces.
Piège : Oublier de mettre les variables entre guillemets
Lorsqu'une variable contenant des espaces n'est pas mise entre guillemets, Bash traite la valeur de la variable comme plusieurs arguments distincts.
Solution : Toujours mettre les expansions de variables entre guillemets doubles
Utilisez des guillemets doubles (`