488 Stimmen

Was ist der Zweck von "&&" in einem Shell-Befehl?

Soweit ich weiß, ist die Verwendung von & nach dem Befehl ist für die Ausführung im Hintergrund.

Beispiel für & Verwendung: tar -czf file.tar.gz dirname &

Aber wie wäre es mit && ? ( Beispiel )

544voto

plundra Punkte 17234

Darüber hinaus haben Sie auch || was das logische Oder ist, und auch ; was nur ein Trennzeichen ist, das sich nicht darum kümmert, was mit dem Befehl davor passiert ist.

$ false || echo "Oops, fail"
Oops, fail

$ true || echo "Will not be printed"
$  

$ true && echo "Things went well"
Things went well

$ false && echo "Will not be printed"
$

$ false ; echo "This will always run"
This will always run

Einige Details dazu finden Sie hier Listen von Befehlen im Bash-Handbuch.

503voto

girasquid Punkte 14635

&& ermöglicht es Ihnen, etwas zu tun, je nachdem, ob der vorherige Befehl erfolgreich abgeschlossen wurde - deshalb sehen Sie es oft als verkettete do_something && do_something_else_that_depended_on_something .

174voto

Kommandozeile - was ist der Zweck von && ?

In der Shell, wenn Sie sehen

$ command one && command two

ist die Absicht, den Befehl auszuführen, der auf den Befehl && nur, wenn der erste Befehl erfolgreich ist. Dies ist typisch für Posix-Shells und nicht nur in der Bash zu finden.

Es soll verhindern, dass der zweite Prozess läuft, wenn der erste fehlschlägt.

Sie haben vielleicht bemerkt, dass ich das Wort "Absicht" verwendet habe - und das hat seinen guten Grund. Nicht alle Programme verhalten sich gleich. Damit dies funktioniert, müssen Sie verstehen, was das Programm als "Fehler" ansieht und wie es damit umgeht, indem Sie die Dokumentation und, falls nötig, den Quellcode lesen.

Ihre Shell betrachtet einen Rückgabewert von 0 als wahr, andere positive Zahlen als falsch

Programme geben eine Signal beim Verlassen. Sie sollten 0 zurückgeben, wenn sie erfolgreich beendet werden, oder größer als Null, wenn sie nicht beendet werden. Dies ermöglicht eine begrenzte Menge an Kommunikation zwischen Prozessen.

Le site && wird bezeichnet als AND_IF im Posix-Shell-Grammatik die Teil eines and_or Liste von Befehlen, zu denen auch die || die ein OR_IF mit ähnlicher Semantik.

Grammatiksymbole, zitiert aus der Dokumentation:

%token  AND_IF    OR_IF    DSEMI
/*      '&&'      '||'     ';;'    */

Und die Grammatik (ebenfalls aus der Dokumentation zitiert), die zeigt, dass eine beliebige Anzahl von AND_IF s ( && ) und/oder OR_IF s ( || ) können aneinandergereiht werden (als and_or rekursiv definiert ist):

and_or           :                         pipeline
                 | and_or AND_IF linebreak pipeline
                 | and_or OR_IF  linebreak pipeline

Beide Operatoren haben den gleichen Vorrang und werden von links nach rechts ausgewertet (sie sind links-assoziativ). Wie die Dokumentation sagt:

Eine AND-OR Liste ist eine Folge von einer oder mehreren Pipelines, die durch das Zeichen Operatoren "&&" y "||" .

Eine Liste ist eine Folge von einer oder mehreren AND-OR-Listen, die durch das Zeichen Operatoren ';' y '&' und optional beendet durch ';' , '&' . oder .

Die Betreiber "&&" y "||" haben den gleichen Vorrang und sind mit linker Assoziativität ausgewertet werden. Zum Beispiel schreiben beide der folgenden Befehle schreiben ausschließlich bar auf die Standardausgabe:

$ false && echo foo || echo bar
$ true || echo foo && echo bar
  1. Im ersten Fall ist "false" ein Befehl, der mit dem Status 1

    $ false
    $ echo $?
    1

    was bedeutet echo foo läuft nicht (d.h. Kurzschluss echo foo ). Dann wird der Befehl echo bar ausgeführt wird.

  2. Im zweiten Fall verlässt true mit einem Code von 0

    $ true
    $ echo $?
    0

    und daher echo foo nicht ausgeführt wird, dann echo bar ausgeführt wird.

33voto

Nigel Atkinson Punkte 619

Eine recht häufige Verwendung für '&&' ist das Kompilieren von Software mit Autotools. Zum Beispiel:

./configure --prefix=/usr && make && sudo make install

Wenn configure erfolgreich ist, wird make ausgeführt, um zu kompilieren, und wenn das erfolgreich ist, wird make als Root ausgeführt, um das Programm zu installieren. Ich verwende dies, wenn ich mir weitgehend sicher bin, dass die Dinge funktionieren werden, und es erlaubt mir, andere wichtige Dinge zu tun, wie z.B. auf Stackoverflow zu schauen und den Fortschritt nicht zu "überwachen".

Manchmal lasse ich mich wirklich hinreißen...

tar xf package.tar.gz && ( cd package; ./configure && make && sudo make install ) && rm package -rf

Ich mache das zum Beispiel, wenn ich eine Linux-Box von Grund auf neu aufbaue.

24voto

Dean Burge Punkte 3410

&& reiht Befehle aneinander. Aufeinanderfolgende Befehle werden nur ausgeführt, wenn die vorhergehenden erfolgreich waren.

Ähnlich, || ermöglicht die Ausführung des nachfolgenden Befehls, wenn der vorhergehende fehlschlägt.

Véase Bash-Shell-Programmierung .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X