web-dev-qa-db-fra.com

Comment déboguer un script bash?

J'ai des problèmes avec certains scripts dans bash, à propos d'erreurs et de comportements inattendus. Je voudrais rechercher les causes des problèmes afin de pouvoir appliquer des correctifs. Existe-t-il un moyen de transformer une sorte de "mode de débogage" pour bash, pour obtenir plus d'informations?

153
Braiam

Il y a un débogueur bash, bashdb , qui est un package installable sur de nombreuses distributions. Il utilise le mode de débogage étendu intégré de bash (shopt -s extdebug). Cela ressemble beaucoup à gdb; voici un exemple de session pour donner un peu de saveur:

$ ls
1st.JPG  2ndJPG.JPG
$ cat ../foo.sh
for f in *.JPG
do
  newf=${f/JPG/jpg}
  mv $f $newf
done
$ bashdb ../foo.sh
(foo.sh:1):
1:      for f in *.JPG
bashdb<0> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<1> next
(foo.sh:4):
4:        mv $f $newf

Comme dans gdb, l'instruction est montrée juste avant qu'elle est sur le point d'être exécutée. Nous pouvons donc examiner les variables pour voir ce que l'instruction fera avant de le faire.

bashdb<2> print $f $newf
1st.JPG 1st.jpg
bashdb<3> next
(foo.sh:1):
1:      for f in *.JPG
bashdb<4> next
(foo.sh:3):
3:        newf=${f/JPG/jpg}
bashdb<5> next
(foo.sh:4):
4:        mv $f $newf
bashdb<6> print $f $newf
2ndJPG.JPG 2ndjpg.JPG

Ce n'est pas ce que nous voulons! Examinons à nouveau l'expansion des paramètres.

bashdb<7> print $f ${f/JPG/jpg}
2ndJPG.JPG 2ndjpg.JPG
bashdb<8> print $f ${f/JPG$/jpg}
2ndJPG.JPG 2ndJPG.JPG
bashdb<9> print $f ${f/%JPG/jpg}
2ndJPG.JPG 2ndJPG.jpg

OK, ça marche. Fixons newf à la valeur correcte.

bashdb<10> eval newf=${f/%JPG/jpg}
$? is 0
bashdb<11> print $f $newf
2ndJPG.JPG 2ndJPG.jpg

Cela semble bon. Continuez le script.

bashdb<12> next
Debugged program terminated normally. Use q to quit or R to restart.
$ ls
1st.jpg  2ndJPG.jpg
35
Mark Plotnick

La méthode standard pour déboguer des scripts dans la plupart des shells basés sur Bourne, comme bash, consiste à écrire set -x en haut de votre script. Cela rendra bash plus verbeux sur ce qui est fait/exécuté et sur la façon dont les arguments sont évalués.

-x  Print commands and their arguments as they are executed.

ceci est utile pour l'interpréteur ou les scripts internes. Par exemple:

$ find "$fileloc" -type f -Prune "$filename" -print
+ find /var/adm/logs/morelogs -type f -Prune '-name *.user' -print
find: unknown predicate '-name *.user'
$ find "$fileloc" -type f -Prune $filename -print
+ find /var/adm/logs/morelogs -type f -Prune -name '*.user' -print
find: '/var/adm/logs/morelogs': No such file or directory

Dans ce qui précède, nous pouvons voir pourquoi la recherche échoue en raison de guillemets simples.

Pour désactiver la fonction, tapez simplement set +x.

19
Braiam

Utiliser Eclipse

Vous pouvez utiliser l'environnement combiné d'Eclipse et Shelled avec le script "_DEBUG.sh" lié ci-dessous.

Coquilles de commutation

Par défaut, l'outil de développement Shelled utilise /bin/dash comme interprète. J'ai changé cela en /bin/bash pour une meilleure compatibilité avec la plupart des exemples Shell sur le Web et mon environnement.

REMARQUE: Vous pouvez changer cela en allant à: Window> Préférence -> Script shell -> Interprètes

Instructions d'installation

Le package du débogueur contient les étapes d'utilisation de _DEBUG.sh script pour le débogage de votre script qui est essentiellement (le readme.txt):

  1. Créer un projet de script shell: Fichier> Nouveau -> Autre -> Script Shell -> Assistant de projet de script shell .
  2. Créez un fichier de script Bash: Fichier> Nouveau -> Fichier . Pour cet exemple, ce sera script.sh. L'extension doit être ".sh" et est un must.
  3. Copiez le fichier _DEBUG.sh dans le dossier du projet.
  4. Insérez le texte suivant en haut du fichier script.sh:

    . _DEBUG.sh
    
  5. Si le fichier est créé dans Microsoft Windows, assurez-vous d'exécuter le Fichier> Convertir les délimiteurs de ligne en -> Unix .

  6. Mettre en place une configuration de lancement de débogage: Run> Configurations de débogage -> Script Bash ... Il y a 2 champs à définir ici:

    a) "Script Bash:" - Chemin dans l'espace de travail d'Eclipse vers le script Bash à déboguer.
    e) "Port du débogueur:" 33333

  7. Passez à la perspective Debug. Démarrez la session de débogage. Lancement script.sh de bash Shell.

L'interface de débogage bash

enter image description here

Ce débogueur bash possède toutes les fonctionnalités des débogueurs de programmation standard tels que:

  • Bascule du point d'arrêt
  • Fonctionnement étape par étape
  • Fonctions et sous-routines Step-in, Step-out, Step-over
  • Examen du code ou des variables à tout moment pendant l'exécution du script

Shelled (Shell Script Editor) IDE (Integrated Development Environment) a un bonus supplémentaire de vérification de contexte, mettant en évidence et le retrait lors de l'écriture de votre script. S'il ne se met pas correctement en retrait, vous pourriez immédiatement y signaler/localiser de nombreuses erreurs.

Ensuite, il y a d'autres IDE avantages tels que:

  • Liste des tâches TODO
  • Tâche de Mylyn
  • Liste de signets
  • Édition de plusieurs fenêtres
  • Partage à distance de l'environnement
13
L. D. James

De nos jours, il y a le débogage VS Code Bash.

https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug

Il a 'Step in/out/over' et montre également la valeur de chaque variable.

VS Code Bash Debug screenshot

8

Une merveilleuse ressource est apparue ces dernières années: http://shellcheck.net

il vous montre plus que le bash ordinaire, ce qui permet de trouver facilement ces citations non fermées embêtantes ou accolades, etc.

Assurez-vous simplement de ne pas coller des informations sensibles (ips, mots de passe, etc.) sur le net ... (d'autant plus qu'il s'agit de http, non crypté) (je crois que shellcheck est également disponible en téléchargement, mais je ne suis pas sûr)

8
Olivier Dulac

utilisez simplement:

#!/bin/bash -x

idem pour Shell:

#!/bin/sh -x
6
Gery