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
Alex
źródło
„/” 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ń ”.

goldPseudo
źródło
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)
rodjek
źródło
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 Brandt
źródło
@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

drAlberT
źródło
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