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 trucs comme ça.
Oui, il y a Bash Debugger Project .
Vous pouvez également utiliser set -x
et set -v
à l'exécution. Plus d'informations:
http://www.linuxtopia.org/online_books/advanced_bash_scripting_guide/debugging.html http://www.cyberciti.biz/tips/debugging-shell-script.html
Bonne chance!
Il existe plusieurs façons différentes, à savoir:
Exécutez votre script avec l'option -x
bash -x yourscript.sh
Ajouter set -x
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
afficherait les commandes et arguments exécutés
remplacez le shebang de votre fichier de script par #!/bin/bash -xv
De nos jours, il existe l'extension de débogage du code Bash de Visual Studio . Il a 'Step in / out / over' et peut afficher la valeur de chaque variable.
shellcheck est le meilleur de la ville -
vous pouvez également intégrer avec vim, voici le dépôt git -
Vous pouvez utiliser cette petite fonction pour passer dans "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, à l'intérieur de 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 "si" (comme dans l'exemple ci-dessus), ou créer une fonction "watch":
function debug_watch
{
if [[ $1 == $2 ]]; then
debug
fi
}
# And Use it:
debug_watch "$file" "strange_case.txt"
J'ai également ajouté la commande "vars" qui videra 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. N'oubliez pas qu'en mode débogage, toute commande peut être exécutée, ce qui présente un risque pour la sécurité si vous la laissez dans un script de production.
* ) eval "$cmd" ;;
etdebug_watch "$file" strange_case.txt
.En accord avec ce que NES dit, il y a des drapeaux définis dans bash pour permettre le débogage.
L'
set -x
indicateur peut être défini et désactivé à partir du terminal ou de votre script. Utilisation de+
ou-
:Voici ce que font les
set
commandes:set -f
Désactivez la génération de nom de fichier à l'aide de métacaractères.set -v
Imprime (verbeux) les lignes d'entrée du shell au fur et à mesure de leur lecture.set -x
Imprimer les traces de commande avant d'exécuter la commande.set
a en fait de nombreuses fonctionnalités, mais malheureusement aucune page de manuel car il s'agit d'un outil intégré au shell. Le manuel de set 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, comme:
stat
afficher l'état du fichier ou du système de fichiersfile
déterminer un type de fichier.hexdump
filtre qui affiche les fichiers spécifiés dans une variété de formatsnohup
Exécutez un script qui ne se bloque paset bien d'autres. J'essayais de penser à la commande qui montre les caractères cachés, mais je ne peux pas le faire maintenant. Hexdump le fera mais il y en a un meilleur.
Le raccourci clavier ctrl\entraînera un vidage du programme ou du script en cours. Ensuite, vous pouvez analyser le coredump. J'utiliserais probablement gdb pour analyser un coredump, mais de nombreux programmes existent pour cela.
Le shell bash a également quelques options astucieuses pour le débogage. options
--debugger
,-v
verbeux--dump-strings
et autres options astucieuses pour vous aider. Vérifiez-les en utilisantman bash
.La
trap
commande (shell intégré) pourrait vous être très utile. trap indique que si votre programme se ferme de façon inattendue, exécutez quelque chose. Vous avez lu des informations sur les pièges et les autres fonctionnalités pratiques de Bash Shell ici .De manière générale pour le moment, le débogage est un sujet énorme dans n'importe quelle langue. D'autres sujets peuvent être utiles pour le débogage dans n'importe quel langage de programmation, notamment la redirection du 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 soit insérer des balises de commentaires et bloquer le code que je soupçonne être défectueux, soit alternativement, insérer une commande de sortie et essayer d'isoler le code fonctionnel du code cassé, en utilisant une technique de division et de conquête.
la source
Une option GUI pour déboguer un script bash est l'IDE Eclipse avec les plug-ins BashEclipse / Shelled.
Cela donne les fonctionnalités de votre question (
breakpoints and stuff
) ainsi qu'une multitude d'autres fonctionnalités pour le débogage de scripts bash complexes.Certaines des fonctionnalités incluent:
( https://unix.stackexchange.com/questions/155551/how-to-debug-a-bash-script )
La perspective de l'éditeur de script:
La perspective de débogage:
Les étapes d'utilisation consistent à ajouter les plugins
Shelled
etBashEclipse
à eclipse. Exécutez ensuite la procédure fournie dans le fichier texte BashEclipse de lecture pour démarrer le débogueur.la source