Kann überprüft werden, ob -e in einem Bash-Skript festgelegt ist?

9

Wenn eine Shell-Funktion eine bestimmte Einstellung von -e / + e benötigt, um zu funktionieren, ist es möglich, diese Einstellung lokal festzulegen und dann auf ihre vorherige Einstellung zurückzusetzen, bevor die Funktion beendet wird?

myfunction()
{
   # Query here if -e is set and remember in a variable?
   # Or push the settings to then pop at the end of the function?
   set +e
   dosomething
   doanotherthing
   # Restore -e/+e as appropriate, don't just do unconditional   set -e
}
usta
quelle

Antworten:

12

Sie haben die Flags derzeit in der Variablen gesetzt $-, sodass Sie diese zu Beginn der Funktion beibehalten und anschließend wiederherstellen können.

save=$-
...
if [[ $save =~ e ]]
then set -e
else set +e
fi
meuh
quelle
Es sollte beachtet werden, dass dies $-auch funktioniert /bin/shund Sie wahrscheinlich keine Bashismen benötigen, um es zu analysieren. Verwenden Sie einfach zB Globbing, das casebereitstellt
Josip Rodin
2

Sie können den Flag-Wert über die Variable SHELLOPTS lesen:

  > set +e 
  > echo $SHELLOPTS
    braceexpand:emacs:hashall:histexpand:history:interactive-comments:monitor
  > set -e 
  > echo $SHELLOPTS
    braceexpand:emacs:errexit:hashall:histexpand:history:interactive-comments:monitor

Sie sehen, dass nach dem Einstellen set -eder Wert errexitin $SHELLOPTSangezeigt wird. Sie können es von dort aus überprüfen.

Sie können dies jedoch umgehen (wenn Sie möchten!), Indem Sie sich an folgenden Punkt erinnern: gemäß Handbuch :

-e :

..... Diese Option gilt für die Shell-Umgebung und jede Subshell-Umgebung separat.

Wenn Sie also Ihre Funktion in einer Subshell ausführen, wie z

   zz="$(myfunction)"

Sie müssen sich keine Sorgen machen, ob die errexitVariable in der aufrufenden Umgebung festgelegt ist oder nicht, und Sie können sie nach Ihren Wünschen festlegen.

MariusMatutiae
quelle
Danke, SHELLOPTS ist nützlich, um sich dessen bewusst zu sein. Ich finde $ - vorgeschlagen von @meuh einfacher programmgesteuert zu überprüfen, deshalb habe ich diese Antwort akzeptiert.
usta
Der Hinweis zu Subshells ist ebenfalls nützlich, aber ich wollte vermeiden, die Anrufseiten zu ändern. Andernfalls würde ich wahrscheinlich myfunctionAufrufe ändern myfunction || true, um den Effekt von -e für die Aufrufe zu unterdrücken, und muss nicht erst set +einnerhalb der Funktion arbeiten.
usta
@MariusMatutiae: 20000 Glückwünsche.
Scott