Comment déboguer le script bash?

27

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.

    
posée UAdapter 11.01.2011 - 23:18
la source

7 réponses

18

Oui, il existe un projet de débogueur Bash .

Vous pouvez également utiliser set -x et set-v à l'exécution. ICI et ICI ou ICI sont des informations à ce sujet.

bonne chance!

    
réponse donnée danizmax 11.01.2011 - 23:44
la source
20

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

réponse donnée NES 11.01.2011 - 23:40
la source
6

shellcheck est le meilleur de la ville -

lien

vous pouvez également intégrer avec vim, voici le repo git -

lien

    
réponse donnée ramgorur 15.05.2015 - 08:09
la source
5

De nos jours, il existe l’extension de débogage Visual Studio Code Bash . Il a «Step in / out / over» et peut afficher la valeur de chaque variable.

    
réponse donnée Henrique Lemos Ribeiro 22.02.2017 - 20:55
la source
3

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.

    
réponse donnée lepe 15.05.2015 - 07:47
la source
1

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 )

  • Activer / désactiver le point d'arrêt
  • Opération pas à pas unique
  • Step-in, Step-out, fonctions avancées et sous-routines
  • Examen des variables de code à tout moment pendant l'exécution du script
  • Liste des tâches TODO
  • Liste de signets
  • Modification de plusieurs fenêtres
  • Partage à distance de l’environnement du projet

La perspective de l'éditeur de script:

La perspective du débogage:

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.

    
réponse donnée L. D. James 18.08.2016 - 10:22
la source
1

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. >     

réponse donnée j0h 26.04.2014 - 03:43
la source

Lire d'autres questions sur les étiquettes