Rendre ses scripts « Bash » plus fiables

Magazine
Marque
Linux Pratique
Numéro
133
Mois de parution
septembre 2022
Spécialité(s)


Résumé

Les scripts « Bash » sont omniprésents et forment un outil fabuleux d’automatisation. Malheureusement, ils sont souvent, à tort, vus comme fragiles. Cependant, il existe des options et des techniques, simples d’utilisation, qui permettent de rendre l’exécution de ceux-ci aussi robuste et fiable que nécessaire.


Body

Dans cet article, nous allons évoquer quelques techniques assez avancées de l’utilisation de « Bash », mais également recommander des bonnes pratiques, qui sont précieuses pour assurer la fiabilité d’un script.

1. Syntaxe associée à l’utilisation de variables

La syntaxe de « Bash » (comme tous les « Shell ») est flexible dans la manière de référencer les variables. Cependant, pour que vos scripts soient robustes, il est recommandé de privilégier la syntaxe suivante lors de l’expansion de celles-ci [1] :

$ echo "${maVariable}"

Cette approche facilite d’une part le travail d’interprétation du « Bash », mais assure également que le résultat de l’opération sera toujours considéré comme un élément unique pour la suite. Ainsi, même si cette valeur contient des espaces (le caractère, par défaut, de séparation des commandes), le résultat est interprété comme un seul « mot » pour Bash.

(Notons que ceci est garanti par la présence de guillemets autour de l’expansion, non par l’utilisation des accolades, qui sont elles favorisées ici à des fins de lisibilité).

2. Exécution « strict »

L’interpréteur « Bash » en lui-même est un logiciel élaboré, qui offre de nombreux paramétrages de son exécution. On peut donc le configurer afin de le rendre plus exigeant et ainsi s’assurer que le script sera plus robuste.

Pour mettre en place ce mode dit « strict », il suffit d’ajouter l’en-tête ci-dessous au début du fichier :

#!/bin/bash
set -euo pipefail

Nous allons expliciter ci-dessous le fonctionnement et l’intérêt des différentes options précisées ici.

2.1 Sortie immédiate en cas d’erreur (-e)

L’instruction -e indique à l’interprétateur qu’il doit interrompre immédiatement son exécution, dès qu’une commande retourne une valeur de statut différente de zéro. Ceci évite le phénomène désagréable d’un script qui continue son exécution alors qu’une commande ou une ligne de commandes vient d’échouer.

$ grep -ie Error test_results.txt
$ echo ${?}
1

Attention, cependant, la notion d’erreur peut varier selon les utilitaires utilisés. Dans certains cas, une commande retournant une valeur différente de zéro ne signifie pas forcément une erreur (comme illustré dans l’exemple ci-dessus). Au sein du script, on peut heureusement désactiver et réactiver, au besoin, cette fonctionnalité :

set +e
set -e

À noter que cette stratégie est particulièrement appréciable avec les commandes imbriquées. En effet, si une erreur surgit au milieu d’un traitement, elle peut être, par défaut, complètement ignorée et masquée. Avec cette option, le script, à l’inverse, s’arrête immédiatement.

2.2 Interdire les variables indéfinies

Avec l’option -u, l’interpréteur de « Bash » interdit le référencement d’une variable non définie auparavant. C’est non seulement une approche rigoureuse (déclarer toutes variables utilisées dans le script), mais elle se révèle très pratique pour détecter d’éventuelles typos :

#!/bin/bash
firstName="Romain »
fullName="${firrtName} Pelisse »
echo "${fullName}"

Avec l’option -u ajoutée à l’entête du script ci-dessus, celui-ci s’interrompt lors de l’exécution à la dernière ligne, en indiquant, clairement, la source de l’erreur (au lieu de continuer et de produire un résultat erroné) :

/tmp/err.txt: ligne 6: firrtName : variable sans liaison

Attention, ceci interdit le référencement direct des variables de gestion des arguments : ${1}, ${2} ! En effet, celles-ci ne sont pas définies dans le script et leur utilisation entraînera son interruption.

Pour éviter ce problème, il suffit de redéfinir les arguments d’entrée, sous forme de variables internes au script, avant d’utiliser l’option -u :

#!/bin/bash
...
name=${1:-}
set -u

2.3 Gestion des erreurs dans les commandes imbriquées

Comme évoqué à l’instant, dans une série de commandes imbriquées, une erreur lors de l’exécution de l’une d’elles n’interrompt pas le script (par défaut). Et si l’option -e ne peut pas être utilisée, il peut être nécessaire, pour assurer la robustesse du traitement, de vérifier que l’ensemble des commandes se sont exécutées sans erreur. C’est tout l’intérêt de l’option -pipefail :

$ set -o pipefail
$ grep some-string /non/existent/file | sort
$ grep: /non/existent/file: No such file or directory
$ echo $?
2

Sur ce point, on notera également que l’on peut utiliser une variable interne de « Bash », un tableau nommé PIPESTATUS, qui permet de vérifier le statut d’exécution de chaque utilitaire impliqué dans la commande imbriquée :

$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"

3. Shellcheck

Une dernière astuce, simple, pour améliorer la robustesse et la qualité de ses scripts et d’en faire valider le contenu par l’outil shellcheck. Celui-ci est un analyseur qui détecte de nombreux anti-patterns et autres erreurs régulièrement commises lors de la conception d’un script.

