W tutorialach i instrukcjach często widzę łączone polecenia. Na przykład,
sudo apt-get update && sudo apt-get install pyrenamer
Wydaje się, że cztery możliwe złącza: &
, &&
, ||
i ;
. Chociaż &
złącze jest dla mnie jasne (wysyła proces do tła i pozostawia terminal dostępny), nie jest jasne, jaka jest różnica między &&
i ;
. I nie wiedziałem o tym, ||
dopóki komentarz Kaya nie był.
Poniższe pytania dotyczą różnicy między dwoma złączami, ale najczęściej w komentarzach:
Oto kilka powiązanych pytań:
- Jaka jest różnica między
;
i&&
? - Kiedy należy ich odpowiednio używać ? Przyjemnie byłoby zobaczyć kilka przypadków użycia: jeśli chcę uruchomić polecenie, a następnie po jego zamknięciu komputera, które złącze wybrać?
- Jakie są ich zalety i niebezpieczeństwa ? Robie Basak wspomina w komentarzu do tej odpowiedzi, że na przykład polecenie
cd /somewhere_else; rm -Rf *
może mieć destrukcyjne konsekwencje, jeśli na przykład zawiedzie pierwszy element w łańcuchu poleceń. - Jeśli dotyczy, skąd pochodzą?
command-line
bash
don.joey
źródło
źródło
||
jest to samo,&&
z wyjątkiem tego, że wykonuje drugie polecenie tylko wtedy, gdy pierwsze zakończyło pracę z niezerowym (nieudanym) statusem.set -e
spowoduje zatrzymanie skryptu w przypadku awarii, tak jakby wszystkie polecenia były połączone&&
.Odpowiedzi:
Ściągawka:
źródło
A & B &
: Uruchom A w tle, następnie uruchom B w tle (niezależnie od sukcesu) i zwróć kontrolę nad powłoką. Często działa to tak samo, jak uruchamianie obu procesów jednocześnie.(A && B) &
.&&
uruchamia drugie polecenie tylko wtedy, gdy pierwsze zostało zakończone ze statusem 0 (powiodło się).;
uruchamia oba polecenia, nawet jeśli pierwsze zakończy działanie z niezerowym statusem.Twój przykład z
&&
może być równoważnie sparafrazowany jakoźródło
;
jeśli drugie polecenie nie wymaga poprzedniego, aby odnieść sukces.Użycie
;
spowoduje wykonanie poleceń niezależnie od tego, czy pierwsze polecenie zakończy się powodzeniem, czy nie.za pomocą
&&
polecenia wykonania 2. polecenia tylko wtedy, gdy pierwsze polecenie zostało wykonane pomyślnie (status 0).Oba są używane z innej perspektywy. Jak w przypadku dłuższego procesu, powiedz, że w przypadku instalacji musisz ją skompilować i zainstalować. zalecana
make && make install
. Instalacja rozpocznie się tylko pomake
pomyślnym zakończeniu .Dlatego w przypadku poleceń zależnych powinieneś użyć
&&
Wring Bash lub użycie poleceń z niezależnymi poleceniami
;
Więc jeśli chcesz zamknąć komputer, nawet pierwsze zadanie nie powiodło się
;
, ale jeśli chcesz po pełnym sukcesie pierwszego zadania zainicjuj zamknięcie&&
źródło
a ; b
będzie działać b niezależnie od statusu wyjścia a.a && b
uruchomi b tylko jeśli się powiedzie.Jest to konieczne i wystarczające, aby odpowiedzieć na pierwsze 3 pytania. W szczególności 2 jest zbyt szerokie i nie można na nie odpowiedzieć „jedną”, ostateczną odpowiedzią - najlepiej postawić na podstawie indywidualnych przypadków.
Co do czwartego pytania: Składnia Bash .
Korzystanie z nich nie wiąże się z żadnym niebezpieczeństwem. Ponownie powyższa definicja jest wystarczająca. Oznacza to, że napiszesz,
&&
gdyb
ma niezamierzone skutki, jeślia
się nie powiedzie. IMHO nie wymaga dalszych zasad ani wyjaśnień.źródło
Bardzo dobra zasada. Dodałbym, że w niektórych przypadkach użycie tych poleceń w podpowłoce ma sens, gdy chcemy rozważyć je jako pojedynczą jednostkę lub nie chcemy powiązać niektórych wyników operacji z bieżącą powłoką.
Przykłady:
-concatenate wyjście dwóch poleceń:
-wchodzenie do katalogu i wykonywanie stamtąd polecenia bez zmieniania bieżącego katalogu powłoki:
źródło