Bash / sh - różnica między && a;

136

Zwykle używam ;do łączenia więcej niż jednego polecenia w linii, ale niektórzy wolą &&. Czy jest jakaś różnica? Na przykład cd ~; cd -i cd ~ && cd -wydaje się, że robi to samo. Która wersja jest bardziej przenośna, np. Będzie obsługiwana przez podzbiór bash, taki jak powłoka Androida lub coś podobnego?

psihodelia
źródło

Odpowiedzi:

193

Jeśli poprzednie polecenie zawiodło, ;drugie zostanie uruchomione.

Ale z &&drugim nie będzie działać.

Jest to „leniwy” logiczny operand „AND” między operacjami.

ignoruj
źródło
2
Innymi słowy, ma zachowanie zwarcia
peterchaula
@peter Który? ;Jeden lub &&jeden? Czy masz na myśli oba?
Shayan
@Shayan, the &&.
peterchaula
57

Używam &&ponieważ dawno temu na pobliskim komputerze:

root# pwd
/
root# cd /tnp/test; rm -rf *
cd: /tnp/test: No such file or directory
...
... and after a while ...
...   
^C

ale nie pomogło ...;)

cd /tnp/test && rm -rf * jest bezpieczny... ;)

jm666
źródło
26
Aby być bezpieczniejszym, rm -rf /tnp/test
użyłbym
5
Aby być jeszcze bezpieczniejszym, lepiej jest rm /tnp/test/ -rfzapobiegać śmiertelnemu kliknięciu
radrow
22

W cmd1 && cmd2, cmd2jest wykonywane tylko wtedy, gdy się cmd1powiedzie (zwraca 0).

W cmd1 ; cmd2, cmd2jest wykonywany w każdym przypadku.

Obie konstrukcje są częścią powłoki zgodnej z POSIX.

Pascal Cuoq
źródło
11

&&oznacza wykonanie następnej komendy, jeśli poprzednia zakończyła się ze statusem 0. W przeciwnym razie użyj ||np. do wykonania, jeśli poprzednie polecenie zakończyło się ze statusem różnym od 0, ;zawsze jest wykonywane.

Bardzo przydatne, gdy musisz wykonać określoną akcję w zależności od tego, czy poprzednie polecenie zakończyło się dobrze, czy nie.

Fredrik Pihl
źródło
5

Polecenia rozdzielone przez ;są wykonywane sekwencyjnie, niezależnie od ich statusu wykonania.

Z &&, drugie polecenie jest wykonywane tylko wtedy, gdy pierwsze zakończy się pomyślnie (zwraca kod zakończenia 0).

Jest to omówione na stronie podręcznika bash pod Lists. Spodziewałbym się, że każda powłoka podobna do Uniksa będzie obsługiwać oba te operatory, ale nie wiem konkretnie o powłoce Androida.

Dave Costa
źródło
2
Oto link do podręcznika basha: gnu.org/software/bash/manual/bashref.html#Lists
glenn jackman
3

&&pozwala na wykonanie warunkowe, podczas gdy ;zawsze wykonywane jest drugie polecenie.

Na przykład command1 && command2, command2zostanie wykonane tylko po command1zakończeniu działania exit 0, sygnalizując, że wszystko poszło dobrze, podczas gdy w command1 ; command2drugim poleceniu zawsze zostanie wykonane bez względu na wynik command1.

Marcel
źródło
1

&& jest logicznym AND w bash. Bash ma ocenę zwarciową logicznego AND. Ten idiom jest prostszym sposobem wyrażenia:


cmd1;rc=$?
if [ $rc -eq 0 ]; then
   cmd2
fi

Natomiast ; wersja jest po prostu:


cmd1
cmd2
frankc
źródło