jaka jest różnica między „Command && Command” a „Command; Komenda"

49

Widzę te dwa zastosowania w Ubuntu „Command && Command” i „Command; Command”,
npapt-get update && apt-get upgrade

Co by się różniło, gdybym korzystał apt-get update; apt-get upgrade?
Nie pytam o to konkretne użycie, ale ogólnie jaka jest różnica między tymi dwoma zastosowaniami?

zła
źródło
2
Wiersza polecenia i partii zwycięstwo mają taką samą funkcję: & (simple sequencing), && (conditional AND) and || (conditional OR).
Karan
5
Zobacz także: Bash Reference Manual - Lista poleceń . Ogólnie rzecz biorąc, nie ma niczego, czego nie można znaleźć w dokumentacji; naprawdę warto przyjrzeć się, jeśli masz pytanie dotyczące określonych elementów składni.
slhck
1
@Karan A dla kompletności bash (linux / Ubuntu) ||również.
Izkata,

Odpowiedzi:

88

&&jest operatorem logicznym. ;to proste sekwencjonowanie.

W programie cmd1 && cmd2cmd2 zostanie uruchomione tylko wtedy, gdy cmd1 zakończy działanie z pomyślnym kodem powrotu.

Podczas gdy w cmd1; cmd2, cmd2 będzie działać niezależnie od statusu wyjścia cmd1 (zakładając, że nie ustawiłeś powłoki tak, aby kończyła się z każdą awarią skryptu lub coś takiego).

W pokrewnej uwadze, przy cmd1 || cmd2użyciu ||operatora logicznego „LUB”, cmd2 zostanie uruchomiony tylko wtedy, gdy cmd1 nie powiedzie się (zwraca niezerowy kod wyjścia).

Te operatory logiczne są czasami używane w skryptach zamiast podstawowej instrukcji if. Na przykład,

if [[ -f "$foo" ]]; then mv "$foo" "${foo%.txt}.mkd"; fi

... można bardziej zwięźle osiągnąć:

[[ -f "$foo" ]] && mv "$foo" "${foo%.txt}.mkd"
Etan Reisner
źródło
Uważam, że jest to trochę mylące, ponieważ z mojego zrozumienia, pomyślny kod powrotu oznacza 0, co po dodaniu do bool daje logiczny fałsz. Kierując się filozofią oceny Mccarthy'ego stosowaną w większości języków, powinna ona natychmiast zwrócić wartość false, zamiast oceniać (uruchamiać) następną instrukcję.
Della,
33

Składnia

command1 && command2

polecenie2 jest wykonywane tylko wtedy, gdycommand1zwraca status wyjścia równy zero ( prawda ). Innymi słowy, uruchom,command1a jeśli się powiedzie, uruchomcommand2.

command1 ; command2

Zarówno polecenie1 i polecenie2 będą realizowane niezależnie. Średnik umożliwia wpisanie wielu poleceń w jednym wierszu.

Powiązane :

command1 || command2

polecenie2 wykonywane jest wtedy, i tylko wtedy, gdy polecenie1 zwraca kod wyjścia niż zero. Innymi słowy, uruchomcommand1pomyślnie lub uruchomcommand2.


Przykład

&& operator:

$ rm /tmp/filename && echo "File deleted"

; operator:

$ echo "foo" ; echo "bar"

|| operator:

$ cat /tmp/filename 2>/dev/null || echo "Failed to open file"

Linki zewnętrzne

  1. Linuxtopia.org
  2. Tldp.org
stderr
źródło