Kommandozeile - wozu dient das &&?
In der Schale, wenn Sie sehen
$ command one && command two
Die Absicht ist, den folgenden Befehl auszuführen, &&wenn der erste Befehl erfolgreich ist. Dies ist idiomatisch für Posix-Muscheln und nicht nur in Bash zu finden.
Es soll verhindern, dass der zweite Prozess ausgeführt wird, wenn der erste fehlschlägt.
Sie werden vielleicht bemerken, dass ich das Wort "Absicht" verwendet habe - das hat einen guten Grund. Nicht alle Programme haben das gleiche Verhalten. Damit dies funktioniert, müssen Sie verstehen, was das Programm als "Fehler" betrachtet und wie es damit umgeht, indem Sie die Dokumentation und gegebenenfalls den Quellcode lesen.
Ihre Shell berücksichtigt einen Rückgabewert von 0 für true und andere positive Zahlen für false
Programme geben beim Beenden ein Signal zurück . Sie sollten 0 zurückgeben, wenn sie erfolgreich beendet werden, oder größer als Null, wenn sie dies nicht tun. Dies ermöglicht eine begrenzte Kommunikation zwischen Prozessen.
Das &&wird AND_IFin der Posix-Shell-Grammatik genannt , die Teil einer and_orListe von Befehlen ist, zu denen auch ||die mit einer OR_IFähnlichen Semantik gehört.
Grammatiksymbole, zitiert aus der Dokumentation:
%token AND_IF OR_IF DSEMI
/* '&&' '||' ';;' */
Und die Grammatik (auch aus der Dokumentation zitiert), die zeigt, dass eine beliebige Anzahl von AND_IFs ( &&) und / oder OR_IFs ( ||) aneinander gereiht werden kann (wie and_orrekursiv definiert):
and_or : pipeline
| and_or AND_IF linebreak pipeline
| and_or OR_IF linebreak pipeline
Beide Operatoren haben die gleiche Priorität und werden von links nach rechts ausgewertet (sie sind linksassoziativ). Wie die Dokumente sagen:
Eine AND-ORListe ist eine Folge von einer oder mehreren Pipelines, die durch die Operatoren "&&"und getrennt sind "||".
Eine Liste ist eine Sequenz von einem oder mehreren UND-ODER - Listen , die von den Operatoren getrennt sind ';'und '&'gegebenenfalls terminiert durch ';', '&'oder.
Die Betreiber "&&"und "||"haben den gleichen Vorrang und werden mit linker Assoziativität bewertet. Beispielsweise schreiben beide folgenden Befehle ausschließlich Balken in die Standardausgabe:
$ false && echo foo || echo bar
$ true || echo foo && echo bar
Im ersten Fall ist false ein Befehl, der mit dem Status von beendet wird 1
$ false
$ echo $?
1
was bedeutet, echo fooläuft nicht (dh Kurzschluss echo foo). Dann wird der Befehl echo barausgeführt.
Im zweiten Fall wird true mit einem Code von beendet 0
$ true
$ echo $?
0
und wird daher echo foonicht ausgeführt, dann echo barwird ausgeführt.
false && echo "Will not be printed".