Agence web » Actualités du digital » Utiliser Shellcheck pour rechercher et corriger les bogues de script –

Utiliser Shellcheck pour rechercher et corriger les bogues de script –

Shutterstock / MarcoVector

Shellcheck est un excellent outil d’analyse de script pour le shell Linux qui peut être utilisé pour détecter les erreurs de programmation courantes. Shellcheck analyse les scripts et informe sur les erreurs et les avertissements, tout comme ce que ferait un compilateur.

Qu’est-ce que contrôle de la coquille?

Si vous êtes développeur Linux Bash depuis un certain temps, vous avez probablement trouvé un bon nombre de bogues dans vos propres scripts, ou dans les scripts d’autres. L’introduction de bogues dans le code est inévitable lorsque les humains développent du code. Même les meilleurs développeurs peuvent parfois manquer une complexité imprévue ou une mise en garde dans leur code.

Dans Bash, il n’y a pas de véritable compilateur comme il y en a par exemple en C ++. Il existe cependant un ensemble d’outils qui peuvent grandement aider lors du développement de scripts Bash. Une fois qu’un tel outil est shellcheck. Cet utilitaire fin analysera un fichier de script Bash et fera des recommandations en fonction de ce qui est trouvé lors de son analyse. C’est un peu comme avoir un compilateur pour Bash.

Des outils comme shellcheck diffèrent dans leur fonctionnement des autres outils d’exécution, comme par exemple l’exécution d’un script avec bash -x pour voir chaque commande du script en cours d’exécution, et cela en temps réel. La raison en est que Shellcheck analysera le script (fichier) sans l’exécuter réellement, encore une fois comme le ferait un compilateur.

Pour plus d’informations sur bash -x, vous voudrez peut-être lire Bash Automation and Scripting Basics (Part 3), qui fait partie de la série de 3 parties de Bash Automation and Scripting Basics.

Installation contrôle de la coquille

À installer contrôle de la coquille sur votre distribution Linux basée sur Debian / Apt (comme Ubuntu et Mint), exécutez la commande suivante dans votre terminal:

sudo apt install shellcheck

À installer contrôle de la coquille sur votre distribution Linux basée sur RedHat / Yum (comme RHEL, Centos et Fedora), exécutez la commande suivante dans votre terminal:

sudo yum install shellcheck

Fonctionnement contrôle de la coquille

Une fois que nous avons installé shellcheck, nous pouvons faire un test simple avec un script cassé. Nous définissons d’abord notre script test.sh comme suit:

#! / bin / wash echo 'Bash n'est pas wash echo Plus d'erreurs pour moi "si [ -d ./directory }; than
  echo 'sure! < start
fif


How many bugs can you find? (Tip: there are 8!).

Let’s next see what shellcheck makes of this code:

shellcheck test.sh

Shellcheck output 1

Immediately on the first line it finds an issue with the shebang specification. If you haven’t heard of shebang yet, please checkout our Bash Automation and Scripting Basics Part 1 article. Our pun shebang line #!/bin/wash should be #!/bin/bash. Let’s fix this. Issue 1/8 fixed!

We will also at the same time fix the other two issues immediately recognized by shellcheck: Did you forget to close this single quoted string? for the second line: spot on! Issue 2/8 fixed. For the third issue there is a little confusion as to our/the developers intent for shellcheck, and this is to be expected, as the ' on line 2 opens a string which is only terminated on line 5 when another ' is seen!

As this third issue is thus a result of the second issue, this run will allow us to fix two issues for the time being. Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif


Let’s run shellcheck on this again after making the corrections and see what the output is.

Shellcheck output 2

In this instance, shellcheck sees that a " is opened on line 3 (even though it is at the end of the line, it is actually an opening double quote as such), and that even at script end (note the line 8 indication, which does not exist in our 6-line script with a single empty line after the last line. Let’s clean up this empty line, and fix the double quoting issue at the start of line 3, which can now be readily understood. Issue 3/8 fixed!

Our script now looks like this:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory }; than
  echo 'sure! < start
fif

Re-running shellcheck (note how similar again these steps are to using a compiler in other coding languages):

Bash shellcheck output 3

Could not be clearer; The mentioned syntax error was in this if expression and Expected test to end here. We shall do as suggested and change the } to ], faisant lire la ligne if [ -d ./directory ]; than. Problème 4/8 résolu! Nous avons réexaminé shellcheck et nous sommes maintenant présentés avec les éléments suivants:

shellcheck sortie 4

Un autre problème de guillemet simple. Nous savons déjà comment résoudre ces problèmes. Changeons echo 'sure! < start à echo 'sure!' < start (problème 5/8 corrigé!) et relancez le shellcheck une fois de plus:

Shellcheck sortie 5

Intéressant au début, on voit que shellcheck est incapable d’analyser une ligne. Alors que cela peut ressembler à un défaut de shellcheck, en lisant un peu plus loin, nous voyons que quelque part un then est manquant. Ah! Nous avons placé than au lieu de then. Quelle erreur imprudente 😉 Facilement corrigé (problème 6/8 corrigé!). Notre script ressemble maintenant à ceci:

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' < start
fif

Et une autre exécution de shellcheck nous fournit une autre information utile:

Shellcheck sortie 6

Nous avons un manquant fi! Ah, oui, fif ne fera pas. Nous changeons fif à fi sur la dernière ligne du script (numéro 7/8) corrigé et relancez shellcheck!

Sortie Shellcheck 7

Un problème de redirection. Je ne m’attendais pas honnêtement shellcheck pour ramasser également cette erreur, comme < peut également être utilisé dans Bash, mais c’est certainement le cas. En effet, notre redirection était destinée à être > au lieu de <. Problème 8/8 – tous les problèmes – corrigés! Cela nous amène au script final

#!/bin/bash
echo 'Bash is not wash'
echo "More errors for me"
if [ -d ./directory ]; then
  echo 'sure!' > start
fi

Voyons ce que Shellcheck en pense maintenant.

Shellcheck sortie 8

Parfait! Et le script fonctionne parfaitement, dès la première exécution.

Si vous examinez la sortie des différentes commandes shellcheck, vous remarquerez également une autre fonctionnalité très pratique de shellcheck, en particulier pour les débutants: un ensemble d’hyperliens (liens de sites Web) sont affichés, qui sont cliquables avec la souris à partir de la fenêtre du terminal, ou vous pouvez sélectionnez (si nécessaire)> cliquez avec le bouton droit pour copier puis coller dans un navigateur. Cliquer sur un tel lien vous amènera au projet Shellcheck GitHub.

Pressé?

Si vous souhaitez vérifier rapidement uniquement les options les plus significatives, vous pouvez consulter le --severity={SEVERITY} option, où vous remplaceriez {SEVERITY} avec un sur error, warning, info, style.

Ainsi, si vous recherchez uniquement des erreurs et des avertissements, vous utiliseriez --severity=warning (qui comprend des niveaux plus élevés, dans ce cas étant uniquement error) en option pour shellcheck.

Emballer

S’il n’y a aucun problème de logique dans un script, exécution shellcheck avant d’exécuter le script et de résoudre tous les problèmes rencontrés, cela garantira une exécution quasi parfaite du premier coup. Vous pourrez peut-être même utiliser shellcheck dans ce défi de codage pour votre prochaine interview de codage Bash en direct! Dans cet article, nous avons exploré divers problèmes pouvant survenir dans les scripts et comment shellcheck les gère.

Profitez de scripts sans bogues!

★★★★★