it-swarm.com.de

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

Soweit ich weiß, wird & nach dem Befehl verwendet, um ihn im Hintergrund auszuführen.

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

Aber wie wäre es mit &&? (Sehen Sie sich dieses Beispiel an: https://serverfault.com/questions/215179/centos-100-disk-full-how-to-remove-log-files-history-etc#answer-215188 )

324
Captain

Mit && können Sie etwas tun, das davon abhängt, ob der vorherige Befehl erfolgreich ausgeführt wurde. Aus diesem Grund wird er in der Regel als do_something && do_something_else_that_depended_on_something verkettet angezeigt.

368
girasquid

Darüber hinaus haben Sie auch ||, das ist das logische oder, und auch ;, das nur ein Trennzeichen ist, das sich nicht darum kümmert, was zuvor mit dem Befehl geschehen 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 Befehlslisten im Bash-Handbuch.

354
plundra

befehlszeile - Was ist der Zweck von &&?

In Shell, wenn Sie sehen

$ command one && command two

der Befehl, der auf && folgt, soll nur ausgeführt werden, wenn der erste Befehl erfolgreich ist. Dies ist typisch für Posix-Muscheln und nicht nur in Bash zu finden.

Es soll verhindern, dass der zweite Prozess ausgeführt wird, wenn der erste fehlschlägt.

Prozesse geben 0 für wahr zurück, andere positive Zahlen für falsch

Programme geben beim Beenden ein Signal aus. Sie sollten 0 zurückgeben, wenn sie erfolgreich beendet wurden, oder größer als Null, wenn sie dies nicht tun. Dies ermöglicht ein begrenztes Maß an Kommunikation zwischen Prozessen.

Der && wird in der Posix-Shell-Grammatik , die Teil einer AND_IF-Liste von Befehlen ist, als and_or bezeichnet Schließen Sie auch den || ein, der ein OR_IF mit ähnlicher Semantik ist.

Grammatiksymbole:

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

Grammatik:

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

Beide Operatoren haben die gleiche Priorität und werden von links nach rechts ausgewertet (sie sind linksassoziativ). Beispiel:

$ false && echo foo || echo bar
$ true || echo foo && echo bar

beide geben nur bar zurück.

  1. Im ersten Fall ist false ein Befehl, der mit dem Status 1 beendet wird.

    $ false
    $ echo $?
    1
    

    was bedeutet, dass echo foo nicht ausgeführt wird (d. h. Kurzschließen von echo foo). Dann wird der Befehl echo bar ausgeführt.

  2. Im zweiten Fall wird true mit dem Code 0 beendet.

    $ true
    $ echo $?
    0
    

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

93
Aaron Hall

Eine übliche Verwendung für '&&' ist das Kompilieren von Software mit Autotools. Zum Beispiel:

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

Wenn die Konfiguration erfolgreich ist, wird make ausgeführt, um das Programm zu kompilieren. Wenn dies erfolgreich ist, wird make als root ausgeführt, um das Programm zu installieren. Ich benutze dies, wenn ich mir größtenteils sicher bin, dass die Dinge funktionieren werden und es mir erlaubt, andere wichtige Dinge wie den Stackoverflow zu betrachten und den Fortschritt nicht zu überwachen.

Manchmal werde ich wirklich mitgerissen ...

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

Ich mache das, wenn ich zum Beispiel ein Linux von Grund auf neu mache.

31
Nigel Atkinson

&& fügt Befehle zusammen. Aufeinanderfolgende Befehle werden nur ausgeführt, wenn die vorhergehenden erfolgreich sind.

In ähnlicher Weise ermöglicht ||, dass der nachfolgende Befehl ausgeführt wird, wenn der vorherige fehlschlägt.

Siehe Bash-Shell-Programmierung .

18
Dean Burge

Siehe das Beispiel:

mkdir test && echo "Something" > test/file

Shell wird versuchen, das Verzeichnis test zu erstellen und dann nur wenn es erfolgreich war wird versuchen, eine Datei darin zu erstellen.

Sie können also eine Abfolge von Schritten unterbrechen, wenn einer von ihnen fehlschlägt.

8
alno

command_1 && command_2: Befehl_2 nur ausführen, wenn Befehl_1 erfolgreich ausgeführt wurde.

command_1 || command_2: Befehl_2 nur ausführen, wenn Befehl_1 nicht erfolgreich ausgeführt wurde.

Es fühlt sich ähnlich an, als würde eine 'wenn'-Bedingung in einer Mainstream-Programmiersprache wie in if (condition_1 && condition_2){...} condition_2 weggelassen, wenn condition_1 false ist, und in if (condition_1 || condition_2){...} condition_2 weggelassen, wenn condition_1 ist true. Sehen Sie, es ist der gleiche Trick, den Sie für die Codierung verwenden :)

7
Xiaonin Li

Es ist eine zweite Anweisung auszuführen, wenn die erste Anweisung erfolgreich endet. Wie eine if-Anweisung:

 if (1 == 1 && 2 == 2)
  echo "test;"

Seine ersten Versuche, wenn 1 == 1, wenn das wahr ist, prüft es, ob 2 == 2

6
Nick