Comment déboguer un script bash?

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

  • -v peut également aider (affiche chaque ligne au fur et à mesure de son exécution. peut être combiné avec -x). Et voir aussi: bashdb.sourceforge.net
  • une autre ressource merveilleuse est: shellcheck .net
  • Que signifie  » exec 5 >  » do?
  • @aggsol: Si vous utilisez BASH_XTRACEFD="5", bash écrit la sortie de trace générée lorsque set -x est activé vers descripteur de fichier 5. exec 5> >(logger -t $0) redirige la sortie du descripteur de fichier 5 vers logger.
  • Vous vous demandez simplement si vous pouvez obtenir le numéro de ligne et le chemin ou le nom du script shell sur PS4?

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:

        ss1

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

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):

  1. Créer un projet de script Shell: Fichier -> Nouveau -> Autre – > Script Shell

-> Assistant de projet de script Shell .

  • Créer un fichier de script Bash: Fichier -> Nouveau -> Fichier . Pour cet exemple, ce sera script.sh. Lextension doit être « .sh » et est un must.
  • Copiez le fichier _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

    entrez la description de limage ici

    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.

    Capture décran VS Code Bash Debug

    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 

    Laisser un commentaire

    Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *