Wie kann ich "bash -x" (Debug-Modus) in Skripts aus Quellen zurückführen?

10

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?

Kelvin
quelle

Antworten:

1

set -xIrgendwo in der Root-Datei (die alle anderen Dateien benötigt) sollte funktionieren. Alternativ können Sie [[ !-z "$DEBUG" ]] && set -xin jede Datei etwas Ähnliches einfügen und mit aufrufen DEBUG=1 script.sh.

mkaito
quelle
Wo ist die Stammdatei? Ist es plattformunabhängig?
Kelvin
Mit "Root-Datei" meine ich einfach die Datei, die Sie auf der Shell aufrufen und die die anderen Dateien importiert. In meinem Beispiel wäre die Stammdatei script.sh
mkaito
1
Die Initialisierung der Bash-Anmeldung erfolgt jedoch, bevor das Skript ausgeführt wird. Es ist zu spät, um "set -x" im Skript auszuführen. Probieren Sie es selbst aus - führen Sie "bash -l -x script.sh" aus. Sie werden sehen, was passiert, bevor die Befehle Ihres Skripts ausgeführt werden.
Kelvin
Warum um alles in der Welt würden Sie ein Skript ausführen bash -l? Das ist für interaktive Shells gedacht. Ein Skript ist keine interaktive Shell.
Mkaito
3
Bitte seien Sie etwas aufgeschlossener - offensichtlich dachten die Macher von bash, es wäre nützlich. Ich sehe 2 Verwendungszwecke (mindestens): 1) Sie möchten ausführen, 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 -xwird Ihnen zeigen. Manchmal möchten Sie wissen, wo eine env-Variable festgelegt wird.
Kelvin
0

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.

Sam
quelle