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

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.


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.


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.