it-swarm.com.de

Führen Sie bei || zwei Befehle aus oder &&

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

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

Ich möchte so etwas tun

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

das wird nur beendet, wenn keine Internetverbindung besteht.

9
Thomas Weller

Durch die Verwendung von parens werden die Befehle in eine Subshell zusammengefasst, 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 der letzte Befehl in geschweiften Klammern von ; gefolgt werden muss.

Warum ein Semikolon oder ein Zeilenumbruch 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 Kommando1 als ohne Argumente und Kommando2 als mit einem Argument, das aus dem Zeichen } besteht. Eine geschweifte Klammer } wird nur dann als Abschluss einer Gruppierung interpretiert, wenn sie auf ein Semikolon oder eine neue Zeile folgt. Damit das oben genannte funktioniert:

{ command1; command2; }

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

Beachten Sie, dass die folgenden Werte x auf 10 setzen, diese Einstellung jedoch vergessen wird, bevor der Befehl echo ausgeführt wird:

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

Im Gegensatz dazu wird bei geschweiften Klammern die Einstellung von x=10 gespeichert:

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

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

Dokumentation

Aus man bash:

(Liste)

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 Exit-Status der Liste.

{ Liste; }

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 Exit-Status der Liste. Beachten Sie, dass {und} im Gegensatz zu den Metazeichen (und) reservierte Wörter sind und dort vorkommen 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]

24
John1024