Aller au contenu

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é par sh (Dash) passe alors pour correct. -s dash ou -s sh vérifie la portabilité.
  • Les fichiers chargés par source ne sont suivis que si on le lui permet : external-sources=true et source-path=SCRIPTDIR dans .shellcheckrc, avec une directive # shellcheck source=../lib/commun.sh au-dessus du source. Sinon SC1091, et de faux constats sur les variables définies dans la bibliothèque.
  • Une directive # shellcheck disable=SC2086 s'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 par enable= dans .shellcheckrc, par exemple require-double-brackets pour 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.