Składnia Linux Bash: znaczenie &&, \ i -


14

Co oznaczają „ &&”, „ \” i „ -” na końcu poleceń bash?

W szczególności natrafiłem na następującą kombinację wierszy, które mają dodawać klucze publiczne do menedżera pakietów apt Ubuntu, do czego służą te znaki?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update

„/” to nie to samo, co „\”
— Thomas,

Thomas: Naprawiono jego post
— Kyle Brandt,

Odwrotne ukośniki tutaj nie są potrzebne, ponieważ && będą wystarczające, aby sugerować kontynuację linii. Jednak użycie odwrotnego ukośnika pomaga w czytelności.
— Wstrzymano do odwołania.

Odpowiedzi:


37

„&&” służy do łączenia ze sobą poleceń, dzięki czemu następne polecenie jest uruchamiane tylko wtedy, gdy poprzednie polecenie zakończyło się bez błędów (lub, dokładniej, zakończyło z kodem powrotu 0).

Sam „\” na końcu linii jest sposobem łączenia linii razem. Więc następujące dwie linie:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
gpg --export --armor 26C2E075

są przetwarzane dokładnie tak samo, jakby linia została zapisana jako pojedyncza linia:

gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && gpg --export --armor 26C2E075

„-” to argument wiersza poleceń bez określonej funkcji bash. Dokładny sposób obsługi zależy od uruchomionego polecenia (w tym przypadku apt-key ). W zależności od kontekstu jest zwykle używany do wskazania „ odczytaj dane ze standardowego wejścia zamiast z pliku ” lub „ przetworz resztę wiersza jako dane, a nie jako argumenty wiersza poleceń ”.


5
W tym przypadku „-” nie jest parametrem sudo, ale „apt-key”, co oznacza, że ​​zamiast pliku klucza „apt-key” używa danych przechodzących przez potok („|”) do standardowego wejścia jako klucz. Opcja „gpg --export”, bez opcji „--output a_file_name.key”, wypycha nowy klucz z wyjścia gpg przez rurkę („|”) do wejścia standardowego „apt-key”. Łatwo: - )
— edomaur,

2
ups to dostaję za odpowiadanie na pytania w półśnie. naprawiony.
— goldPseudo

7
&& == if the first command succeeded, run the next one
\ == the next line is part of the first line, not two seperate lines
- == read the input from stdin (console)

6

&& jest logicznym AND:
&& jest sposobem wyrażenia Logicznego AND , co oznacza, że ​​całe wyrażenie jest Prawdą tylko wtedy, gdy obie strony są prawdziwe. W logice mówi się, że cała instrukcja (P&Q) jest prawdziwa tylko wtedy, gdy zarówno P, jak i Q są prawdziwe.

W rezultacie komputery zazwyczaj traktują P&Q jako ocenę zwarcia . A zatem, ponieważ cała instrukcja będzie Prawdą tylko wtedy, gdy Zarówno P, jak i Q są prawdziwe, to jeśli P jest fałszem, instrukcja Q nie jest oceniana . Zasadniczo komputery są leniwe (wydajne) i nie zawracają sobie głowy oceną Q, jeśli też nie mają. Dotyczy to również logicznej OR, patrz poprzedni link.

Trzy konteksty && w Bash:

1) Korzystanie z oceny zwarć ze statusem wyjścia polecenia:
Każde polecenie ma status wyjścia. Jeśli polecenie ma błąd, ma niezerowy status wyjścia. Więc jeśli status wyjścia jest niezerowy, a && jest używany do łączenia poleceń w instrukcję, późniejsze polecenia nie będą oceniane (wykonywane), jeśli wcześniejsze nie miały statusu wyjścia 0 (Prawda). Wynika to z oceny zwarcia. Więc jeśli masz:

P && Q

Q nie zostanie wykonane, jeśli P nie jest prawdą (jeśli P wyjdzie ze statusem o wartości innej niż 0, to nie jest prawda). Tak samo jak:

./configure && make

make nie zostanie wykonane, jeśli config miał błąd, nie było prawdą. Zasadniczo jest to sposób na napisanie instrukcji if, jeśli:

if ./configure ; then
   make
fi

Należy pamiętać, że w większości kontekstów 0 jest fałszem, ale nie dotyczy statusu wyjścia.

2) && Można używać we wbudowanym poleceniu testowym Bash [[]]:

