Deboggage de scripts Shell

Soumis par -badmin- le jeu 18/02/2016 - 16:25

J'écris beaucoup de petits scripts en bash. C'est pratique, cest beau (enfin il y a des limites..).

Parmi les choses qui me dérangent, le plus, c'est un oubli d'un simple ou double quote, qui se résume souvent par une erreur environ 1000 lignes plus loin dans le script. Autant dire que le déboggage devient vite rigolo.

Voici quelques méthodes que j'emploie pour trouver la source du problème:

1 Solution de base

Si vous oubliez un apostrophe ou un guillemet, il y a des chances que la meme ligne contienne donc un nombre impair de ces caractères.
Une solution pas très élégante pour afficher le numéro des lignes contenant un nombre impair de quotes est:

tr -cd "'\n" < mon script.sh | awk 'length%2==1 {print NR, $0}'
tr -cd "\"\n" < mon script.sh | awk 'length%2==1 {print NR, $0}'

2. Solution complète

Mais que se passe-t-il si l'on a oublié un "fi" à la fin d'un "if", oublié de refermer un bracket ?
La solution est shellcheck.

Ce système de vérification complète de scripts shell est écrit en haskell, disponible soit directement sur shellcheck.net soit sur le système local en l'installant.

Sur Fedora 21+, rien de plus simple:

dnf install ShellCheck
Attention aux majuscules

Sur CentOS 7, l'histoire se complique un peu et il va falloir installer un compilateur haskell:

yum install cabal-install
cabal update
cabal install cabal
git clone https://github.com/koalaman/shellcheck
cd shellcheck
cabal install
export PATH="$HOME/.cabal/bin:$PATH"

La ligne "cabal install cabal" permet de mettre à jour cabal lui même car la version fournie par les dépots EPEL un peu trop vieillote pour accueillir shellcheck qui se targe d'une belle erreur. A l'heure ou j'écris ces lignes, c'est la version 1.16.1.0 qui est installée, et la mise à jour compile et installe la version 1.22.7.0.
Enfin, sachez que si vous avez des problèmes de compilations avec de multiples modules absents, vous aurez toujours la possibilité de supprimer les modules précompiles avec la commande:

rm -rf ~/.ghc ~/.cabal

Vous n'aurez alors plus qu'à tester votre script avec la commande

shellcheck /votre/script.sh

Sur les scripts que je développe, j'ai eu droit à certaines corrections bienvenues, en plus de quelques warnings qui sont "by desgin".

Enfin, pensez à ajouter la ligne redéfinissant le path dans votre fichier ~/bashrc afin que shellcheck soit disponible dans les nouveaux shells.