Frage Welches ist besser: verwenden; oder && um mehrere Befehle in einer Zeile auszuführen?


In Tutorials und How-To's sehe ich oft Befehle kombiniert. Zum Beispiel,

sudo apt-get update && sudo apt-get install pyrenamer

Es scheint vier mögliche Anschlüsse zu geben: &, &&, || und ;. Obwohl die &  Connector ist klar für mich (es sendet einen Prozess in den Hintergrund und lässt das Terminal zur Verfügung), ist es nicht klar, was der Unterschied zwischen ist && und ;. Und ich wusste nicht || bis Kayas Kommentar.

Die folgenden Fragen beschäftigen sich mit dem Unterschied zwischen den beiden Konnektoren, tun dies aber meist in den Kommentaren:

Also hier sind eine Reihe von verwandten Fragen:

  1. Was ist der Unterschied zwischen ; und &&?
  2. Wann sollten Sie sie verwenden? beziehungsweise? Es wäre schön, einige Anwendungsfälle zu sehen: Wenn ich einen Befehl ausführen möchte und nachdem er meinen Computer heruntergefahren hat, welchen Anschluss sollte ich wählen?
  3. Was sind Ihre Vorteile und Gefahren? Robie Basak Erwähnt in einem Kommentar zu diese Antwort dass ein Befehl wie cd /somewhere_else; rm -Rf * kann destruktive Folgen haben, wenn beispielsweise das erste Element in der Befehlskette ausfällt.
  4. Wenn relevant, woher kommen sie?

331
2017-08-20 16:41


Ursprung


Es gibt einen anderen Connector, auf den Sie möglicherweise nicht gestoßen sind: ||ist das gleiche wie && außer dass es nur den zweiten Befehl ausführt, wenn der erste mit einem Nicht-Null-Status (nicht erfolgreich) beendet wurde. - Kaya
Beachten Sie auch, dass Sie Ihr Skript mit ausführen set -e stoppt das Skript bei einem Fehler, als wären alle Befehle verbunden &&. - choroba
stackoverflow.com/questions/3573742/ ... - Ciro Santilli 新疆改造中心 六四事件 法轮功
Niemand hat Qn 4 beantwortet ... Ich vermute das Verhalten von && und || wurde von der Programmiersprache C inspiriert. Im Falle von (x && y), wenn x zu false auswertet, muss der ganze Ausdruck falsch sein, so dass ein Compiler die Auswertung von y optimieren könnte, falls es teuer war. Die modernen C- und C ++ - Standards tatsächlich benötigen diese Optimierung, so können Programme sicher annehmen, dass y nicht ausgewertet wird, wenn x falsch ist. Zum Beispiel wird (ptr && ptr-> days> 31) nicht abstürzen, selbst wenn ptr null ist. Auch in C enden Aussagen mit; unabhängig davon, ob es eine andere Aussage in derselben Zeile gibt oder nicht. - Kevin


Antworten:


Cheatsheet:

A; B    # Run A and then B, regardless of success of A
A && B  # Run B if and only if A succeeded
A || B  # Run B if and only if A failed
A &     # Run A in background.

606
2017-10-20 11:02



Und natürlich, A & B &: Führen Sie A im Hintergrund aus, führen Sie B im Hintergrund aus (unabhängig vom Erfolg), und geben Sie die Steuerung an die Shell zurück. Dies funktioniert oft so, als würden beide Prozesse gleichzeitig ausgeführt. - Limited Atonement
Ist es möglich zu sagen: führe einen im Hintergrund aus, gefolgt von b im Hintergrund nur wenn ein funktioniert? ( Ich vermute &&& ?) - user230910
@ user230910: das wäre (A && B) &. - leftaroundabout
Können Sie auf ein autorisierendes Dokument verweisen? - Jaime Hablutzel
@Jack Wenn es von Cronjob ausgeführt wird, folgt es nicht ganz dieser Regel, irgendeine Idee warum? Für eine Python-Datei - CodeGuru


&& Führt nur den zweiten Befehl aus, wenn der erste Befehl mit dem Status 0 beendet wurde (war erfolgreich). ; Führt beide Befehle aus, auch wenn der erste mit einem Nicht-Null-Status beendet wird.

Ihr Beispiel mit && kann äquivalent paraphrasiert werden als

if sudo apt-get update ; then
    sudo apt-get install pyrenamer
fi

77
2017-08-20 16:46



Vielen Dank. Ich habe die Frage aktualisiert, um sicherzustellen, dass die verschiedenen Teilfragen leicht unterscheidbar sind. - don.joey
@Private: Du solltest verwenden ; wenn der zweite Befehl nicht den vorherigen benötigt, um erfolgreich zu sein. - choroba


Verwenden ; führt die Befehle unabhängig davon aus, ob der erste Befehl erfolgreich ist oder nicht.

verwenden && Führe den 2. Befehl nur aus, wenn der erste Befehl erfolgreich ausgeführt wurde (Status 0).

Beide werden aus unterschiedlichen Perspektiven verwendet. Wie für einen längeren Prozess, sagen Sie für eine Installation müssen Sie es kompilieren und installieren. Du solltest make && make install. Daher wird die Installation nur ausgeführt, wenn make erfolgreich.

Also für abhängige Befehle sollten Sie verwenden &&

Wing Bash oder Befehle mit unabhängigen Befehlen verwenden ; 

Also, wenn Sie den Computer herunterfahren möchten, sogar der erste Job fehlgeschlagen Verwendung ; , aber wenn Sie auf den vollständigen Erfolg des ersten Jobs wollen, starten Sie das Herunterfahren &&


28
2017-08-20 16:50



Vielen Dank. Ich mag den letzten Anwendungsfall, den Sie präsentieren. Ich habe die Frage aktualisiert. - don.joey


a ; b läuft b unabhängig vom Exit-Status von a. a && b Wird nur ausgeführt, wenn eine erfolgreich war.

Dies ist notwendig und ausreichend, um die ersten 3 Fragen zu beantworten. Insbesondere ist die 2 zu breit und kann nicht "eine" definitive Antwort gegeben werden - Ihre beste Wette ist, von Fall zu Fall zu entscheiden.

Wie für die vierte Frage: Sie sind Bash-Syntax.

Es besteht keine intrinsische Gefahr bei der Verwendung von beiden. Auch hier ist die obige Definition ausreichend. Es bedeutet, dass Sie schreiben werden && wann b hat unbeabsichtigte Auswirkungen wenn a ist nicht erfolgreich. Es gibt keine Notwendigkeit für weitere Regeln oder Erklärungen, IMHO.


13
2017-08-20 21:05