Agence web » Actualités du digital » Comment utiliser shfmt pour mieux formater les scripts Shell –

Comment utiliser shfmt pour mieux formater les scripts Shell –

Shell Bash

Oui, le formatage est nécessaire et aide énormément à comprendre un code complexe. Cependant, pour ceux qui écrivent souvent des scripts shell, une double vérification du formatage peut devenir une tâche fastidieuse. Cet article vous montrera comment raccourcir le travail en utilisant shfmt!

Quel est shfmt?

Développé par Dustin Krysak, shfmt est un formateur, un analyseur et un interpréteur Shell. Le projet lui-même est hébergé sur GitHub et dispose d’un fichier README clair et d’un référentiel présenté proprement. L’outil a été développé en Go et prend en charge les shells POSIX, Bash et mksh. Cela fait de shfmt un programme vraiment universel au lieu d’être limité à Bash uniquement.

Installation shfmt

À installer shfmt sur votre distribution Linux compatible snap (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:

sudo snap install shfmt

Installation de shfmt avec snap

À installer shfmt sur votre distribution Linux basée sur RedHat / Yum (comme RHEL, Centos et Fedora), exécutez les commandes suivantes dans votre terminal:

Remarque: vous devrez redémarrer votre machine (ou vous déconnecter et vous reconnecter) après avoir exécuté la première commande et avant d’exécuter les commandes suivantes.

sudo dnf install snapd
sudo snap install snap-store
sudo snap install shfmt

Sur RHEL et Centos, vous devrez peut-être également installer d’abord le référentiel EPEL.

Utilisation de shfmt

Une fois le package snap installé, vous pouvez commencer à utiliser shfmt.

shfmt - un outil compact pour le formatage Shell

Définissons un script très mal formaté et écrit comme test.sh comme suit:

#!/bin/bash__
 echo 'not well formatted line 1'
  echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '            
func() {
  echo 'more unneeded spaces'
              echo 'way out'
 }
func ()

Il y a plusieurs problèmes avec ce script, le plus important étant sa mise en forme. Mais il y a aussi une erreur / bogue dans le script: l’appel de fonction func sur la dernière ligne est suivie de plusieurs crochets. Un appel de fonction dans Bash (plutôt qu’une définition de fonction) ne doit avoir que le nom, pas les crochets. C’est un peu plus haut que la définition de fonction appropriée s’est produite.

Voyons quoi shfmt pense à cela.

shfmt test.sh

Un exemple pratique pour shfmt avec une erreur lors d'un appel de fonction incorrect

Alors que la sortie semble un peu cryptique, notez que le terme foo (utilisé ici) et bar (non utilisé ici maintenant) sont souvent utilisés dans les cercles informatiques pour indiquer / représenter tout idiome ou élément similaire. foo ici se réfère vraiment à func.

Même dans ce cas, le message reste un peu énigmatique jusqu’à ce que nous nous rendions compte, en regardant la dernière ligne, que ce qui se passe réellement est le début d’une définition de fonction (et non un appel de fonction) parce que les deux crochets ont été inclus. Ceci explique alors pourquoi le message nous dit que quelque chose de plus est attendu; doit être suivi d’une déclaration. shmft cherche ici quelque chose comme func(){ some_command[s]; }.

Bingo! Cela augmente la fonctionnalité de shfmt être un outil de validation / vérificateur de script shell, bien que probablement loin d’être complet comme celui dont nous avons parlé en utilisant shellcheck pour trouver et corriger les bogues de script. Encore, très pratique en effet!

Nous corrigeons notre bug et maintenant le script d’entrée test.sh se lit comme suit:

#!/bin/bash__
 echo 'not well formatted line 1'
  echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '            
func() {
  echo 'more unneeded spaces'
              echo 'way out'
 }
func

Nous exécutons à nouveau shfmt par rapport au code et recevez une sortie beaucoup plus appropriée et bien formatée:

Utilisation d'un retrait de deux espaces avec shfmt en utilisant l'option -i

Génial. Nous pouvons maintenant pousser ce niveau plus loin et indiquer à shfmt que nous aimerions utiliser une largeur de retrait / tabulation de deux espaces au lieu d’une tabulation complète. J’écris toujours du code en utilisant deux espaces comme largeur de retrait / tabulation, et j’utilise un espace supplémentaire où une commande sur la ligne suivante est étroitement liée à la précédente, comme une commande continue, etc. bien que cela ne se produise pas souvent. Depuis plus de 10 ans, j’ai trouvé que les deux espaces étaient l’idéal des projets personnels et partagés.

Chacun et chaque projet doit trouver sa propre syntaxe idéale, mais notez que si vous utilisez un grand onglet (8 espaces) comme la mise en forme présentée par shfmt dans l’exemple ci-dessus, votre code peut devenir plus difficile à lire facilement.

Nous allons définir la largeur du retrait / tabulation à deux espaces en utilisant le -i option (dont le --help se définit comme retrait: 0 pour les tabulations (par défaut),> 0 pour le nombre d’espaces): shfmt -i 2 test.sh qui rendra le script comme suit:

#!/bin/bash__
echo 'not well formatted line 1'
echo 'not well formatted line 2'
echo 'this line has extra spaces on the end > '
func() {
  echo 'more unneeded spaces'
  echo 'way out'
}
func

Génial! Cependant, nous notons que shfmt n’a pas relevé notre erreur délibérée: #!/bin/bash__ n’est pas correct et devrait lire #!/bin/bash au lieu.

L'erreur shfmt et shellcheck manquée

Il y a donc toujours un cas d’utilisation pour utiliser shellcheck pour trouver des bogues de script en plus d’utiliser shfmt pour mieux formater les scripts. Cependant, il est intéressant de noter que dans ce cas particulier, même shellcheck n’a pas remarqué le problème. Cette lacune a été signalée à l’équipe Shellcheck afin que cela puisse être corrigé en temps voulu.

Si vous souhaitez en savoir plus sur Linux, vous pouvez consulter la série Bash Automation & Scripting Basics, ainsi que les Bash Loops: for, while, and Until Bash Loops: for, while, and Until et Exporting Variables in Bash: the Pourquoi et comment les articles.

Emballer

Être capable d’écrire des scripts propres, bien formatés et sans bogues devient un travail plus facile lorsque vous utilisez un outil de formatage de shell comme shfmt et un vérificateur de bogues / erreurs comme shellcheck. Même dans ce cas, comme nous l’avons vu, certaines choses peuvent passer inaperçues, même jusqu’au moment où vous exécutez le script pour la première fois. shfmt est un utilitaire petit mais efficace qui vous aidera à formater vos scripts et votre code en fonction des retraits sélectionnés. Prendre plaisir!

★★★★★