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?
bash -l
? C'est destiné aux shells interactifs. Un script n'est pas un shell interactif.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 -x
vous le montrera. Parfois, vous voulez savoir où une variable env est définie.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.
la source