169 votes

Comment faire pour déboguer un script bash ?

Est-il possible de déboguer un script bash ? Par exemple quelque chose qui imprime une sorte de journal d’exécution comme « appel ligne 1 », « calling line 2"etc.

201voto

Jonathan Leffler Points 299946
sh -x script [arg1 ...]
bash -x script [arg1 ...]

Ils vous donnent une trace de ce qui est en cours d'exécution. (Voir aussi '"Éclaircissement" près du bas de la réponse.)

Parfois, vous avez besoin de contrôler le débogage dans le script. Dans ce cas, comme Cheeto m'a rappelé, vous pouvez utiliser:

set -x

Cela active le débogage. Vous pouvez ensuite éteindre à nouveau avec:

set +x

Aussi, coquilles généralement de fournir des options '-n"pour" pas d'exécution "et"-v' pour 'verbose' mode; vous pouvez les utiliser en combinaison, afin de voir si le shell pense qu'il pourrait exécuter votre script de temps en temps utiles si vous avez un déséquilibre de la citation quelque part.


Il y est affirmé que l' '-x' option dans Bash est différent des autres shells (voir les commentaires). Le Manuel de Bash dit:

  • -x

    Imprimer une trace de commandes simples, pour les commandes, les cas de commandes, les commandes de sélection et de l'arithmétique pour les commandes et leurs arguments ou associés à des listes de mots après, elles se sont élargies et avant qu'ils ne soient exécutés. La valeur de la PS4 variable est développée et la valeur résultante est imprimée à l'avant de la commande et de l'expansion de ses arguments.

Que beaucoup ne semble pas indiquer des comportements différents. Je ne vois pas d'autres références pertinentes à '-x"dans le manuel. Il ne décrit pas les différences dans la séquence de démarrage.

Précisions: Sur les systèmes comme Linux typique de la boîte, où '/bin/sh"est un lien symbolique vers '/bin/bash"(ou à tout Bash exécutable), les deux lignes de commande à atteindre le même effet. Sur d'autres systèmes (par exemple, Solaris), /bin/sh n'est pas Bash, et les deux lignes de commande donnerait (légèrement) différents résultats; plus particulièrement, '/bin/sh' serait troublé par des constructions en Bash qu'il ne reconnaît pas du tout. Lorsqu'il est appelé par un nom comme cela, le "shebang" ligne ('#!/bin/bash' vs '#!/bin/sh') au début du fichier n'a pas d'effet sur la façon dont le contenu est interprété. J'ai rien trouvé dans le Manuel de Bash qui indique les différents comportement de Bash, selon qu'elle est invoquée comme " sh " ou " bash.

13voto

Stabledog Points 21

Cette réponse est valable et utile: http://stackoverflow.com/a/951352

Mais, je trouve que le "standard" débogage de script méthodes sont inefficaces, pas intuitif, et difficile à utiliser. Pour ceux qui sont utilisés à des GUI débogueurs de tout mettre au bout de vos doigts et de faire de l'emploi un jeu d'enfant pour des problèmes faciles (et possible pour des problèmes difficiles), ces solutions ne sont pas très satisfaisants.

Ce que je fais est d'utiliser une combinaison de DDD et bashdb. L'ancien exécute le second, et le dernier exécute votre script. Cette offre multi-fenêtre de l'INTERFACE utilisateur avec la possibilité de parcourir le code dans son contexte et de visualiser les variables de la pile, etc., sans la constante de l'effort mental de maintenir le contexte dans votre tête ou de garder de la réouverture de la source.

Il y a des indications sur l'établissement qui jusqu'ici: http://ubuntuforums.org/showthread.php?t=660223

10voto

Cheeto Points 117

Vous pouvez également écrire « set - x » dans le script.

2voto

abadjm Points 78

J’ai construit un débogueur de Bash. Juste lui donner un essai. J’espère que cela aidera https://sourceforge.net/projects/bashdebugingbash

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X