Verwenden von set in der Bash-Shell
Die Bash-Shell enthält mehrere nützliche eingebaute Befehle, um die Umgebung einer aktuell laufenden Shell-Sitzung zu manipulieren. Der eingebaute set
-Befehl bietet die Möglichkeit, Shell-Umgebungsvariablen und -optionen anzuzeigen und zu ändern.
In diesem Tutorial wird der Einsatzbereich des Befehls set
besprochen und wie man effektiv Bash-Skripte schreibt, um gute Umgebungsoptionen einzurichten.
Befehlsverfolgung Mit set -x
in Bash
Standardmäßig wird beim alleinigen Ausführen des Befehls set
eine Liste der aktuell eingestellten Variablen und ihrer Werte zurückgegeben, einschließlich des Speicherorts der ausführbaren Bash-Datei, Versionsinformationen und Umgebungsvariablen wie PATH.
Die Verwendung des Befehls erfolgt, wenn Sie die ausgeführten Befehle anzeigen. Wenn Sie ein Programmierer sind, könnte dies Ihnen helfen, Ihre Bash-Skripte zu debuggen, um festzustellen, ob sie bei einem bestimmten Befehl fehlschlagen.
Führen Sie dazu set -x
oder set -o xtrace
aus, wodurch die Befehlsverfolgung aktiviert wird. Während der Befehl selbst nichts ausgibt, werden nachfolgende Befehle direkt vor der Ausführung ausgegeben. Es ist hilfreich, in Ihren Befehlen geschweiften Erweiterungen zu verwenden – ein neues Bash-Feature.
Wenn Sie einen Befehl zum Entfernen von nummerierten TXT-Dateien haben, zeigt die aktivierte Befehlsablaufverfolgung set
die erweiterte Form der geschweiften Klammern mit allen TXT-Dateien in diesem Verzeichnis.
user@linux:~$ set -x
user@linux:~$ cd /tmp
+ cd /tmp
user@linux:~$ # example of expansion (and comments do not print out in traces)
user@linux:~$ touch {1..5}.txt
+ touch 1.txt 2.txt 3.txt 4.txt 5.txt
user@linux:~$ rm -f *.txt
+ rm -f *.txt
user@linux:~$ # however, asterisk globs do not expand.
Andere nützliche Optionen für set
in Bash
Der Befehl set
bietet zahlreiche andere sich gegenseitig ausschließende Optionen für Shell-Operationen, ähnlich der Befehlsverfolgung, wie z. B. den Befehl nicht auszuführen, die Befehlszeile in einen Editor im Emacs-Stil zu ändern, Backtraces auszugeben, wenn ein Fehler auftritt, und so weiter.
Denken Sie daran, dass Sie zum Aktivieren einer Option set -o <option_name>
und set +o <option_name>
verwenden müssen, um sie zu deaktivieren.
Eine vollständige Liste dieser Optionen wird unten erläutert, wobei die Informationen aus dem GNU-Handbuch für das integrierte Set stammen.
allexport
– Wenn Sie ein Bash-Skript haben, das Umgebungsvariablen setzt, und Sie möchten, dass diese Variablen für die aktuelle Shell und alle nachfolgenden Subshells verfügbar sind, bewirktset -a
oderset -o allexport
diese zu exportierenden Variablen und wird für diese Shell-Kontexte verfügbar.braceexpand
- Klammerexpansion ermöglicht es uns, eine konstante Menge von Zahlenpaaren in eine durch Leerzeichen getrennte Zeichenfolge des Bereichs dieser Zahlen zu erweitern. Wenn Sie dies deaktivieren, wird die geschweifte Erweiterung deaktiviert, wenn Sie möchten, dass ein niedrigerer Befehl in der Shell die geschweiften Klammern auswertet.Emacs
– Aktiviert die Emacs-basierte Bearbeitung auf der Befehlszeile für diejenigen, die damit vertraut sind.errexit
– Wenn ein Befehl in einem Bash-Skript mit einem Statuscode ungleich Null beendet wird, wird das gesamte Skript beendet. Dies kann verhindert werden, indem der fehlgeschlagene Befehl mit einem zweiten Befehl ODER-verknüpft wird, der einen Null-Exit-Code zurückgibt, um zu verhindern, dass das Skript vorzeitig beendet wird.errtrace
– Ein Backtrace zum fehlgeschlagenen Befehl wird ausgegeben, wenn ein Programm mit einem Nicht-Null-Statuscode beendet wird.hashall
– Verfolgt Befehlsorte, wenn sie in der Umgebung PATH gesucht werden. Die Befehlspfade werden zur schnelleren Suche und Ausführung an einem Ort zwischengespeichert.histexpand
- Erweitert das “!” Zeichen in Zeichenketten als Verlaufsersetzungsfunktion. Wenn Sie Probleme haben, das “!” Zeichen in Strings verwenden und nicht viel Verlaufsersetzungsarbeit leisten, können Sie dies sicher ausschalten.History
– Dies ist eine entscheidende Funktion, die es Ihnen ermöglicht, eine Liste der zuvor ausgeführten Befehle zu führen.ignoreeof
– Das EOF-Zeichen (bereitgestellt von Strg-D) beendet normalerweise eine Bash-Shell oder einen Befehl, der Eingaben akzeptiert. Das Deaktivieren dieser Option führt dazu, dass EOF ignoriert wird, was einige Befehle beschädigen könnte, die nur EOF akzeptieren.Monitor
– Aktiviert die Auftragssteuerung, wodurch im Hintergrund laufende Prozesse ihren Beendigungscode ausgeben, wenn sie die Ausführung abschließen. Es ist nützlich, Hintergrundprozesse zu überprüfen, wenn sie abgeschlossen sind.noclobber
– Verhindert, dass Bash-Umleitungsprogramme wie>&, <>
vorhandene Dateien abschneiden. Dies ist praktisch, wenn Sie beim Testen mit echten Protokolldateien arbeiten und vorhandene Protokolle nicht versehentlich löschen möchten.noexec
- Gibt Befehle aus, führt sie aber nicht aus. Wenn es in einem Skript verwendet wird, kannnoexec
bestimmte Befehle überspringen und andere ausführen, indem es sie an bestimmten Stellen ein- und ausschaltet.noglob
– Verhindert die Erweiterung von Globs (z. B. *.txt).Notify
- Bei Verwendung mitmonitor
drucktnotify
die Hintergrund-Job-Statuscodes sofort aus, anstatt auf den nächsten Shell-Prompt zu warten.nounset
– Gibt einen Fehlercode zurück, wenn eine Variable nicht gesetzt ist und versucht wird, ihren Wert zu lesen.onecmd
- Beenden nach dem Lesen und Ausführen des nächsten Befehls.
Weitere Optionen finden Sie im obigen Handbuch, falls Sie sie lesen möchten. Hoffentlich können diese Optionen Ihre Bash-Programmiererfahrung verbessern.
Wenn Sie diese Optionen noch einmal über die Befehlszeile lesen möchten, versuchen Sie, das help set
auszuführen. Wir empfehlen auch die Seite des Linux Documentation Project für weitere Informationen über den Befehl set
.