Ich versuche zu debuggen, was Bash bei der Login-Initialisierung für Linux macht. Ich habe gelesen, dass "bash -x" Bash zum Ausdrucken bringt, was es tut, aber es druckt keine Befehle in Quelldateien wie "set -x". Ich kann "set -x" nicht verwenden, da die Initialisierung ausgeführt wird, bevor ich sie aufrufen kann. "bash -x" scheint unter OS X in Ordnung zu sein, aber das könnte an den Bash-Versionen liegen.
Linux: 3.2.25
OS X: 3.2.48
Hier ist ein Auszug aus dem nicht rekursiven Verhalten unter 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 ...
Beachten Sie, wie /etc/profile.d/vim.sh bezogen wird, die Befehle jedoch nicht gedruckt werden. Gibt es eine Problemumgehung ohne Upgrade? Wird dies durch den Versionsunterschied verursacht?
bash -l
? Das ist für interaktive Shells gedacht. Ein Skript ist keine interaktive Shell.ssh user@host 'bash -l -c command'
damit die richtige Umgebung geladen wird. 2) Du bist ein Sysadmin und wollen troubleshoot , welche Skripte init tun , bevor Ihr Skript läuft -bash -l -x
wird Ihnen zeigen. Manchmal möchten Sie wissen, wo eine env-Variable festgelegt wird.Da Sie Skripte beziehen und nicht ausführen, sollte Ihr erster Befehl im Hauptskript "set -x" sein.
Jetzt werden alle Skripts mit mehr Quellen im Debug ausgeführt. Denken Sie daran, wenn Sie ein Skript als Quelle verwenden, wird es in Ihrer aktuellen Shell ausgeführt. Wenn Sie also -x einmal festlegen, ist dies für alle Quellenskripte gut.
quelle