Aller au contenu

shfmt

À quoi il sert

shfmt, écrit en Go, analyse un script shell puis le réécrit dans une forme canonique : indentation, place des then et des do, espaces autour des opérateurs. Il est au shell ce que gofmt est à Go. Les options règlent le style : -i 2 indente par deux espaces (0, la valeur par défaut, indente par tabulations), -ci indente les branches de case, -bn autorise && et | en début de ligne, -sr met une espace après les redirections, -s simplifie certaines constructions. -l liste les fichiers mal formatés, -d affiche la différence et échoue, ce qui en fait une vérification de CI, et -w réécrit les fichiers. -ln choisit le dialecte (bash, posix, mksh, bats) ; par défaut, shfmt le déduit de l'extension puis de la ligne #!. Ubuntu 24.04 et Debian 13 fournissent la version 3.8.0.

Quand le choisir

Dès qu'un dépôt contient des scripts écrits par plusieurs personnes : un format imposé par un outil supprime les discussions de style en revue et rend les différences Git lisibles. Il ne remplace pas ShellCheck, qui trouve les erreurs : un script faux reste faux une fois bien formaté.

Points d'attention

  • shfmt lit les fichiers .editorconfig du projet ; si vous passez une option de formatage sur la ligne de commande, il les ignore. Choisissez un seul endroit pour le style, de préférence .editorconfig, versionné.
  • Un fichier .sh est traité comme du shell POSIX, sauf si sa ligne #! désigne Bash : un script Bash nommé .sh sans #! correcte est mal analysé.
  • Lancez-le en mode vérification (shfmt -d .) en CI, et en mode écriture (-w) seulement sur le poste ou dans un crochet de pré-commit.
  • Reformater tout un dépôt d'un coup produit une grosse différence : faites-le dans un commit à part, sans autre changement, pour garder un historique lisible.

Par où commencer

La leçon Déboguer, analyser et tester du cours Bash pour l'automatisation, qui place shfmt aux côtés de ShellCheck et de Bats dans make verifier. Puis la page de manuel de shfmt.