Jaka jest różnica między podwójnym ampersandem (&&) a średnikiem (;) w Linux Bash?

112

Jaka jest różnica między ampersandem a średnikiem w Linux Bash ?

Na przykład,

$ command1 && command2

vs

$ command1; command2
Steve K.
źródło
6
Odpowiedziałem na to tutaj: superuser.com/a/619019/107862
Etan Reisner
9
Jeśli chodzi o brak tematu, ostatnim razem, gdy sprawdzałem, bash nadal był językiem programowania, ale wcześniej się myliłem i mogły to być suszone cukierki owocowe.
Steve K
Tak jest i gdybyś zadawał pytanie dotyczące określonego zachowania lub właściwego sposobu zrobienia określonej rzeczy, z pewnością byłby to temat. To należy do szarej kategorii „pytania o składnię języka”, która nie jest tak wyraźnie kwestią „programowania”, jeśli o mnie chodzi.
Etan Reisner
4
bash jest w pewnym sensie wytrawny, a pod pewnymi względami słodki. Pod koniec dnia jest całkiem przyjemna i przyswajalna. Nie można go jednak łatwo ukraść dzieciom.
code_monk

Odpowiedzi:

139

&&Operator jest logiczna AND Operator: jeśli lewa strona zwraca stan niezerowe exit, ponownie operatora o statusie i nie ocenia właściwej stronie (zwarć), inaczej ocenia prawej stronie i zwraca jego status wyjścia . Jest to często używane, aby upewnić się, że command2zostanie uruchomiony tylko wtedy, gdy zostanie command1pomyślnie uruchomiony.

;Żeton tylko oddziela poleceń, więc to będzie działać drugie polecenie, niezależnie od tego, czy pierwsza powiedzie.

cdhowie
źródło
6
czy podwójny ampersand &&różni się od pojedynczego znaku ampersand &w bash?
Charlie Parker
16
@CharlieParker &powoduje, że polecenie jest uruchamiane w tle, więc tak. „Uruchom to w tle” bardzo różni się od „uruchom to następne polecenie tylko wtedy, gdy drugie się powiedzie”.
cdhowie
Polecenie2 uruchomi tylko polecenie1 zwróciło zerowy kod zakończenia, co oznacza, że ​​zakończyło się pomyślnie.
Nik
Czy ;nadal czeka na zakończenie pierwszego polecenia?
rfii
@rfii Tak, ale wykonuje drugie polecenie bez względu na to, czy pierwsze polecenie się powiodło. a;boznacza „biegnij, aa potem biegnij b”. a&&boznacza „uruchom a, a następnie uruchom btylko wtedy, gdy się apowiedzie”.
cdhowie
33

polecenie1 && polecenie2

command1 && command2wykonuje, command2jeśli (i tylko wtedy) command1wykonanie zakończy się pomyślnie. W żargonie uniksowym oznacza to kod zakończenia / kod powrotu równy zero.

polecenie1; polecenie2

command1; command2wykonuje się command2po wykonaniu command1sekwencyjnie. Nie ma znaczenia, czy polecenia się powiodły, czy nie.

jimm-cl
źródło
6

Pierwsza jest prostą logiką ANDwykorzystującą analizę zwarć, druga po prostu rozgranicza dwa polecenia.

W rzeczywistości dzieje się tak, że gdy pierwszy program zwraca niezerowy kod zakończenia, całość ANDjest oceniana do, FALSEa drugie polecenie nie zostanie wykonane. Później po prostu wykonuje je po kolei.

Danstahr
źródło