Was macht `set -x`?


260

Ich habe ein Shell-Skript mit der folgenden Zeile:

[ "$DEBUG" == 'true' ] && set -x

15
Werfen Sie einen Blick darauf:help -m set | less
Cyrus

4
Danke für den help -m setTipp. Das funktioniert. Ich habe es versucht, man setbevor ich gefragt habe, aber auf Ubuntu gibt esNo manual entry for set
Ole

2
@Ole setist in bash integriert. Wenn Sie man bashes also im Abschnitt SHELL BUILTIN COMMANDS finden, finden Sie es. Wenn Sie die Manpage anzeigen, können Sie wahrscheinlich dorthin springen, indem Sie nach diesem regulären Ausdruck suchen : \bset \[.
User5910

Antworten:


364

set -xAktiviert einen Modus der Shell, in dem alle ausgeführten Befehle auf dem Terminal gedruckt werden. In Ihrem Fall wird es eindeutig zum Debuggen verwendet. Dies ist ein typischer Anwendungsfall für set -x: Das Drucken jedes ausgeführten Befehls kann Ihnen dabei helfen, den Kontrollfluss des Skripts zu visualisieren, wenn es nicht wie erwartet funktioniert.

set +x deaktiviert es.


5
Wie kann ich diese Funktion wieder deaktivieren?
feedc0de

85
@ DanielBrunner: Deaktiviert set +xes.
John Zwinck

2
Das ist sehr nützlich! Ich wünschte, jemand hätte mir das früher gesagt. Gibt es andere interessante Tricks wie diesen, die unsere Meta-Fähigkeiten im Scripting verbessern können?
Student

7
@Student: set -eOben in Ihrem Skript wird das Skript mit einem Fehler beendet, wenn ein Fehler auftritt (und nicht explizit behandelt wird). Ich finde das immens vorzuziehen gegenüber der Standardeinstellung, die darin besteht, wohl oder übel weiterzumachen (wie die berüchtigte von Visual Basic On Error Resume Next).
John Zwinck

1
@JohnZwinck leider set -ehat sehr unerwünschte Nebenwirkungen, bis zu dem Punkt , dass es Code - Review fast unmöglich macht (weil das Verhalten einer gegebenen Linie davon abhängt , was der Call - Stack liegt - wenn eine Funktion aufgerufen wird in einem Kontext „geprüft“, set -eist deaktiviert für diesen Aufruf und alles, was er wiederum aufruft). Siehe die Übungen in BashFAQ # 105 .
Charles Duffy

78

set -x

Druckt eine Spur einfacher Befehle für Befehle, Groß- / Kleinschreibung, Auswahlbefehle und Arithmetik für Befehle und ihre Argumente oder zugehörigen Wortlisten, nachdem sie erweitert wurden und bevor sie ausgeführt werden. Der Wert der PS4-Variablen wird erweitert und der resultierende Wert wird vor dem Befehl und seinen erweiterten Argumenten gedruckt.

[ Quelle ]

Beispiel

set -x
echo `expr 10 + 20 `
+ expr 10 + 20
+ echo 30
30

set +x
echo `expr 10 + 20 `
30

Das obige Beispiel zeigt die Verwendung von set -x. Wenn es verwendet wird, wurde der obige arithmetische Ausdruck erweitert. Wir konnten sehen, wie eine einzelne Linie Schritt für Schritt bewertet wurde.

  • Der erste Schritt exprwurde bewertet.
  • Der zweite Schritt echowurde bewertet.

Um mehr über set → zu erfahren, besuchen Sie diesen Link

wenn es um Ihr Shell-Skript geht,

[ "$DEBUG" == 'true' ] && set -x

Ihr Skript hat möglicherweise einige zusätzliche Informationszeilen gedruckt, als der Ausführungsmodus als ausgewählt wurde DEBUG. Traditionell wurde der Debug-Modus aktiviert, wenn ein Skript mit einem optionalen Argument wie z-d



6

-u: standardmäßig deaktiviert. Bei Aktivierung wird bei Verwendung einer nicht konfigurierten Variablen eine Fehlermeldung angezeigt.

-v: standardmäßig inaktiv. Nach der Aktivierung wird der ursprüngliche Inhalt der Informationen (ohne variable Auflösung) angezeigt, bevor die Informationen ausgegeben werden.

-x: standardmäßig inaktiv. Wenn aktiviert, wird der Befehlsinhalt angezeigt, bevor der Befehl ausgeführt wird (nach der variablen Auflösung gibt es ein ++ - Symbol).

Vergleichen Sie die folgenden Unterschiede:

/ # set -v && echo $HOME
/root
/ # set +v && echo $HOME
set +v && echo $HOME
/root

/ # set -x && echo $HOME
+ echo /root
/root
/ # set +x && echo $HOME
+ set +x
/root

/ # set -u && echo $NOSET
/bin/sh: NOSET: parameter not set
/ # set +u && echo $NOSET
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.