L’outil est disponible, sous forme de paquet logiciel, sur la plupart des distributions.

$ shellcheck my_script

Conclusion

Avec la mise en place de ces quelques pratiques et techniques, l’exécution de scripts « Bash » devient plus rigoureuse et robuste. En les respectant systématiquement, lors de la conception, les scripts perdront rapidement leur réputation de fragilité et les automatisations réalisées à l’aide de ceux-ci, deviendront nettement plus fiables.

Références

[1] « Script Shell Matter » : https://dev.to/thiht/shell-scripts-matter

[2] ShellCheck : https://www.shellcheck.net/



Article rédigé par

Par le(s) même(s) auteur(s)

Automatiser le déploiement d'un MOM avec Wildfly et Ansible

Magazine
Marque
Linux Pratique
Numéro
137
Mois de parution
mai 2023
Spécialité(s)
Résumé

Dans de nombreuses organisations et grandes entreprises, les solutions logicielles de gestion de messages (ou MOM pour « Messaging Oriented Middleware ») sont omniprésentes. Dans cet article, nous proposons donc d’évoquer le déploiement d’une telle solution, à l’aide du serveur Java open source, Wildfly, et de manière entièrement automatisée grâce à Ansible…

Getting Things Done... avec Bash !

Magazine
Marque
Linux Pratique
HS n°
Numéro
57
Mois de parution
avril 2023
Spécialité(s)
Résumé

Depuis la parution de l’ouvrage du même nom, il y a 22 ans, la méthodologie Getting Things Done a fait son bonhomme de chemin. L’utilisant depuis plus de dix ans, nous vous proposons d’en faire, dans cet article, non pas une présentation détaillée, mais un retour d’expérience sur comment nous l’utilisons au quotidien et, en particulier, comment notre interpréteur shell favori, Bash, est au cœur de son outillage !

Introduction à l’automatisation avec Ansible

Magazine
Marque
Linux Pratique
HS n°
Numéro
57
Mois de parution
avril 2023
Spécialité(s)
Résumé

La croissance constante de la taille des systèmes d'information, comme la démultiplication de leurs environnements d'exécution, a rendu essentielle l'automatisation de toutes tâches d'administration de ceux-ci. Cet article propose donc d'introduire son lecteur à l'une des solutions d'automatisation la plus appréciée : Ansible.

Les derniers articles Premiums

Les derniers articles Premium

Les nouvelles menaces liées à l’intelligence artificielle

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Sommes-nous proches de la singularité technologique ? Peu probable. Même si l’intelligence artificielle a fait un bond ces dernières années (elle est étudiée depuis des dizaines d’années), nous sommes loin d’en perdre le contrôle. Et pourtant, une partie de l’utilisation de l’intelligence artificielle échappe aux analystes. Eh oui ! Comme tout système, elle est utilisée par des acteurs malveillants essayant d’en tirer profit pécuniairement. Cet article met en exergue quelques-unes des applications de l’intelligence artificielle par des acteurs malveillants et décrit succinctement comment parer à leurs attaques.

Migration d’une collection Ansible à l’aide de fqcn_migration

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Distribuer du contenu Ansible réutilisable (rôle, playbooks) par l’intermédiaire d’une collection est devenu le standard dans l’écosystème de l’outil d’automatisation. Pour éviter tout conflit de noms, ces collections sont caractérisées par un nom unique, formé d’une espace de nom, qui peut-être employé par plusieurs collections (tel qu'ansible ou community) et d’un nom plus spécifique à la fonction de la collection en elle-même. Cependant, il arrive parfois qu’il faille migrer une collection d’un espace de noms à un autre, par exemple une collection personnelle ou communautaire qui passe à un espace de noms plus connus ou certifiés. De même, le nom même de la collection peut être amené à changer, si elle dépasse son périmètre d’origine ou que le produit qu’elle concerne est lui-même renommé.

Mise en place d'Overleaf Community pour l’écriture collaborative au sein de votre équipe

Magazine
Marque
Contenu Premium
Spécialité(s)
Résumé

Si vous utilisez LaTeX pour vos documents, vous connaissez vraisemblablement Overleaf qui vous permet de rédiger de manière collaborative depuis n’importe quel poste informatique connecté à Internet. Cependant, la version gratuite en ligne souffre de quelques limitations et le stockage de vos projets est externalisé chez l’éditeur du logiciel. Si vous désirez maîtriser vos données et avoir une installation locale de ce bel outil, cet article est fait pour vous.

Les listes de lecture

8 article(s) - ajoutée le 01/07/2020
Découvrez notre sélection d'articles pour faire vos premiers pas avec les conteneurs, apprendre à les configurer et les utiliser au quotidien.
11 article(s) - ajoutée le 02/07/2020
Si vous recherchez quels sont les outils du DevOps et comment les utiliser, cette liste est faite pour vous.
8 article(s) - ajoutée le 02/07/2020
Il est essentiel d'effectuer des sauvegardes régulières de son travail pour éviter de perdre toutes ses données bêtement. De nombreux outils sont disponibles pour nous assister dans cette tâche.
Voir les 58 listes de lecture

Abonnez-vous maintenant

et profitez de tous les contenus en illimité

Je découvre les offres

Déjà abonné ? Connectez-vous