Débugger un script bash

Il n’est pas toujours aisé de débugger un script bash lorsque celui-ci commence à être long et tortueux (plein de conditions).

Trois approches sont possibles pour voir ce qui se passe à l’exécution :

Utiliser ShellCheck

ShellCheck est un script écrit en Haskell et publié sur Github.

Des packages sont disponibles pour certaines distributions (Debian, Gentoo et Fedora). Sous CentOS, j’ai dû l’installer via cabal, le gestionnaire de packages propre à Haskell (comme gem pour Ruby et pip pour Python) :

yum install -y epel-release
yum install -y cabal-install zlib-devel
cabal update
cabal install --global cabal-install
cabal install ShellCheck

On peut ensuite l’utiliser directement en ligne de commande :

shellcheck test.sh
In test.sh line 15:
  if [[ $? -eq 0 ]]
     ^-- SC2039: In POSIX sh, [[ ]] is undefined.
        ^-- SC2181: Check exit code directly with e.g. 'if mycmd;', not indirectly with $?.

Ou via le plugin Syntastic pour Vim :

ShellCheck-Vim.PNG

Utiliser set

En ajoutant set -x dans le script avant toute autre instruction, chaque commande exécutée est listée à l’exécution :

simon@simon-daas:[~]: cat test.sh
#!/bin/sh
set -x

if [ -f /usr/bin/test ]
then
    echo "test est present"
else
    echo "test est present"
fi
simon@simon-daas:[~]: sh test.sh
+ '[' -f /usr/bin/test ']'
+ echo 'test est present'
test est present

Seul le code réellement exécuté est affichée: il commence par vérifier la condition [ -f /usr/bin/test ] et, celle-ci étant réunie, affiche le message de succès (echo "test est present").

sh -x

Plutôt que de modifier le fichier script (avec le risque d’oublier de retirer la ligne), on peut également l’exécution en passant -x à sh :

sh -x test.sh
simon@simon-daas:[~]: cat test.sh
#!/bin/sh
if [ -f /usr/bin/test ]
then
    echo "test est present"
else
    echo "test est present"
fi
simon@simon-daas:[~]: sh -x test.sh
+ '[' -f /usr/bin/test ']'
+ echo 'test est present'
test est present

2 réflexions sur « Débugger un script bash »

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s