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_IF
in der Posix-Shell-Grammatik genannt , die Teil einer and_or
Liste 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_IF
s ( &&
) und / oder OR_IF
s ( ||
) aneinander gereiht werden kann (wie and_or
rekursiv 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-OR
Liste 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 foo
läuft nicht (dh Kurzschluss echo foo
). Dann wird der Befehl echo bar
ausgeführt.
Im zweiten Fall wird true mit einem Code von beendet 0
$ true
$ echo $?
0
und wird daher echo foo
nicht ausgeführt, dann echo bar
wird ausgeführt.
false && echo "Will not be printed"
.