Wie deaktiviere ich „set -e“ für einen einzelnen Befehl?

Wie deaktiviere ich „set -e“ für einen einzelnen Befehl?

Der Befehl „set -e“ führt dazu, dass ein Bash-Skript sofort fehlschlägt, wenn ein beliebiger Befehl einen Exit-Code ungleich Null zurückgibt.

  1. Gibt es eine einfache und elegante Möglichkeit, dieses Verhalten für einen einzelnen Befehl innerhalb eines Skripts zu deaktivieren?

  2. An welchen Stellen ist diese Funktionalität im Bash-Referenzhandbuch dokumentiert (http://www.gnu.org/software/bash/manual/bashref.html)?

Antwort1

  1. Etwas wie das:

    #!/usr/bin/env bash
    
    set -e
    echo hi
    
    # disable exitting on error temporarily
    set +e
    aoeuidhtn
    echo next line
    
    # bring it back
    set -e
    ao
    
    echo next line
    

    Laufen:

    $ ./test.sh
    hi
    ./test.sh: line 7: aoeuidhtn: command not found
    next line
    ./test.sh: line 11: ao: command not found
    
  2. Es wird in setder integrierten Hilfe beschrieben:

    $ type set
    set is a shell builtin
    $ help set
    (...)
    Using + rather than - causes these flags to be turned off.
    

Das Gleiche ist hier dokumentiert:https://www.gnu.org/software/bash/manual/bashref.html#The-Set-Builtin.

Antwort2

Eine Alternative zur Rücknahme der Kaution bei einem Fehler wäre, auf jeden Fall einen Erfolg zu erzwingen. Sie können so etwas tun:

cmd_to_run || true

Das gibt 0 (true) zurück, daher sollte set -e nicht ausgelöst werden

Antwort3

Wenn Sie versuchen, den Rückgabe-/Fehlercode (Funktion oder Fork) abzufangen, funktioniert dies:

function xyz {
    return 2
}

xyz && RC=$? || RC=$?

Antwort4

Ein anderer Ansatz, den ich ziemlich einfach finde (und der setneben auch für andere Optionen gilt -e):

Verwenden Sie es, $-um die Einstellungen wiederherzustellen.

Zum Beispiel:

oldopt=$-
set +e
# now '-e' is definitely disabled.
# do some stuff...

# Restore things back to how they were
set -$oldopt

Allerdings sind -edie von anderen speziell erwähnten Optionen ( || trueoder „in ein setzen if“) möglicherweise idiomatischer.

verwandte Informationen