Jai des problèmes avec certains scripts dans bash, à propos derreurs et de comportements inattendus. Je voudrais rechercher les causes des problèmes afin de pouvoir postuler Correctifs. Est-il possible dactiver une sorte de « mode débogage » pour bash, pour obtenir plus dinformations?
Réponse
Démarrez votre script bash avec bash -x ./script.sh
ou ajoutez votre script set -x
pour voir la sortie de débogage.
Supplémentaire avec bash
4.1 ou version ultérieure:
Si vous souhaitez écrire la sortie de débogage dans un fichier séparé, ajoutez ceci à votre script:
exec 5> debug_output.txt BASH_XTRACEFD="5"
Voir: https://stackoverflow.com/a/25593226/3776858
Si vous voulez voir les numéros de ligne, ajoutez ceci:
PS4="$LINENO: "
Si vous avez accès à logger
alors vous pouvez lutiliser pour écrire la sortie de débogage via votre syslog avec lhorodatage, le nom du script et le numéro de ligne:
#!/bin/bash exec 5> >(logger -t $0) BASH_XTRACEFD="5" PS4="$LINENO: " set -x # Place your code here
Vous pouvez utiliser loption -p
de la commande logger
pour définir une installation et un niveau individuels pour écrire la sortie via le syslog local dans son propre fichier journal.
Commentaires
Réponse
En utilisant set -x
Jutilise toujours set -x
et set +x
. Vous pouvez encapsuler les zones que vous souhaitez voir ce qui se passe avec elles pour augmenter / réduire la verbosité.
#!/bin/bash set -x ..code to debug... set +x
log4bash
Aussi si vous « avez effectué un travail de développement et que vous connaissez le style des enregistreurs qui portent les noms log4j, log4perl, etc., vous pouvez utiliser log4bash .
extrait
Regardons les choses en face – le vieil écho ne le coupe pas. log4bash est une tentative davoir une meilleure journalisation pour les scripts Bash (cest-à-dire faire en sorte que la journalisation dans Bash soit moins nulle).
De là, vous pouvez faire des choses comme ça Scripts bash:
#!/usr/bin/env bash source log4bash.sh log "This is regular log message... log and log_info do the same thing"; log_warning "Luke ... you turned off your targeting computer"; log_info "I have you now!"; log_success "You"re all clear kid, now let"s blow this thing and go home."; log_error "One thing"s for sure, we"re all gonna be a lot thinner."; # If you have figlet installed -- you"ll see some big letters on the screen! log_captains "What was in the captain"s toilet?"; # If you have the "say" command (e.g. on a Mac) log_speak "Resistance is futile";
Résultat de ce type de sortie:
log4sh
Si vous avez besoin de quelque chose de plus portable, il y a aussi lancien log4sh
. Fonctionne comme log4bash
, disponible ici:
Commentaires
- Sur Ubuntu, jai
alias say="spd-say"
dans mon .bashrc, qui imite lesay
depuis dautres distributions ou OS X. - set -vx serait une bonne combinaison si utilisé avec trap – trap read debug. Cela vous permet de parcourir ligne par ligne et voir les résultats
Réponse
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
). Il ressemble beaucoup à gdb; voici « un exemple de session pour donner une certaine 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, linstruction est affichée juste avant quelle 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! expansion des paramètres à nouveau.
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. Définissons newf
sur la valeur correcte.
bashdb<10> eval newf=${f/%JPG/jpg} $? is 0 bashdb<11> print $f $newf 2ndJPG.JPG 2ndJPG.jpg
Ça a lair bien. Continuez le script.
bashdb<12> next Debugged program terminated normally. Use q to quit or R to restart. $ ls 1st.jpg 2ndJPG.jpg
Réponse
La méthode standard pour déboguer les 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 bavard sur ce qui est fait / exécuté et comment les arguments sont évalués.
-x Print commands and their arguments as they are executed.
ceci est utile pour linterpréteur ou pour 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 find échoue à cause de quelques guillemets simples.
Pour désactiver la fonctionnalité, tapez simplement set +x
.
Réponse
Utilisation dEclipse
Vous pouvez utiliser lenvironnement combiné dEclipse et Shelled avec le script « _DEBUG.sh » lié ci-dessous.
- Plug-in Eclipse Shelled:
http://sourceforge.net/projects/shelled/files/shelled/update/ - Débogueur bash – fonctionne uniquement avec un shelled:
http://sourceforge.net/projects/basheclipse/
Changement de shell
Par par défaut, loutil de développement Shelled utilise /bin/dash
comme interpréteur. Jai changé cela en /bin/bash
pour avoir une meilleure compatibilité avec la plupart des exemples de shell sur le Web et mon environnement.
REMARQUE: Vous pouvez modifier cela en accédant à: Fenêtre -> Préférence -> Shell Script -> Interprètes
Instructions de configuration
Le paquet Debugger contient les étapes pour utiliser le script _DEBUG.sh
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 .
script.sh
. Lextension doit être « .sh » et est un must. _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 puis assurez-vous dexécuter le Fichier -> Convertir les délimiteurs de ligne en -> Unix .
Configurer une configuration de lancement de débogage: Exécuter -> Configurations de débogage -> Script Bash … Il y a 2 champs à définir ici:
a) « Script Bash: » – Chemin dans lespace de travail dEclipse vers le script Bash à déboguer.
e) « Port du débogueur: » 33333
Passez à la perspective Débogage. Démarrez la session de débogage. Lancez script.sh
à partir du shell bash.
Linterface utilisateur de débogage bash
Ce débogueur bash possède toutes les fonctionnalités des débogueurs de programmation standard tels que:
- Basculer le point darrêt
- Opération étape par étape unique
- Fonctions et sous-routines Step-in, Step-out, Step-over
- Examen du code ou des variables à tout moment pendant lexécution du script
LEDI (environnement de développement intégré) Shelled (Shell Script Editor) a un bonus supplémentaire de vérification du contexte, de mise en évidence et dindentation lors de lécriture de votre script. Sil ne se met pas correctement en retrait, vous pourrez peut-être immédiatement signaler / localement de nombreuses erreurs.
Ensuite, il y a dautres avantages IDE tel que:
- Liste de tâches TODO
- Tâche Mylyn
- Liste de signets
- Multiple Modification de la fenêtre
- Partage à distance de lenvironnement
Commentaires
- Astuce sympa. Bon de savoir que Bash peut être débogué comme ceci.
Réponse
Une ressource merveilleuse est apparue ces dernières années: http://shellcheck.net
il vous montre plus que le bash normal, vous permettant de trouver facilement ces guillemets non fermés ou bouclés crochets, etc.
Assurez-vous simplement de ne pas coller dinformations sensibles (ips, mots de passe, etc.) sur le net … (dautant plus que cest http, non chiffré) (je crois que le shellcheck est également disponible à télécharger, mais je ne suis pas sûr)
Réponse
De nos jours, il existe le débogage VS Code Bash.
https://marketplace.visualstudio.com/items?itemName=rogalmic.bash-debug
Il a « Step in / out / over « et affiche également la valeur de chaque variable.
Commentaires
- cette réponse ne répond pas à la question dans le bon contexte; en supposant la ligne de commande puisque lEDI na pas été mentionné
Réponse
utilisez simplement:
#!/bin/bash -x
idem pour le shell:
#!/bin/sh -x
BASH_XTRACEFD="5"
, bash écrit la sortie de trace générée lorsqueset -x
est activé vers descripteur de fichier 5.exec 5> >(logger -t $0)
redirige la sortie du descripteur de fichier 5 verslogger
.