Comment déboguer un script shell Bash sous Linux ou UNIX

Oct 6, 2021
admin

From my mailbag:
J’ai écrit un petit script hello world. Comment puis-je déboguer un script shell bash s’exécutant sur un système de type Linux ou Unix ?
C’est la question la plus courante posée par les nouveaux sysadmins ou les utilisateurs Linux/UNIX. Le débogage des scripts shell peut être un travail fastidieux (lire comme pas facile). Il existe différentes façons de déboguer un script shell.
Vous devez passer l’argument -x ou -v au shell bash pour parcourir chaque ligne du script.
Comment déboguer un script shell bash sur Linux ou Unix
Voyons comment déboguer un script bash s’exécutant sur Linux et Unix en utilisant différentes méthodes.

-x option pour déboguer un script shell bash

Exécuter un script shell avec l’option -x.
$ bash -x script-name
$ bash -x domains.sh

Utilisation de la commande intégrée set

Le shell bash offre des options de débogage qui peuvent être activées ou désactivées en utilisant la commande set :

  • set -x : Afficher les commandes et leurs arguments au fur et à mesure de leur exécution.
  • set -v : Afficher les lignes d’entrée du shell telles qu’elles sont lues.

Vous pouvez utiliser les deux commandes ci-dessus dans le script shell lui-même :

#!/bin/bashclear # turn on debug modeset -xfor f in *do file $fdone# turn OFF debug modeset +xls# more commands

Vous pouvez remplacer la ligne Shebang standard :
#!/bin/bash
avec le code suivant (pour le débogage):
#!/bin/bash -xv

Utilisation de la fonction intelligente DEBUG

D’abord, ajoutez une variable spéciale appelée _DEBUG. Mettez _DEBUG à ‘on’ lorsque vous avez besoin de déboguer un script:
_DEBUG="on"

Mettez la fonction suivante au début du script:

function DEBUG(){ && $@}

Maintenant, chaque fois que vous avez besoin de déboguer, utilisez simplement la fonction DEBUG comme suit :
DEBUG echo "File is $filename"
OR
DEBUG set -x
Cmd1
Cmd2
DEBUG set +x

Quand vous avez terminé le débogage (et avant de déplacer votre script vers la production) mettez _DEBUG à ‘off’. Il n’est pas nécessaire de supprimer les lignes de débogage.
_DEBUG="off" # set to anything but not to 'on'

Scripteur d’exemple:

#!/bin/bash_DEBUG="on"function DEBUG(){ && $@} DEBUG echo 'Reading files'for i in *do grep 'something' $i > /dev/null && echo "Found in $i file"doneDEBUG set -xa=2b=3c=$(( $a + $b ))DEBUG set +xecho "$a + $b = $c"

Enregistrez et fermez le fichier. Exécutez le script comme suit:
$ ./script.sh
Output:

Reading filesFound in xyz.txt file+ a=2+ b=3+ c=5+ DEBUG set +x+ ''+ set +x2 + 3 = 5

Maintenant mettez DEBUG à off (vous devez éditer le fichier):
_DEBUG="off"
Run script:
$ ./script.sh
Output:

Found in xyz.txt file2 + 3 = 5

Ce qui précède est une technique simple mais assez efficace. Vous pouvez également essayer d’utiliser DEBUG comme alias au lieu de function.

Debugging Common Bash Shell Scripting Errors

Bash ou sh ou ksh donne divers messages d’erreur à l’écran et dans de nombreux cas, le message d’erreur peut ne pas fournir des informations détaillées.

Saut pour appliquer la permission d’exécution sur le fichier

Lorsque vous écrivez votre premier script shell bash hello world, vous pourriez finir par obtenir une erreur qui se lit comme suit:
bash: ./hello.sh: Permission denied
Définir la permission en utilisant la commande chmod:
$ chmod +x hello.sh
$ ./hello.sh
$ bash hello.sh

End of file unexpected Error

Si vous obtenez un message d’erreur End of file unexpected, ouvrez votre fichier script et et assurez-vous qu’il a des guillemets ouvrants et fermants. Dans cet exemple, l’instruction echo comporte un guillemet ouvrant mais pas de guillemet fermant :

#!/bin/bash.......echo 'Error: File not found ^^^^^^^ missing quote

Vérifiez également qu’il ne manque pas de parenthèses et d’accolades ({}) :

