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.
Réponses
Trop de publicités?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.
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
J’ai construit un débogueur de Bash. Juste lui donner un essai. J’espère que cela aidera https://sourceforge.net/projects/bashdebugingbash