Ich habe viele Fragen auf verschiedenen Stack-Exchange-Sites und Unix- Hilfeforen gelesen, wie man Shell-Optionen ändert und sie dann wiederherstellt .
Die empfangene Weisheit scheint entweder zu sein , um das Ergebnis zu speichern aus set +o
oder shopt -po
und dann eval
später die vorherigen Einstellungen wiederherzustellen.
Bei meinen eigenen Tests mit bash 3.x und 4.x wird die errexit
Option jedoch beim Ersetzen von Befehlen nicht korrekt gespeichert.
Hier ist ein Beispielskript, um das Problem zu zeigen:
set -o errexit
set -o nounset
echo "LOCAL SETTINGS:"
set +o
OLDOPTS=$(set +o)
echo
echo "SAVED SETTINGS:"
echo "$OLDOPTS"
Und Ausgabe (ich habe einige der irrelevanten Variablen herausgeschnitten):
LOCAL SETTINGS:
set -o errexit
set -o nounset
SAVED SETTINGS:
set +o errexit
set -o nounset
Das scheint extrem gefährlich. Die meisten Skripte, die ich schreibe, hängen davon ab errexit
, die Ausführung anzuhalten, wenn Befehle fehlschlagen. Ich habe gerade einen Fehler in einem meiner Skripte gefunden, der dadurch verursacht wurde, dass die Funktion, die errexit
am Ende wiederhergestellt werden sollte, ihn überschrieb und ihn für die Dauer des Skripts auf den Standardwert " Aus" zurücksetzte.
Ich möchte in der Lage sein, Funktionen zu schreiben, mit denen Optionen nach Bedarf festgelegt und dann alle Optionen vor dem Beenden ordnungsgemäß wiederhergestellt werden können. Aber es scheint, als ob in der Subshell, die durch die Befehlsersetzung aufgerufen wird, errexit
nicht vererbt wird.
Ich weiß nicht, wie ich das Ergebnis sparen kann, set +o
ohne Befehlsersetzung zu verwenden oder durch FIFO-Rahmen zu springen. Ich kann lesen, $SHELLOPTS
aber es ist nicht beschreibbar oder im eval
-able-Format.
Ich weiß, dass eine Alternative darin besteht, eine Subshell-Funktion zu verwenden , aber das bringt viele Kopfschmerzen mit sich, wenn es darum geht, Ausgaben zu protokollieren und mehrere Variablen zurückzugeben.
Wahrscheinlich verwandt: /programming/29532904/bash-subshell-errexit-semantics (anscheinend gibt es eine Problemumgehung für Bash 4.4 und höher, aber ich hätte lieber eine tragbare Lösung)
shopt
Set-Optionen (wie nullglob) nicht wiederhergestellt .