Was ist der Grund für die Verwendung von && anstelle von; Befehle in der gleichen Zeile platzieren?

30

Ich bin kein Linux-Experte und kein Unix-Experte. Ich frage mich, was der Unterschied zwischen diesen beiden Methoden ist, 2 Befehle in einer Zeile zu schreiben. In diesem vereinfachenden Beispiel sehe ich keinen Unterschied in der Ausgabe

Pete$date ; time
Sun Mar 17 19:37:20 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Pete$date &&time
Sun Mar 17 19:37:46 EDT 2013

real    0m0.000s
user    0m0.000s
sys 0m0.000s

Das hat keine Probleme verursacht - ich bin nur neugierig ..

pfeiffep
quelle

Antworten:

43

&&ist ein logisches "und". Das erste Argument wird ausgewertet, und das zweite Argument wird nur ausgewertet, wenn das erste true zurückgibt. Der Grund dafür ist, dass "falsch UND etwas" immer falsch ist, sodass das zweite Argument in diesem Fall nicht ausgewertet werden muss.

Stellen &&Sie daher sicher, dass der zweite Befehl nicht ausgeführt wird, wenn der erste einen Fehler meldet ( truewird durch den Exit-Code dargestellt 0, der angibt, dass kein Fehler aufgetreten ist). Im Gegensatz dazu werden ;beide Befehle ausgeführt, unabhängig vom Ergebnis des ersten.

Fazit: Befehle mit zu verketten &&ist eine gute Gewohnheit. Im Gegensatz dazu ;werden nachfolgende Befehle nicht ausgeführt, wenn etwas schief gelaufen ist.

Azimut
quelle
Meinst du das 0bedeutet trueoder das 0bedeutet wahr - es liegt ein Fehler vor?
Michael Butler
1
@MichaelButler: 0bedeutet true. Ich habe eine Klarstellung hinzugefügt.
Azimut
26

;

Führt die Befehle nacheinander aus, unabhängig vom vorherigen Beendigungsstatus:

# sh -c "exit 0" ; echo "2nd command"
2nd command
# sh -c "exit 1" ; echo "2nd command"
2nd command

&&

Logisches UND

Führen Sie den nächsten Befehl aus, aber nur, wenn der vorherige Befehl erfolgreich war (der Beendigungsstatus war 0):

# sh -c "exit 0" && echo "2nd command"
2nd command
# sh -c "exit 1" && echo "2nd command"
#

||

Logisches ODER

Führen Sie den nächsten Befehl aus, aber nur, wenn der vorherige Befehl fehlgeschlagen ist (der Beendigungsstatus war nicht 0 ):

# sh -c "exit 0" || echo "2nd command"
#
# sh -c "exit 1" || echo "2nd command"
2nd command
Phoibos
quelle
6
Auch sh -c "exit 0"kann mit truein diesen Beispielen und sh -c "exit 1"mit ersetzt werden false.
Flimm