Comment faire pour que «bash -x» (mode débogage) soit récursif dans des scripts sources?

10

J'essaie de déboguer ce que bash fait sur l'initialisation de la connexion pour Linux. J'ai lu que "bash -x" fera bash imprimer ce qu'il fait, mais il n'imprime pas les commandes dans des fichiers sources comme "set -x". Je ne peux pas utiliser "set -x" car l'initialisation s'exécute avant de pouvoir l'appeler. "bash -x" semble fonctionner correctement sous OS X, mais cela pourrait être dû aux versions bash.

Linux: 3.2.25

OS X: 3.2.48

Voici un extrait du comportement non récurrent sur Linux:

bash -l -x -c 'echo 1'
# ... snip ...
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/vim.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/vim.sh
+ for i in '/etc/profile.d/*.sh'
+ '[' -r /etc/profile.d/which-2.sh ']'
+ '[' '' ']'
+ . /etc/profile.d/which-2.sh
# ... snip ...

Remarquez comment /etc/profile.d/vim.sh provient, mais ses commandes ne sont pas imprimées. Existe-t-il une solution de contournement sans mise à niveau? Est-ce dû à la différence de version?

Kelvin
la source

Réponses:

1

set -xquelque part dans le fichier racine (celui qui nécessite tous les autres fichiers) devrait fonctionner. Vous pouvez également introduire quelque chose comme [[ !-z "$DEBUG" ]] && set -xdans chaque fichier et appeler avec DEBUG=1 script.sh.

mkaito
la source
Où est le fichier racine? Est-il indépendant de la plateforme?
Kelvin
Par «fichier racine», je veux simplement dire le fichier que vous appelez sur le shell, et qui importe les autres fichiers. Dans mon exemple, le fichier racine serait script.sh
mkaito
1
Mais l'initialisation de la connexion bash se produit avant l'exécution du script. Il est trop tard pour exécuter "set -x" dans le script. Essayez-le vous-même - exécutez "bash -l -x script.sh". Vous verrez des choses se produire avant l'exécution des commandes de votre script.
Kelvin
Pourquoi diable voudriez-vous exécuter un script bash -l? C'est destiné aux shells interactifs. Un script n'est pas un shell interactif.
mkaito
3
S'il vous plaît, soyez un peu plus ouvert - les créateurs de bash ont évidemment pensé que ce serait utile. Je vois 2 utilisations (au moins): 1) Vous voulez exécuter ssh user@host 'bash -l -c command'afin d'obtenir le bon env. 2) Vous êtes un administrateur système et souhaitez dépanner ce que font les scripts d'initialisation avant l' exécution de votre script - bash -l -xvous le montrera. Parfois, vous voulez savoir où une variable env est définie.
Kelvin
0

Puisque vous recherchez des scripts et ne les exécutez pas, votre première commande dans le script principal doit être "set -x"

Maintenant, tous les scripts sourcés s'exécuteront dans le débogage plus. N'oubliez pas que lorsque vous sourcez un script, il s'exécute dans votre shell actuel, donc si vous définissez -x une fois, ce sera bon pour tous les scripts sources.

Sam
la source