Führen Sie im Fall von || zwei Befehle aus oder &&

10

Ich habe über && und || gelesen und ich möchte im falschen Fall zwei Befehle ausführen.

Ich habe es versucht, ;aber das läuft immer . Ich habe versucht, es in geschweifte Klammern zu setzen, { command1; command2 }aber das führt zu einem Syntaxfehler.

Ich möchte so etwas tun

command && echo "Ok, continuing" || echo "Check internet connection"; exit 1

Dies wird nur beendet, wenn keine Internetverbindung besteht.

Thomas Weller
quelle
1
Dies scheint ein einfacher Tippfehler zu sein. Eine viel interessantere Frage sind die Unterschiede zwischen ()und {}.
Edwinksl

Antworten:

26

Durch die Verwendung von Parens werden die Befehle in eine Unterschale eingefügt, die nicht immer Ihren Wünschen entspricht. Alternativ können Sie geschweifte Klammern verwenden:

command && echo "Ok, continuing" || { echo "Check internet connection"; exit 1; }

Der Trick dabei ist, dass im Gegensatz zu Parens dem letzten Befehl in geschweiften Klammern gefolgt werden muss ;.

Warum ein Semikolon oder eine neue Zeile erforderlich ist

Eine geschweifte Klammer ist ein gültiges Argument für einen Befehl. Hier ist zum Beispiel eine geschweifte Klammer als Argument für echo:

$ echo }
}

Folglich, wenn die Shell sieht:

{ command1; command2 }

Die Shell interpretiert Befehl1 als ohne Argumente und Befehl2 als ein Argument, das aus dem Zeichen besteht }. Eine geschweifte Klammer }wird nur dann als Schließen einer Gruppierung interpretiert, wenn sie einem Semikolon oder einer neuen Zeile folgt. Damit das oben genannte funktioniert:

{ command1; command2; }

Unterschalen und der Unterschied zwischen {...}und(...)

Beachten Sie, dass Folgendes xauf 10 gesetzt ist, diese Einstellung jedoch vergessen wird, bevor der echoBefehl ausgeführt wird:

$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0

Bei geschweiften Klammern hingegen wird an die Einstellung von x=10erinnert:

$ x=0; false || { echo Hello; x=10; }
Hello
$ echo $x
10

Der Unterschied besteht darin, dass Variablenzuweisungen in einer Unterschale nach Abschluss der Unterschale nicht überleben.

Dokumentation

Von man bash:

(aufführen)

Die Liste wird in einer Subshell-Umgebung ausgeführt (siehe COMMAND EXECUTION ENVIRONMENT unten). Variablenzuweisungen und integrierte Befehle, die sich auf die Umgebung der Shell auswirken, bleiben nach Abschluss des Befehls nicht wirksam. Der Rückgabestatus ist der Beendigungsstatus der Liste.

{ aufführen; }}

list wird einfach in der aktuellen Shell-Umgebung ausgeführt. Die Liste muss mit einem Zeilenumbruch oder einem Semikolon abgeschlossen werden. Dies wird als Gruppenbefehl bezeichnet. Der Rückgabestatus ist der Beendigungsstatus der Liste. Beachten Sie, dass {und} im Gegensatz zu den Metazeichen (und) reservierte Wörter sind und dort auftreten müssen, wo ein reserviertes Wort erkannt werden darf. Da sie keinen Wortumbruch verursachen, müssen sie durch Leerzeichen oder ein anderes Shell-Metazeichen von der Liste getrennt werden.

[Betonung hinzugefügt]

John1024
quelle