Jaki jest powód używania && zamiast; umieszczać polecenia w tej samej linii?


30

Nie będąc ekspertem ani w Linuksie, ani w Uniksie, zastanawiam się, jaka jest różnica między tymi 2 metodami ciągnięcia 2 poleceń w tej samej linii? W tym uproszczonym przykładzie nie widzę żadnej różnicy w wydajności

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

Nie spowodowało to żadnych problemów - jestem po prostu ciekawy…

Odpowiedzi:


43

&&jest logicznym „i”. Pierwszy argument jest oceniany, a drugi jest oceniany tylko wtedy, gdy pierwszy zwraca true. Powodem jest to, że „fałszywe ORAZ coś” jest zawsze fałszywe, więc w tym przypadku nie ma potrzeby oceny drugiego argumentu.

Korzystając z tego &&, upewnij się, że drugie polecenie nie zostanie wykonane, jeśli pierwsze zgłosi błąd ( truejest reprezentowane przez kod wyjścia 0, który wskazuje, że nie wystąpił błąd). Natomiast ;wykonuje oba polecenia, bez względu na wynik pierwszego.

Wniosek: Łączenie poleceń za pomocą &&jest dobrym nawykiem. W przeciwieństwie do ;tego, nie wykona kolejnych poleceń, jeśli coś pójdzie nie tak.


masz na myśli to 0oznacza, trueczy to 0oznacza prawdę - jest błąd?
Michael Butler

1
@MichaelButler: 0oznacza true. Dodałem wyjaśnienie.
azimut

26

;

Sekwencyjnie wykonuje polecenia, bez względu na poprzedni status wyjścia:

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

I &

Logiczne AND

Wykonanie następnego polecenia, ale tylko wtedy, gdy poprzednie polecenie udało (kod wyjścia było 0):

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

||

Logiczne OR

Wykonaj następne polecenie, ale tylko jeśli poprzednie polecenie nie powiodło się (stan wyjścia nie był 0):

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

6
Ponadto, sh -c "exit 0"może być zastąpiony truew tych przykładach i sh -c "exit 1"z false.
Flimm
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.