In Tutorials und Anleitungen sehe ich oft kombinierte Befehle. Zum Beispiel,
sudo apt-get update && sudo apt-get install pyrenamer
Es scheint vier mögliche Anschlüsse zu sein: &
, &&
, ||
und ;
. Obwohl der &
Konnektor für mich klar ist (er sendet einen Prozess in den Hintergrund und lässt das Terminal verfügbar), ist nicht klar, worin der Unterschied zwischen &&
und besteht ;
. Und ich wusste es nicht, ||
bis Kayas Kommentar.
Die folgenden Fragen befassen sich mit dem Unterschied zwischen den beiden Konnektoren, aber meistens in den Kommentaren:
Hier sind einige verwandte Fragen:
- Was ist der Unterschied zwischen
;
und&&
? - Wann sollten Sie sie jeweils verwenden? Es wäre schön, einige Anwendungsfälle zu sehen: Wenn ich einen Befehl ausführen und dann meinen Computer herunterfahren möchte, welchen Anschluss soll ich wählen?
- Was sind ihre Vorteile und Gefahren ? Robie Basak erwähnt in einem Kommentar zu dieser Antwort, dass ein Befehl wie
cd /somewhere_else; rm -Rf *
zum Beispiel destruktive Konsequenzen haben kann, wenn das erste Element in der Befehlskette ausfällt. - Woher kommen sie, falls relevant?
command-line
bash
don.joey
quelle
quelle
||
ist derselbe wie,&&
außer dass er den zweiten Befehl nur ausführt, wenn der erste mit einem Status ungleich Null (nicht erfolgreich) beendet wurde.set -e
das Skript bei einem Fehler anhält, als ob alle Befehle mit verbunden wären&&
.Antworten:
Spickzettel:
quelle
A & B &
: Führen Sie A im Hintergrund aus, führen Sie dann B im Hintergrund aus (unabhängig vom Erfolg) und geben Sie die Kontrolle an die Shell zurück. Dies funktioniert oft in etwa so, als würden beide Prozesse gleichzeitig ausgeführt.(A && B) &
.&&
Führt den zweiten Befehl nur aus, wenn der erste mit dem Status 0 beendet wurde (erfolgreich war).;
Führt beide Befehle aus, auch wenn der erste mit einem Status ungleich Null beendet wird.Ihr Beispiel mit
&&
kann äquivalent umschrieben werden alsquelle
;
wenn der zweite Befehl den vorherigen nicht benötigt, um erfolgreich zu sein.Mit
;
werden die Befehle ausgeführt, unabhängig davon, ob der erste Befehl erfolgreich ist oder nicht.Verwenden des
&&
Befehls "Execute 2nd" nur, wenn der erste Befehl erfolgreich ausgeführt wurde (Status 0).Beide werden aus unterschiedlichen Perspektiven eingesetzt. Wie für einen längeren Prozess, sagen wir für eine Installation, die Sie kompilieren und installieren müssen. du solltest
make && make install
. Die Installation wird also nur dann ausgeführt, wenn siemake
erfolgreich war.Für abhängige Befehle sollten Sie also verwenden
&&
Wring bash oder Befehle mit unabhängigen Befehlen verwenden
;
Wenn Sie also den Computer herunterfahren möchten, obwohl der erste Job fehlgeschlagen ist, verwenden Sie ihn
;
. Wenn der erste Job jedoch vollständig erfolgreich sein soll, starten Sie den Herunterfahrvorgang&&
quelle
a ; b
wird unabhängig vom Exit-Status von a ausgeführt.a && b
wird nur dann ausgeführt, wenn a erfolgreich war.Dies ist notwendig und ausreichend, um die ersten 3 Fragen zu beantworten. Insbesondere ist die 2 zu weit gefasst und kann nicht als "eine" definitive Antwort angegeben werden. Am besten entscheiden Sie im Einzelfall.
Was die vierte Frage betrifft : Sie sind Bash-Syntax .
Auch bei der Verwendung besteht keine Gefahr. Auch hier ist die obige Definition ausreichend. Es bedeutet, dass Sie schreiben,
&&
wennb
unbeabsichtigte Auswirkungen hat, wenna
dies nicht gelingt. Es gibt keine Notwendigkeit für weitere Regeln oder Erklärungen, IMHO.quelle
Eine sehr gute Faustregel. Ich würde hinzufügen, dass in einigen Fällen die Verwendung dieser Befehle in einer Subshell sinnvoll ist, wenn wir sie als einzelne Einheit betrachten oder einige Operationsergebnisse nicht mit der aktuellen Shell koppeln möchten.
Beispiele:
- Verketten Sie die Ausgabe von zwei Befehlen:
-in ein Verzeichnis gehen und dort einen Befehl ausführen, ohne das aktuelle Verzeichnis der Shell zu ändern:
quelle