GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Bash-Skript mit `set -e` stoppt nicht beim Befehl `… &&…`?

Ich verwende set -e um das Bash-Skript beim ersten Fehler zu stoppen.

Alles funktioniert OK, es sei denn, ich verwende den Befehl mit && :

$ cat script
set -e
cd not_existing_dir && echo 123
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
I'm running! =P
$

verglichen mit:

$ cat script
set -e
cd not_existing_dir
echo "I'm running! =P"
$
$ ./script
./script: line 2: cd: not_existing_dir: No such file or directory
$

Das erste Beispiel wiederholt immer noch I'm running! , aber der zweite nicht. Warum verhalten sie sich anders?

UPD. Ähnliche Frage:https://stackoverflow.com/questions/6930295/set-e-and-short-tests

Akzeptierte Antwort:

Dies ist ein dokumentiertes Verhalten.
Die Manpage bash(1) sagt für set -e ,

Die Shell wird nicht beendet, wenn der fehlgeschlagene Befehl
Teil der Befehlsliste
unmittelbar nach einem while ist oder until Schlüsselwort,
Teil des Tests nach if oder elif reservierte Wörter, Teil eines beliebigen Befehls, der in einem && ausgeführt wird oder || Liste außer dem Befehl nach dem abschließenden && oder || ,
jedem Befehl in einer Pipeline außer dem letzten,
oder wenn der Rückgabewert des Befehls mit ! invertiert wird .
[Hervorhebung hinzugefügt.]

Und die POSIX Shell Command Language Die Spezifikation bestätigt, dass dies das richtige Verhalten ist:

Das -e Die Einstellung soll ignoriert werden
wenn die zusammengesetzte Liste
nach dem while ausgeführt wird , until ,if , oder elif reserviertes Wort,
eine Pipeline, die mit ! beginnt reserviertes Wort,
oder irgendein Befehl einer UND-ODER-Liste außer dem letzten.

und Abschnitt 2.9.3 Listen dieses Dokuments definiert

Eine UND-ODER-Liste ist eine Folge von einer oder mehreren Pipelines
, die durch die Operatoren „&& getrennt sind “ und „|| “.


Linux
  1. Befehlszeilenargumente an Bash-Skript übergeben?

  2. Wie funktioniert der Continue-Befehl in einem Bash-Skript mit eingebetteten Schleifen?

  3. Rm-Befehl im Bash-Skript funktioniert nicht mit Variablen?

  4. Kann ein Bash-Skript nicht mit Strg + C stoppen?

  5. Überprüfen Sie, wie lange die Ausführung eines Bash-Skripts mit dem Time-Befehl dauert

Automatisieren Sie die Bildverarbeitung mit diesem Bash-Skript

So schreiben Sie ein Bash-Skript mit Beispielen

Bash HereDoc Tutorial mit Beispielen

Linux-Sleep-Befehl (Pausieren eines Bash-Skripts)

Bash Echo-Befehl mit Beispielen in Linux erklärt

Bash-Scripting – Printf-Befehl mit Beispielen erklärt