Linux Bash Syntax: Bedeutung von &&, \ und -

14

Was bedeuten die Zeichen ' &&', ' \' und ' -' am Ende von Bash-Befehlen?

Insbesondere bin ich auf die folgende Kombination von Zeilen gestoßen, die öffentliche Schlüssel zu Ubuntus Aptitude-Paket-Manager hinzufügen sollen. Wofür werden diese Zeichen hier verwendet?

    gpg --keyserver keyserver.ubuntu.com --recv 26C2E075 && \
    gpg --export --armor 26C2E075 | sudo apt-key add - && \
    sudo apt-get update
Alex
quelle
"/" ist nicht dasselbe wie "\"
Thomas
Thomas: Sein Beitrag wurde
korrigiert
Die umgekehrten Schrägstriche werden hier nicht benötigt, da das && auch ausreicht, um eine Fortsetzung der Zeile zu implizieren. Die Verwendung des umgekehrten Schrägstrichs trägt jedoch zur besseren Lesbarkeit bei.
Bis auf weiteres angehalten.

Antworten:

37

"&&" wird zum Verketten von Befehlen verwendet, sodass der nächste Befehl nur ausgeführt wird, wenn der vorherige Befehl fehlerfrei beendet wurde (oder genauer gesagt, mit einem Rückkehrcode von 0).

"\" an sich am Ende einer Zeile ist ein Mittel zum Verketten von Zeilen miteinander. Also die folgenden zwei Zeilen:

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

werden genauso verarbeitet, als ob die Zeile als einzelne Zeile geschrieben worden wäre:

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

"-" ist ein Befehlszeilenargument ohne spezielle Bash-Funktion. Wie genau damit umgegangen wird, hängt vom ausgeführten Befehl ab (in diesem Fall apt-key ). Abhängig vom Kontext wird dies normalerweise verwendet, um entweder " Daten von stdin anstatt von einer Datei zu lesen " oder " den Rest der Zeile als Daten anstatt als Befehlszeilenargumente zu verarbeiten ".

goldPseudo
quelle
5
In diesem Fall ist '-' kein Parameter von sudo, sondern von 'apt-key', was bedeutet, dass 'apt-key' anstelle einer Schlüsseldatei die Daten verwendet, die durch die Pipe ('|') zu ihrem Standard kommen als Schlüssel. Die Option "gpg --export", ohne '--output a_file_name.key' zu haben, drückt einen neuen Schlüssel aus dem gpg stdout durch die Pipe ('|') zum stdin von 'apt-key' Easy: - )
Edomaur
2
Hoppla. Das bekomme ich, wenn ich im Halbschlaf Fragen beantworte. Fest.
goldPseudo
6
&& == 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
quelle
6

&& Ist die logische UND:
&& ist ein Weg , auszudrücken Logisches UND , der gesamte Ausdruck nur wahre Bedeutung ist , wenn beide Seiten davon wahr sind. In der Logik heißt es, dass die gesamte Aussage (P & Q) nur wahr ist, wenn sowohl P als auch Q wahr sind.

Infolgedessen behandeln Computer P & Q im Allgemeinen als Kurzschlussbewertung . Da die gesamte Aussage nur dann wahr ist, wenn sowohl P als auch Q wahr sind, wird die Aussage Q nicht ausgewertet , wenn P falsch ist . Grundsätzlich sind Computer faul (effizient) und stören sich nicht daran, Q zu bewerten, wenn sie es nicht tun. Dies gilt auch für logisches ODER, siehe den vorherigen Link.

Die drei Kontexte von && in Bash:

1) Verwenden der Kurzschlussauswertung mit dem Beendigungsstatus eines Befehls:
Jeder Befehl hat einen Beendigungsstatus. Wenn ein Befehl einen Fehler aufweist, hat er einen Beendigungsstatus ungleich Null. Wenn der Exit-Status also ungleich Null ist und Befehle mit && zu einer Anweisung verkettet werden, werden spätere Befehle nicht ausgewertet (ausgeführt), wenn der frühere keinen Exit-Status von 0 (Wahr) hatte. Dies liegt an der Kurzschlussauswertung. Also, wenn Sie haben:

P && Q

Q wird nicht ausgeführt, wenn P nicht wahr ist (wenn P mit einem Status von etwas anderem als 0 beendet wird, ist dies nicht wahr). Genauso wie:

./configure && make

make wird nicht ausgeführt, wenn configure einen Fehler hatte, der nicht wahr ist. Im Grunde ist es dann eine Schreibweise in der if then-Anweisung:

if ./configure ; then
   make
fi

Denken Sie daran, dass 0 in den meisten Kontexten falsch ist, aber nicht, wenn es um einen Exit-Status geht.

2) && Kann in Bashs eingebautem Testbefehl [[]] verwendet werden:

