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?
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
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
.
Vous pouvez utiliser l'environnement combiné d'Eclipse et Shelled avec le script "_DEBUG.sh" lié ci-dessous.
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
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):
- Créer un projet de script shell: Fichier> Nouveau -> Autre -> Script Shell -> Assistant de projet de script shell .
- 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.- Copiez le fichier
_DEBUG.sh
dans le dossier du projet.Insérez le texte suivant en haut du fichier
script.sh
:. _DEBUG.sh
Si le fichier est créé dans Microsoft Windows, assurez-vous d'exécuter le Fichier> Convertir les délimiteurs de ligne en -> Unix .
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:" 33333Passez à la perspective Debug. Démarrez la session de débogage. Lancement
script.sh
de bash Shell.
Ce débogueur bash possède toutes les fonctionnalités des débogueurs de programmation standard tels que:
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:
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.
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)
utilisez simplement:
#!/bin/bash -x
idem pour Shell:
#!/bin/sh -x