Comment déboguer le script bash?

31

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.

UAdapter
la source

Réponses:

20

Il existe plusieurs façons différentes, à savoir:

  • Exécutez votre script avec l'option -x

    bash -x yourscript.sh
  • Ajouter set -xune nouvelle ligne au début de votre fichier de script après le Shebang #!/bin/bashet avant le début de votre script, set -vafficherait les lignes d'entrée du shell, set -xafficherait les commandes et arguments exécutés

  • remplacez le shebang de votre fichier de script par #!/bin/bash -xv

NDA
la source
4

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.

lepe
la source
3
Évitez d'utiliser des noms de variables majuscules. Votre risque de remplacer les variables shell spéciales et les variables d'environnement. Assurez-vous également de citer les extensions de paramètres lorsqu'elles sont utilisées comme arguments, pour éviter le fractionnement de mots et l'expansion des noms de chemin sur le résultat. par exemple * ) eval "$cmd" ;;et debug_watch "$file" strange_case.txt.
geirha
Code édité comme suggéré par geirha.
lepe
2

En accord avec ce que NES dit, il y a des drapeaux définis dans bash pour permettre le débogage.

L' set -xindicateur peut être défini et désactivé à partir du terminal ou de votre script. Utilisation de +ou -:

#!/bin/bash
#fileinfo
ls -l $1
set -x      # start debugging here
wc -l $1
set +x      # stop debugging here
file $1
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 setcommandes:

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

seta 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 fichiers
  • file déterminer un type de fichier.
  • hexdump filtre qui affiche les fichiers spécifiés dans une variété de formats
  • nohup Exécutez un script qui ne se bloque pas

    et 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, -vverbeux --dump-stringset autres options astucieuses pour vous aider. Vérifiez-les en utilisant man bash.

La trapcommande (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.

j0h
la source
1

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 )

  • Bascule du point d'arrêt
  • Fonctionnement étape par étape
  • Fonctions et sous-routines Step-in, Step-out, Step-over
  • Examen des variables de code à tout moment pendant l'exécution du script
  • Liste des tâches TODO
  • Liste de signets
  • Édition de fenêtres multiples
  • Partage à distance de l'environnement du projet

La perspective de l'éditeur de script: IDE de script Eclipse

La perspective de débogage: Perspective de débogage du script Eclipse

Les étapes d'utilisation consistent à ajouter les plugins Shelledet BashEclipseà eclipse. Exécutez ensuite la procédure fournie dans le fichier texte BashEclipse de lecture pour démarrer le débogueur.

LD James
la source