&& Kann auch innerhalb des integrierten Testbefehls in bash [[]] verwendet werden, um Ausdrücke auf ähnliche Weise wie Befehle zu kombinieren. Die gesamte Testoperation ist nur dann wahr, wenn beide Operanden (Seiten) von && wahr sind, zum Beispiel:

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

wäre eine Art zu sagen, wenn $ a eine ganze Zahl zwischen 2 und 5 ist (ohne 2 und 5).

3) Arithmetische Auswertung:

Schließlich kann && in der arithmetischen Auswertung als logisches UND verwendet werden. Wenn beide (logisches UND) der folgenden Zahlen ungleich Null sind, wird 0 zurückgegeben, andernfalls wird 1 zurückgegeben:

kbrandt@desktop:~/$ echo $((1 & 1))
1
kbrandt@desktop:~/$ echo $((0 && 1))
0
Kyle Brandt
quelle
@Kyle: && außerhalb eines logischen Ausdrucks wird der "AND-
Steueroperator
Folgen Sie nicht Ihrem Kommentar. Was meinen Sie außerhalb eines logischen Ausdrucks?
Kyle Brandt
Ich meine, dass in einem Ausdruck der && Steueroperator den Mittelwert von "logisch und" annimmt, ansonsten ist es nur ein "und". Es ist der "AND-Steueroperator", der in Listen verwendet wird. logische Operatoren werden im Kontext der arithmetischen Erweiterung innerhalb von Ausdrücken verwendet.
drAlberT
Im if [./configure]Beispiel sollten Sie die Klammern entfernen. Die richtige istif ./configure; then make...
Juliano
Juliano, Good catch, wird aktualisiert. AlberT, gibt es einen anderen Unterschied als die in den Manpages angegebenen Begriffe?
Kyle Brandt
3

Ich denke du wirst es besser mit einer Erklärung der "wirklichen" Bedeutung, Implikationen sind eine andere Sache :)

  • && ist der "UND" -Operator. Von bash man :
    Die Steueroperatoren && und || bezeichnen UND-Listen bzw. ODER-Listen.
    Eine AND-Liste hat die Form  
        befehl1 && befehl2     
    Befehl2 wird nur dann ausgeführt, wenn Befehl1 den Beendigungsstatus Null zurückgibt.
    [..Schnitt..]
    Der Rückgabestatus von AND- und OR-Listen ist der Exit-Status des letzten Befehls
    in der Liste ausgeführt.
    
    Ein Steueroperator ist
    Ein Token, das eine Steuerfunktion ausführt. Es ist eines der folgenden Symbole:
        || & &&; ;; () |
    
  • \ist das " Escape-Zeichen " und eines der drei in bash verfügbaren Anführungszeichen:
    ZITIEREN
       Das Zitieren wird verwendet, um die spezielle Bedeutung bestimmter Zeichen oder Wörter in der Shell zu entfernen.
    [..Schnitt..]
       Es gibt drei Anführungszeichen: das Escape-Zeichen, einfache Anführungszeichen und doppelte Anführungszeichen.
       Ein Backslash (\) ohne Anführungszeichen ist das Escape-Zeichen. Es behält den Literalwert des nächsten folgenden Zeichens bei, mit Ausnahme von. Wenn ein \ -Paar angezeigt wird und der umgekehrte Schrägstrich nicht in Anführungszeichen steht, wird das \ als Zeilenfortsetzung behandelt (dh, es wird aus dem Eingabestream entfernt und effektiv ignoriert).
    [..Schnitt..]
    Der Backslash behält seine spezielle Bedeutung nur bei, wenn auf ihn eines der folgenden Zeichen folgt: $, `,", \ oder.
    
    Dies bedeutet, dass Sie, wenn Sie ein Escape-Zeichen (das "\") ganz am Ende einer Zeile einfügen, tatsächlich das unmittelbar darauf folgende neue Zeilenzeichen (das RETURN-Zeichen) maskieren und somit den Effekt haben, dass "die Zeile fortsetzen". andere haben bereits in ihrer Antwort erklärt
  • Das Bindestrichzeichen " - ", das einige Befehle als Parameter akzeptieren, ist eine Konvention, kein Shell-Sonderzeichen oder -Operator. Wie bereits erwähnt, handelt es sich um eine Art Platzhalter für die Standard-E / A-Streams. Abhängig von dem Programm, auf das wir uns beziehen, kann es für stdin (die Standardeingabe) oder stdout (die Standardausgabe) bleiben.

Meine 2 Cent

drAlberT
quelle
1
Wahrscheinlich wird es sich um einen Fall handeln, in dem Dr. Das Einfügen riesiger Teile einer Manpage - so aufschlussreich es auch ist - wird den OP wahrscheinlich nur einschüchtern.
Rodjek