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 x
auf 10 gesetzt ist, diese Einstellung jedoch vergessen wird, bevor der echo
Befehl ausgeführt wird:
$ x=0; false || ( echo Hello; x=10 )
Hello
$ echo $x
0
Bei geschweiften Klammern hingegen wird an die Einstellung von x=10
erinnert:
$ 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]
()
und{}
.