Existe-t-il un moyen de déboguer le script bash sans utiliser l'écho et la journalisation?
Je parle d'utiliser des points d'arrêt et des choses comme ça.
Il existe plusieurs manières différentes, à savoir:
Exécutez votre script avec l'option -x
bash -x yourscript.sh
Ajoutez set -x
dans une nouvelle ligne au début de votre fichier de script après le Shebang #!/bin/bash
et avant le début de votre script, set -v
afficherait les lignes d'entrée du shell, set -x
affichera le script exécuté. commandes et arguments
remplace le shebang de votre fichier script par #!/bin/bash -xv
Vous pouvez utiliser cette petite fonction pour accéder à "console":
function debug
{
echo "#############| Entering DEBUG mode |####################";
CMD=""
while [[ $CMD != "exit" ]]; do
read -p "> " CMD
case $CMD in
vars ) ( set -o posix ; set );;
exit ) ;;
* ) eval $CMD;;
esac
done
echo "#############| End of DEBUG mode |####################";
}
Ensuite, dans votre script (EXEMPLE):
for FILE in *; do
...
if [[ $FILE == "strange_case.txt" ]]; then
# break the code here to analyze:
debug
fi
...
done
Il acceptera n'importe quelle commande, en gardant les variables locales intactes. Pour quitter le mode "debug", tapez "exit" (il ne quittera pas le script) et il continuera avec le code. Si vous utilisez "debug" dans une boucle, il s'arrêtera à chaque fois. Vous pouvez l'envelopper dans un "if" (comme dans l'exemple ci-dessus), ou créer une fonction "watch":
function debug_watch
{
if [[ == ]]; then
debug
fi
}
# And Use it:
debug_watch $FILE "strange_case.txt"
J'ai également ajouté la commande "vars" qui va vider toutes les variables disponibles et leurs valeurs. Vous pouvez également ajouter vos propres commandes personnalisées.
J'ai fait le code en quelques minutes, alors utilisez-le à vos risques et périls. Sachez que dans le mode de débogage, toute commande peut être exécutée, ce qui pose un risque de sécurité si vous le laissez dans un script de production.
Une option d'interface graphique pour le débogage d'un script bash est l'IDE Eclipse avec les plug-ins BashEclipse / Shelled.
Cela donne les caractéristiques de votre question ( breakpoints and stuff
) ainsi qu’une foule d’autres fonctionnalités pour le débogage de scripts bash complexes.
Certaines des fonctionnalités incluent:
( lien )
La perspective de l'éditeur de script:
La procédure à suivre consiste à ajouter les plug-ins Shelled
et BashEclipse
à eclipse. Exécutez ensuite la procédure fournie dans le fichier texte de lecture BashEclipse pour démarrer le débogueur.
Au diapason de ce que NES dit, il y a des indicateurs définis dans bash pour permettre le débogage.
L’indicateur set -x
peut être défini et désactivé à partir du terminal ou de votre script.
En utilisant +
ou -
:
#!/bin/bash
#fileinfo
ls -l
set -x # start debugging here
wc -l
set +x # stop debugging here
file
set -v # start verbose output
w | more
echo ""
echo -n "Number of users: "
set +v # end verbose output
who | wc -l
Voici ce que font les commandes set
:
set -f
Désactive la génération de nom de fichier à l'aide de métacaractères. set -v
Imprime (verbose) les lignes d'entrée du shell lorsqu'elles sont lues. set -x
Imprimer les traces de commande avant d'exécuter la commande. set
a en réalité de nombreuses fonctionnalités, mais aucune page de manuel, car il s'agit d'un outil intégré au shell. Le manuel de configuration se trouve dans la documentation GNU Bash .
Il existe de nombreux outils en ligne de commande qui pourraient vous aider à obtenir des détails sur votre programme, tels que:
stat
état du fichier d'affichage ou du système de fichiers file
détermine un type de fichier. hexdump
filter qui affiche les fichiers spécifiés dans divers formats nohup
Exécuter un script qui ne se bloque pas
et de nombreux autres. J'essayais de penser à la commande qui montre des personnages cachés, mais je ne peux pas le faire maintenant. Hexdump le fera mais il y en a un meilleur.
Le raccourci clavier ctrl \ provoquera un script ou un programme en cours d'exécution sur le core dump. Ensuite, vous pouvez analyser le coredump. J'utiliserais probablement gdb pour analyser un coredump, mais de nombreux programmes existent pour cela.
Le shell bash dispose d’options astucieuses pour le débogage.
options --debugger
, -v
verbose, --dump-strings
et autres options astucieuses pour vous aider. Examinez-les en utilisant man bash
.
La commande trap
(shell intégré) pourrait vous être très utile. trap indique que si votre programme se ferme de manière inattendue, exécutez quelque chose. Vous avez entendu parler de trap et d’autres fonctions intégrées de Bash Shell ici .
En général, le débogage est un sujet important dans toutes les langues. Parmi les autres sujets pouvant être utiles pour le débogage dans tout langage de programmation, citons la redirection de shell et le traitement du signal.
Enfin, je me rends compte que l'exemple que j'ai utilisé est trivial, mais que certains scripts shell peuvent être des centaines de lignes. Dans ces situations, j'aime insérer des balises de commentaires et bloquer le code que je soupçonne être défectueux, ou bien insérer une commande exit et essayer d'isoler le code fonctionnel du code cassé en utilisant une technique de division et conquête. >