Ich schreibe ein Skript, das mit ausgeführt werden muss source
, da es die Aufgabe hat, die Umgebung zu ändern. Während des Skripts möchte ich verwenden, set -e
damit ein Fehler das Skript stoppt. Das Skript sieht folgendermaßen aus:
#!/bin/bash
set -e
# do something
cd somewhere
source anotherScript
Das Problem ist, dass dies set -e
natürlich auch nach Abschluss des Skripts wirksam bleibt. Wie kann ich sicherstellen, dass die geänderte set
Option beim Beenden des Skripts ordnungsgemäß auf den vorherigen Wert zurückgesetzt wird (auf irgendeine Weise - entweder durch erfolgreichen Abschluss oder aufgrund eines Fehlers)?
bash
script
bash-scripting
Petr Pudlák
quelle
quelle
-x
/xtrace
) wird unter Ausführungsablaufverfolgung für Echobefehl unterdrücken behoben.Antworten:
Genau so, wie Sie es aktivieren: Rufen Sie das Buitin auf
set
:In der
bash(1)
Manpage unter demSHELL BUILTIN COMMANDS
Abschnitt "set" Befehl:quelle
set -o
Sie das aktuelle Setup aus. Seien Sie explizit, wenn Sie eines davon in Ihren Skripten setzen / deaktivieren.Der Befehl
set +o
listet die aktuellen Einstellungen als Befehle auf, die denselben Status wiederherstellen, zSie können alle Optionen später problemlos wiederherstellen, wenn Sie diese Ausgabe in einer Shell-Variablen speichern:
Bash enthält auch eine Reihe von nicht standardmäßigen (nicht POSIX) Optionen, die mit dem
shopt
Befehl angepasst werden . Mit dem Befehlshopt -p
können diese Optionen auf ähnliche Weise gespeichert werden.Wenn Sie nur eine Option speichern und wiederherstellen möchten, können Sie die Umgebungsvariable $ - verwenden, in der die aktuellen Optionen als Buchstaben aufgeführt sind, z
Sie können so etwas verwenden, um eine bestimmte Option zu speichern und wiederherzustellen:
quelle
Verwenden Sie eine RETURN-Falle
RETURN
Traps funktionieren auch für Skripts.main_script.sh
a_script_to_be_sourced.sh
Prüfung
quelle
Das Wiederherstellen zuvor aktivierter Einstellungen kann schnell erfolgen als:
Umgekehrt (Wiederherstellung in den ausgeschalteten Zustand) AFAIK gibt es keine solche Abkürzung und Seppos Antwort deckt alle Fälle ab.
quelle
-bash: set: -i: invalid option
weil das-i
Flag eine interaktive Shell notiert.