Comment utiliser shfmt pour mieux formater les scripts Shell

Contenu

Bash Shell

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

Qu'est que c'est shfmt?

Développé par Dustin Krysak, shfmt est un formateur, Analyseur et interprète de shell. Le projet lui-même est hébergé sur GitHub et a un README clair et un référentiel clairement présenté. L'outil a été développé en Go et est compatible avec les shells POSIX, Bash y mksh. Cela fait de shfmt un programme vraiment universel plutôt que d'être limité à Bash.

installation shfmt

Installer shfmt sur votre distribution Linux Snap-enabled (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:

sudo snap installer shfmt

Installation de shfmt avec snap

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

Noter: vous devrez redémarrer votre machine (ou déconnectez-vous et reconnectez-vous) 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

Dans RHEL et Centos, il est possible que vous deviez également installer le Le référentiel EPEL d’abord.

Utilisation de shfmt

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

shfmt: un outil compact pour le formatage de Shell

Définissons un script écrit avec un très mauvais format 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 est le format de la même. Mais il y a aussi une erreur / erreur dans le script: l’appel de fonction func dans la dernière ligne, il est suivi de plus de crochets. Un appel de fonction dans Bash (au lieu d’une définition de fonction) ne doit avoir que le nom, pas de crochets. C’est un peu plus élevé que la définition de fonction appropriée..

Voyons quoi shfmt pensez-y.

shfmt test.sh

Un exemple fonctionnel d'échec de shfmt lors d'un mauvais appel de fonction

Alors que la sortie semble un peu cryptique, noter que le terme foo (utilisé ici) et bar (pas utilisé ici maintenant) sont souvent utilisés dans les cercles informatiques pour indiquer / représenter n'importe quelle langue ou élément équivalent. foo ici il s'agit vraiment func.

Même à ce moment là, le message reste un peu énigmatique jusqu'à ce que nous réalisions, 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. Cela explique alors pourquoi le message nous dit que quelque chose d'autre est attendu.; doit être suivi d'une déclaration. shmft vous cherchez ici quelque chose comme func(){ some_command[s]; }.

Bingo! Cela augmente la fonctionnalité de shfmt être un outil de vérification / validation de script shell, même s'il n'est probablement pas aussi complet que celui que nous avons écrit sur l'utilisation de shellcheck pour rechercher et corriger les erreurs de script. Même comme ça, très utile!

Nous avons corrigé notre erreur et maintenant le script d'entrée. test.sh dit ce qui 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 courons à nouveau shfmt contre le code et vous obtenez une sortie beaucoup plus appropriée et bien formatée:

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

Excellent. Maintenant, nous pouvons aller plus loin et vous dire shfmt nous aimerions utiliser une largeur d'indentation / tabulation à deux espaces au lieu d'une tabulation complète. J'écris toujours du code en utilisant deux espaces comme largeur d'indentation / 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., même si cela n'arrive pas souvent. Pour plus de 10 années, J'ai trouvé les deux espaces idéaux pour des projets personnels et partagés.

Chaque projet doit trouver sa propre syntaxe idéale, mais notez que si vous utilisez un grand onglet (8 les espaces) comme le format présenté par shfmt dans l'exemple ci-dessus, votre code peut devenir plus difficile à lire facilement.

Nous allons définir la largeur d'indentation / tab dans deux espaces en utilisant le -i option (qu'il --help définir comme Saignement: 0 pour les cils (prédéterminé),> 0 pour le nombre de places): shfmt -i 2 test.sh qui rendra le script de la manière suivante:

#!/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

Excellent! Malgré cela, nous remarquons que shfmt n’a pas réalisé notre erreur délibérée: #!/bin/bash__ n’est pas correct et devrait se lire comme suit : #!/bin/bash au lieu de.

L’erreur shfmt et shellcheck a échoué

Pour cela, il existe toujours un cas d’utilisation pour utiliser shellcheck pour rechercher des erreurs de script en même temps que l’utilisation shfmt pour mieux formater les scripts. Malgré cela, avec curiosité, dans cette circonstance particulière, compris shellcheck n'a pas réalisé le problème. Cette lacune a été signalée à l'équipe Shellcheck, donc en temps voulu ça peut être arrangé.

Si vous souhaitez en savoir plus sur Linux, vous pouvez consulter la série Bash Automation & Notions de base sur les scripts, ainsi que les Bash Loops: pour, tant que y jusqu'à ce que Bash Loops: pour, tant que y jusqu'à y Exporter des variables dans Bash: les messages pourquoi et comment.

Fin

Être capable d'écrire des scripts propres, bien formaté et sans erreurs devient un travail plus facile lorsque vous utilisez un outil de formatage shell comme shfmt et un vérificateur de bogues / des erreurs comme shellcheck. Même à ce moment là, 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!

Abonnez-vous à notre newsletter

Nous ne vous enverrons pas de courrier SPAM. Nous le détestons autant que vous.