#!/bin/bash..... && { echo "Error: Chroot dir not found"; exit 1; ^^^^^^^^^^^^^ missing brace }...

Mots-clés manquants tels que fi, esac, ; ;, etc.

Si vous avez manqué un mot-clé de fin tel que fi ou ; ;, vous obtiendrez une erreur telle que « xxx unexpected ». Assurez-vous donc que toutes les instructions if et case imbriquées se terminent par les mots-clés appropriés. Consultez la page de manuel de bash pour connaître les exigences syntaxiques. Dans cet exemple, fi est manquant :

#!/bin/bashecho "Starting..."....if then if then echo "Do something"fi for f in $filesdo echo $fdone # note fi is missing

Déplacement ou édition du script shell sur des boîtes Windows ou Unix

Ne créez pas le script sur Linux/Unix et déplacez-le sur Windows. Un autre problème est l’édition du script shell bash sur Windows 10 et le déplacement/le téléchargement vers le serveur Unix. Il en résultera une erreur comme commande non trouvée en raison du retour chariot (DOS CR-LF). Vous pouvez convertir les nouvelles lignes DOS CR-LF au format Unix/Linux en utilisant la syntaxe suivante:
dos2unix my-script.sh

Tip 1 – Envoyer un message de débogage à stderr

L’erreur standard est le périphérique de sortie d’erreur par défaut, qui est utilisé pour écrire tous les messages d’erreur du système. C’est donc une bonne idée d’envoyer des messages au périphérique d’erreur par défaut :

# Write error to stdoutecho "Error:  file not found"## Write error to stderr (note 1>&2 at the end of echo command)#echo "Error:  file not found" 1>&2

Tip 2 – Activez la coloration syntaxique lorsque vous utilisez l’éditeur de texte vim

La plupart des éditeurs de texte modernes vous permettent de définir l’option de coloration syntaxique. Ceci est utile pour détecter la syntaxe et prévenir les erreurs courantes telles que les guillemets ouvrants ou fermants. Vous pouvez voir le script bash dans différentes couleurs. Cette fonction facilite l’écriture des structures de script shell et les erreurs de syntaxe sont visuellement distinctes. La mise en évidence n’affecte pas le sens du texte lui-même ; elle est faite uniquement pour vous. Dans cet exemple, la coloration syntaxique de vim est utilisée pour mon script bash:

Comment déboguer un script shell Bash sous Linux ou UNIX en utilisant la fonctionnalité de coloration syntaxique de Vim

Fig.01 : Coloration syntaxique du script shell Bash en utilisant l’éditeur de texte vim

Tip 3 – Utilisez shellcheck pour lint script

ShellCheck est un outil d’analyse statique pour les scripts shell. On peut l’utiliser pour trouver des bogues dans vos scripts shell. Il est écrit en Haskell. Vous pouvez trouver des avertissements et des suggestions pour les scripts shell bash/sh avec cet outil. Voyons comment installer et utiliser ShellCheck sur un système Linux ou de type Unix pour améliorer vos scripts shell, éviter les erreurs et la productivité.

Voir aussi:

  • Voir comment activer la coloration syntaxique sous l’éditeur de texte vim.
  • Page de manuel de Bash
  • BASH avec débogueur et amélioration du support de débogage et de la gestion des erreurs

🐧 Obtenez les derniers tutoriels sur Linux, Open Source & DevOps via le flux RSS ou la newsletter hebdomadaire par email.
🐧 24 commentaires jusqu’à présent…. en ajouter un ↓
Catégorie Liste des commandes Unix et Linux
Fichier. Management cat
Firewall Alpine Awall – CentOS 8 – OpenSUSE – RHEL 8 – Ubuntu 16.04 – Ubuntu 18.04 – Ubuntu 20.04
Utilitaires réseau dig – host – ip – nmap
OpenVPN CentOS 7 – CentOS 8 – Debian 10 – Debian 8/9 – Ubuntu 18.04 – Ubuntu 20.04
Gestionnaire de paquets apk – apt
Gestion des processus bg – chroot – cron – disown – fg – jobs – killall – kill – pidof. – pstree – pwdx – time
Searching grep – whereis – which
User Information groups – id – lastcomm – last – lid/libuser-lid – logname – members – users – whoami – who – w
WireGuard VPN Alpine – CentOS 8 – Debian 10 – Firewall – Ubuntu 20.04

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.