ShellCheck
À quoi il sert
ShellCheck, écrit en Haskell, lit un script sh, Bash, Dash ou ksh et signale ce qui est faux ou fragile sans jamais l'exécuter : variable non protégée par des guillemets (SC2086), cd dont l'échec n'est pas traité (SC2164), local x=$(commande) qui masque le code de retour (SC2155), construction propre à Bash dans un script déclaré #!/bin/sh (SC3010 et voisins). Chaque constat porte une gravité (error, warning, info, style) et un code stable SCxxxx qui renvoie à une page du wiki : le problème, un exemple corrigé et les exceptions légitimes. Il s'utilise en ligne de commande (shellcheck bin/*), dans l'éditeur et en intégration continue (-f gcc, -f json, -f checkstyle). Ubuntu 24.04 fournit la version 0.9.0, Debian 13 la 0.10.0.
Quand le choisir
Toujours, dès qu'un script shell est versionné : c'est l'équivalent pour le shell de ce que Ruff est pour Python, et il n'existe pas d'alternative sérieuse. Il complète les tests (Bats) sans les remplacer : il voit les défauts de forme et de construction, pas les erreurs de logique. Il ne formate pas le code, rôle de shfmt.
Points d'attention
- Sans ligne
#!ni directive# shellcheck shell=bash, il signale SC2148 puis analyse le fichier comme du Bash : un script lancé en réalité parsh(Dash) passe alors pour correct.-s dashou-s shvérifie la portabilité. - Les fichiers chargés par
sourcene sont suivis que si on le lui permet :external-sources=trueetsource-path=SCRIPTDIRdans.shellcheckrc, avec une directive# shellcheck source=../lib/commun.shau-dessus dusource. Sinon SC1091, et de faux constats sur les variables définies dans la bibliothèque. - Une directive
# shellcheck disable=SC2086s'applique à la commande qui suit, ou au fichier entier si elle est placée juste après le#!. Justifiez chaque désactivation dans un commentaire : c'est une exception relue en revue, pas un moyen de faire taire l'outil. - Les versions ne trouvent pas toutes la même chose : épinglez la version utilisée en CI pour ne pas voir la construction échouer sur un nouveau constat sans changement du code.
- Les vérifications facultatives (
shellcheck --list-optional) s'activent parenable=dans.shellcheckrc, par exemplerequire-double-bracketspour un projet en Bash.
Par où commencer
La leçon Déboguer, analyser et tester du cours Bash pour l'automatisation, qui configure ShellCheck pour le dépôt signalements-outils et le branche dans make verifier et GitHub Actions ; la leçon 1 en montre le premier passage sur un script hérité. Puis le wiki de ShellCheck, une page par code.