%20in%20Quellskripte%20rekursiv%20vorgehen%3F.png)
Ich versuche zu debuggen, was Bash bei der Login-Initialisierung für Linux macht. Ich habe gelesen, dass Bash mit „bash -x“ ausgibt, 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 es aufrufen kann. „bash -x“ scheint unter OS X problemlos rekursiv zu sein, aber das könnte an den Bash-Versionen liegen.
Linux: 3.2.25
OS X: 3.2.48
Hier ist ein Auszug des nicht-rekursiven Verhaltens 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, dass /etc/profile.d/vim.sh als Quelle verwendet wird, die Befehle jedoch nicht gedruckt werden. Gibt es eine Problemumgehung ohne Upgrade? Wird dies durch den Versionsunterschied verursacht?
Antwort1
set -x
irgendwo in der Stammdatei (die alle anderen Dateien benötigt) sollte funktionieren. Alternativ können Sie [[ !-z "$DEBUG" ]] && set -x
in jeder Datei etwas wie einfügen und mit aufrufen DEBUG=1 script.sh
.
Antwort2
Da Sie Skripte beziehen und nicht ausführen, sollte Ihr erster Befehl im Hauptskript "set -x" sein.
Jetzt werden alle Quellskripte mehr im Debug ausgeführt. Denken Sie daran, dass ein Quellskript in Ihrer aktuellen Shell ausgeführt wird. Wenn Sie also einmal -x festlegen, gilt dies für alle Quellskripte.