&& Może być również używany wewnątrz wbudowanego polecenia testowego w bash [[]] do łączenia wyrażeń w podobny sposób jak łączenie poleceń. Cała operacja testowa będzie prawdziwa tylko wtedy, gdy oba operandy (strony) && są prawdziwe, na przykład:

if [[ ( $a -gt 2 ) && ( $a -lt 5 ) ]]; then ... 

można by powiedzieć, że $ a jest liczbą całkowitą między 2 a 5 (nie licząc 2 i 5).

3) Ocena arytmetyczna:

Wreszcie, && można wykorzystać w ocenie arytmetycznej jako Logiczne AND. Jeśli obie (logiczne AND) poniższych liczb są niezerowe, zwraca 0, w przeciwnym razie zwracane jest 1:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0

@Kyle: && użyte poza logicznym wyrażeniem to „operator sterowania AND”, podobne zachowanie, ale technicznie inne
— drAlberT

Nie podążaj za swoim komentarzem, co masz na myśli poza logicznym wyrażeniem?
— Kyle Brandt,

Mam na myśli to, że w wyrażeniu operator && control przyjmuje znaczenie „logiczne i”, w przeciwnym razie jest to tylko „i”. Jest to „operator sterujący AND” używany w listach. operatory logiczne są używane w kontekście interpretacji arytmetycznej w wyrażeniach.
— drAlberT

w tym if [./configure]przykładzie powinieneś usunąć nawiasy. Prawidłowe jestif ./configure; then make...
— Juliano,

Juliano, Good catch, zaktualizuje się. AlberT, czy jest jakaś różnica oprócz warunków podanych przez strony podręcznika?
— Kyle Brandt,

3

Myślę, że lepiej ci będzie z wyjaśnieniem „prawdziwego” znaczenia, implikacje to inna sprawa :)

  • && jest operatorem sterującym „ORAZ”. Od bash mana :
    Operatorzy kontroli && i || oznaczają odpowiednio listy AND i OR.
    Lista AND ma postać  
        polecenie1 i& polecenie 2     
    polecenie2 jest wykonywane, jeśli i tylko wtedy, gdy polecenie1 zwraca status wyjścia równy zero.
    [..skaleczenie..]
    Status powrotu list AND i OR to status wyjścia ostatniego polecenia
    wykonane na liście.
    
    Sterującego operatora jest
    Token pełniący funkcję kontrolną. Jest to jeden z następujących symboli:
        || & &&; ;; () |
    
  • \jest „ znakiem ucieczki ” i jest jednym z trzech mechanizmów cytowania dostępnych w bash:
    CYTOWANIE
       Cytowanie służy do usuwania specjalnego znaczenia niektórych znaków lub słów z powłoki.
    [..skaleczenie..]
       Istnieją trzy mechanizmy cytowania: znak zmiany znaczenia, pojedyncze cudzysłowy i podwójne cudzysłowy.
       Niecytowany ukośnik odwrotny (\) to znak zmiany znaczenia. Zachowuje dosłowną wartość następnego następnego znaku, z wyjątkiem. Jeśli pojawi się \ para, a odwrotny ukośnik nie jest cytowany, \ jest traktowana jako kontynuacja linii (to znaczy jest usuwana ze strumienia wejściowego i skutecznie ignorowana).
    [..skaleczenie..]
    Ukośnik odwrotny zachowuje swoje specjalne znaczenie tylko wtedy, gdy następuje po nim jeden z następujących znaków: $, `,", \ lub.
    
    Oznacza to, że jeśli umieścisz znak zmiany znaczenia („\”) na samym końcu linii, w rzeczywistości unikasz nowego znaku linii, który bezpośrednio po nim (znak RETURN) ma efekt „kontynuuj linię” inni wyjaśnili już w swojej odpowiedzi
  • Znak myślnika „ - ”, który niektóre polecenia akceptują jako parametr, jest konwencją, a nie specjalnym znakiem lub operatorem powłoki. Jak już wspomniano, jest to rodzaj znacznika miejsca dla standardowych strumieni we / wy. W zależności od programu, do którego się odnosimy, może pozostać dla standardowego wejścia (standardowego wejścia) lub standardowego wyjścia (standardowego wyjścia).

Moje 2 centy


1
Prawdopodobnie będzie to przypadek tl; dr. Wklejanie gigantycznych kawałków strony - choć tak naprawdę pouczających - prawdopodobnie po prostu zastraszy OP.
— rodjek
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.