Was sind die Steuer- und Umleitungsoperatoren der Shell?

Was sind die Steuer- und Umleitungsoperatoren der Shell?

Ich sehe oft Online-Tutorials, die verschiedene Befehle mit unterschiedlichen Symbolen verbinden. Zum Beispiel:

command1 |  command2
command1 &  command2
command1 || command2    
command1 && command2

Andere scheinen Befehle mit Dateien zu verbinden:

command1  > file1
command1  >> file1

Was sind das für Dinger? Wie heißen sie? Was machen sie? Gibt es noch mehr davon?


Meta-Thread zu dieser Frage..

Antwort1

Diese werden Shell-Operatoren genannt und ja, es gibt noch mehr davon. Ich werde einen kurzen Überblick über die gebräuchlichsten der beiden Hauptklassen geben,KontrolloperatorenUndUmleitungsoperatoren, und wie sie in Bezug auf die Bash-Shell funktionieren.

A. Kontrolloperatoren

POSIX-Definition

In der Shell-Befehlssprache ein Token, das eine Steuerfunktion ausführt.
Es ist eines der folgenden Symbole:

&   &&   (   )   ;   ;;   <newline>   |   ||

Und |&in Bash.

A !istnichtein Kontrolloperator, sondern einReserviertes Wort. Es wird ein logisches NICHT [Negationsoperator] innerhalbArithmetische Ausdrückeund innerhalb von Testkonstrukten (wobei weiterhin ein Leerzeichen als Trennzeichen erforderlich ist).

A.1 Listenabschlusszeichen

  • ;: Führt einen Befehl nach Abschluss des anderen aus, unabhängig vom Ergebnis des ersten.

      command1 ; command2
    

Es wird zuerst command1im Vordergrund ausgeführt und nach Abschluss command2ausgeführt.

Ein Zeilenumbruch, der nicht in einem Stringliteral oder nach bestimmten Schlüsselwörtern steht, istnichtentspricht dem Semikolon-Operator. Eine Liste von ;durch Trennzeichen getrennten einfachen Befehlen ist immer noch einListe- so muss der Parser der Shell vor der Ausführung noch die einfachen Befehle einlesen, die auf einen ;abgegrenzten einfachen Befehl folgen, während ein Zeilenumbruch eine ganze Befehlsliste - oder eine Liste von Listen - abgrenzen kann. Der Unterschied ist subtil, aber kompliziert: Da die Shell keinen vorherigen Imperativ zum Einlesen von Daten nach einem Zeilenumbruch hat, markiert der Zeilenumbruch einen Punkt, an dem die Shell mit der Auswertung der einfachen Befehle beginnen kann, die sie bereits eingelesen hat, während dies bei einem ;Semikolon nicht der Fall ist.

  • &: Dadurch wird ein Befehl im Hintergrund ausgeführt, sodass Sie in derselben Shell weiterarbeiten können.

       command1 & command2
    

Dabei command1wird es im Hintergrund gestartet und command2beginnt sofort im Vordergrund zu laufen, ohne auf command1das Beenden zu warten.

Eine neue Zeile danach command1ist optional.

A.2 Logische Operatoren

  • &&: Wird zum Erstellen von UND-Listen verwendet. Ermöglicht Ihnen, einen Befehl nur dann auszuführen, wenn ein anderer erfolgreich beendet wurde.

       command1 && command2
    

Hier command2wird ausgeführt, nachdem command1fertig ist undnurwenn command1erfolgreich war (wenn der Exit-Code 0 war). Beide Befehle werden im Vordergrund ausgeführt.

Dieser Befehl kann auch geschrieben werden

    if command1
    then command2
    else false
    fi

oder einfach if command1; then command2; fiwenn der Rückgabestatus ignoriert wird.

  • ||: Wird zum Erstellen von ODER-Listen verwendet. Ermöglicht Ihnen, einen Befehl nur dann auszuführen, wenn ein anderer erfolglos beendet wurde.

       command1 || command2
    

Hier command2wird es nur ausgeführt, wenn command1es fehlgeschlagen ist (wenn ein Exit-Status ungleich 0 zurückgegeben wurde). Beide Befehle werden im Vordergrund ausgeführt.

Dieser Befehl kann auch geschrieben werden

    if command1
    then true
    else command2
    fi

oder auf kürzere Weise if ! command1; then command2; fi.

Beachten Sie, dass &&und ||linksassoziativ sind; sieheVorrang der logischen Shelloperatoren &&, ||für mehr Informationen.

  • !: Dies ist ein reserviertes Wort, das als „Nicht“-Operator fungiert (muss aber ein Trennzeichen haben) und verwendet wird, um den Rückgabestatus eines Befehls zu negieren – gibt 0 zurück, wenn der Befehl einen Status ungleich Null zurückgibt, gibt 1 zurück, wenn er den Status 0 zurückgibt. Auch ein logisches NICHT für das testDienstprogramm.

      ! command1
    
      [ ! a = a ]
    

Und ein echter NOT-Operator innerhalb arithmetischer Ausdrücke:

    $ echo $((!0)) $((!23))
    1 0

A.3 Rohrleitungsbetreiber

  • |: Der Pipe-Operator, er übergibt die Ausgabe eines Befehls als Eingabe an einen anderen. Ein Befehl, der aus dem Pipe-Operator erstellt wird, heißtPipeline.

       command1 | command2
    

    Jede von gedruckte Ausgabe command1wird als Eingabe an übergeben command2.

  • |&: Dies ist eine Abkürzung für 2>&1 |in Bash und Zsh. Es übergibt sowohl die Standardausgabe als auch den Standardfehler eines Befehls als Eingabe an einen anderen.

      command1 |& command2
    

A.4 Andere Listenzeichensetzung

;;wird ausschließlich verwendet, um das Ende einercase-Anweisung. Ksh, Bash und Zsh unterstützen auch ;&das Durchlaufen zum nächsten Fall und ;;&(nicht in ATT Ksh) das Fortfahren und Testen nachfolgender Fälle.

(und )sind es gewohnt,Gruppenbefehleund starten Sie sie in einer Subshell. {und }gruppieren Sie auch Befehle, starten Sie sie aber nicht in einer Subshell. Siehediese Antwortfür eine Erörterung der verschiedenen Arten von Klammern und geschweiften Klammern in der Shell-Syntax.

B. Umleitungsoperatoren

POSIX-Definition des Umleitungsoperators

In der Shell-Befehlssprache ein Token, das eine Umleitungsfunktion ausführt. Es ist eines der folgenden Symbole:

<     >     >|     <<     >>     <&     >&     <<-     <>

Mit diesen können Sie die Eingabe und Ausgabe Ihrer Befehle steuern. Sie können an beliebiger Stelle innerhalb eines einfachen Befehls erscheinen oder einem Befehl folgen. Umleitungen werden in der Reihenfolge verarbeitet, in der sie erscheinen, von links nach rechts.

  • <: Gibt eine Eingabe für einen Befehl.

      command < file.txt
    

Das Obige wird commandauf den Inhalt von ausgeführt file.txt.

  • <>: wie oben, aber die Datei ist geöffnet inLesen+SchreibenModus anstelle vonschreibgeschützt:

      command <> file.txt
    

Wenn die Datei nicht existiert, wird sie erstellt.

Dieser Operator wird selten verwendet, da Befehle im Allgemeinen nurlesenvon ihrem Standarddin, obwohles kann in einer Reihe spezifischer Situationen nützlich sein.

  • >: Leitet die Ausgabe eines Befehls in eine Datei um.

      command > out.txt
    

Das Obige speichert die Ausgabe commandals out.txt. Wenn die Datei existiert, wird ihr Inhalt überschrieben, und wenn sie nicht existiert, wird sie erstellt.

Dieser Operator wird auch oft verwendet, um auszuwählen, ob etwas gedruckt werden sollStandart FehleroderStandardausgabe:

    command >out.txt 2>error.txt
 

Im obigen Beispiel >wird die Standardausgabe umgeleitet und 2>die Standardfehlerausgabe umgeleitet. Die Ausgabe kann auch umgeleitet werden 1>, aber da dies die Standardeinstellung ist, 1wird normalerweise weggelassen und einfach als geschrieben >.

Um es auszuführen commandund file.txtdie Ausgabe out.txtsowie alle Fehlermeldungen darin zu speichern error.txt, führen Sie Folgendes aus:

    command < file.txt > out.txt 2> error.txt
  
  • >|: Macht dasselbe wie >, überschreibt aber das Ziel, auch wenn die Shell so konfiguriert wurde, dass sie das Überschreiben ablehnt (mit set -Coder set -o noclobber).

      command >| out.txt
    

Wenn out.txtes existiert, wird die Ausgabe commandseinen Inhalt ersetzen. Wenn es nicht existiert, wird es erstellt.

  • >>: Macht dasselbe wie >, außer dass die neuen Daten angehängt werden, wenn die Zieldatei existiert.

      command >> out.txt
    

Wenn out.txtes existiert, wird die Ausgabe commandangehängt, nach dem, was bereits darin enthalten ist. Wenn es nicht existiert, wird es erstellt.

  • >&: (gemäß POSIX-Spezifikation) wenn umgeben vonZiffern( 1>&2) oder -auf der rechten Seite ( 1>&-) leitet entweder nureinsDateideskriptor oder schließt ihn ( >&-).

Ein >&gefolgt von einer Dateideskriptornummer ist eine portable Möglichkeit, einen Dateideskriptor umzuleiten, und >&-eine portable Möglichkeit, einen Dateideskriptor zu schließen.

Wenn sich auf der rechten Seite dieser Weiterleitung eine Datei befindet, lesen Sie bitte den nächsten Eintrag.

  • >&, &>, >>&und &>>: (lesen Sie auch oben) Leiten sowohl die Standardfehlerausgabe als auch die Standardausgabe um und ersetzen bzw. hängen sie an.

      command &> out.txt
    

Sowohl der Standardfehler als auch die Standardausgabe von commandwerden in gespeichert out.txt. Dabei wird der Inhalt überschrieben oder es wird erstellt, falls es nicht vorhanden ist.

    command &>> out.txt
 

Wie oben, außer dass, falls out.txtvorhanden, die Ausgabe und der Fehler commanddaran angehängt werden.

Die &>Variante stammt ursprünglich aus bash, während die >&Variante aus csh (Jahrzehnte früher) stammt. Beide stehen im Konflikt mit anderen POSIX-Shell-Operatoren und sollten nicht in portablen shSkripten verwendet werden.

  • <<: Ein Here-Dokument. Es wird häufig zum Drucken mehrzeiliger Zeichenfolgen verwendet.

       command << WORD
           Text
       WORD
    

    Hier commandwird alles als Eingabe verwendet, bis es das nächste Vorkommen von findet WORD, Textim obigen Beispiel. Obwohl WORDes oft EoFoder Variationen davon ist, kann es jede beliebige alphanumerische Zeichenfolge (und nicht nur) sein. Wenn ein beliebiger Teil von WORDin Anführungszeichen gesetzt oder maskiert wird, wird der Text im Dokument hier wörtlich behandelt und es werden keine Erweiterungen durchgeführt (beispielsweise bei Variablen). Wenn es nicht in Anführungszeichen gesetzt ist, werden Variablen erweitert. Weitere Einzelheiten finden Sie imBash-Handbuch.

    command << WORD ... WORDWenn Sie die Ausgabe von direkt in einen oder mehrere andere Befehle umleiten möchten , müssen Sie das Pipe-Zeichen in dieselbe Zeile wie setzen << WORD. Sie können es nicht nach dem abschließenden WORD oder in die folgende Zeile setzen. Beispiel:

       command << WORD | command2 | command3...
           Text
       WORD
    
  • <<<: Here-Strings, ähnlich wie Here-Dokumente, aber für eine einzelne Zeile gedacht. Diese existieren nur im Unix-Port oder rc (wo es seinen Ursprung hat), zsh, einigen Implementierungen von ksh, yash und bash.

      command <<< WORD
    

Was auch immer als angegeben wird, WORDwird erweitert und sein Wert wird als Eingabe an übergeben command. Dies wird häufig verwendet, um den Inhalt von Variablen als Eingabe an einen Befehl zu übergeben. Beispiel:

     $ foo="bar"
     $ sed 's/a/A/' <<< "$foo"
     bAr
     # as a short-cut for the standard:
     $ printf '%s\n' "$foo" | sed 's/a/A/'
     bAr
     # or
     sed 's/a/A/' << EOF
     $foo
     EOF

Einige weitere Operatoren ( >&-, x>&y x<&y) können zum Schließen oder Duplizieren von Dateideskriptoren verwendet werden. Einzelheiten dazu finden Sie im entsprechenden Abschnitt des Handbuchs Ihrer Shell (Hierzum Beispiel für Bash).

Dies deckt nur die gebräuchlichsten Operatoren von Bourne-ähnlichen Shells ab. Einige Shells verfügen über einige eigene zusätzliche Umleitungsoperatoren.

Ksh, bash und zsh haben auch Konstrukte <(…), >(…)und =(…)(letzteres zshnur in). Dies sind keine Umleitungen, aberProzesssubstitution.

Antwort2

Warnung bezüglich '>'

Unix-Anfänger, die gerade etwas über I/O-Umleitung gelernt haben ( <und >), versuchen oft Dinge wie

BefehlEingabedatei>die_selbe_Datei

oder

Befehl… <Datei     >die_selbe_Datei

oder, fast gleichwertig,

KatzeDatei|Befehl… >die_selbe_Datei

( grep, sed, cut, sort, und spellsind Beispiele für Befehle, die man in derartigen Konstrukten gerne verwendet.) Benutzer sind überrascht, wenn sie feststellen, dass diese Szenarien dazu führen, dass die Datei leer wird.

Eine Nuance, die in der anderen Antwort nicht erwähnt zu werden scheint, findet sich im ersten Satz desUmleitungAbschnitt vonbash(1):

Bevor ein Befehl ausgeführt wird, können seine Ein- und Ausgabeumgeleitet unter Verwendung einer speziellen Notation, die von der Shell interpretiert wird.

Die ersten fünf Wörter sollten fett, kursiv, unterstrichen, vergrößert, blinkend, rot gefärbt und mit einem Ausrufezeichen im roten DreieckSymbol markiert sein, um hervorzuheben, dass die Shell die angeforderte(n) Umleitung(en) durchführt. bevor der Befehl ausgeführt wirdUnd denken Sie auch daran

Durch die Umleitung der Ausgabe wird die Datei … zum Schreiben geöffnet …. Wenn die Datei nicht existiert, wird sie erstellt; wenn sie existiert, wird sie auf die Größe Null gekürzt.

  1. In diesem Beispiel gilt Folgendes:

    sort roster > roster
    

    Die Shell öffnet die rosterDatei zum Schreiben und kürzt sie (d. h. verwirft ihren gesamten Inhalt), bevor das sortProgramm ausgeführt wird. Natürlich kann nichts getan werden, um die Daten wiederherzustellen.

  2. Man könnte naiv erwarten, dass

    tr "[:upper:]" "[:lower:]" < poem > poem
    

    könnte besser sein. Da die Shell Umleitungen von links nach rechts verarbeitet, öffnet sie sie poemzum Lesen (für trdie Standardeingabe) bevor sie sie zum Schreiben (für die Standardausgabe) öffnet. Aber es hilft nichts. Obwohl diese Abfolge von Operationen zwei Dateihandles ergibt, zeigen beide auf dieselbe Datei. Wenn die Shell die Datei zum Lesen öffnet, ist der Inhalt noch da, aber er wird trotzdem überschrieben, bevor das Programm ausgeführt wird. 

Was also können wir dagegen tun?

Zu den Lösungen gehören:

  • Überprüfen Sie, ob das von Ihnen ausgeführte Programm über eine eigene, interne Möglichkeit verfügt, anzugeben, wohin die Ausgabe gehen soll. Dies wird häufig durch ein -o(oder --output=)-Token angezeigt. Insbesondere

    sort -o roster roster
    

    entspricht in etwa

    sort roster > roster
    

    außer, im ersten Fall sortöffnet das Programm die Ausgabedatei. Und es ist intelligent genug, die Ausgabedatei erst zu öffnen, wennnaches hat alle Eingabedateien gelesen.

    In ähnlicher Weise haben zumindest einige Versionen von sedein -i(Bearbeitenichn Stelle) Option, die verwendet werden kann, um die Ausgabe wieder in die Eingabedatei zu schreiben (wiederumnachalle Eingaben wurden gelesen). Editoren wie ed/ ex, emacs, pico, und vi/ vim ermöglichen dem Benutzer, eine Textdatei zu bearbeiten und den bearbeiteten Text in der Originaldatei zu speichern. Beachten Sie, dass ed(zumindest) nicht interaktiv verwendet werden kann.

    • vihat eine verwandte Funktion. Wenn Sie eingeben , wird der Inhalt des Editierpuffers ausgegeben in:%!commandEntercommand, lesen Sie die Ausgabe und fügen Sie sie in den Puffer ein (wobei der ursprüngliche Inhalt ersetzt wird).
  • Einfach aber effektiv:

    BefehlEingabedatei>temporäre_Datei  && mvtemporäre_Datei Eingabedatei

    Dies hat den Nachteil, dass, wenninput_fileist ein Link, wird er (wahrscheinlich) durch eine separate Datei ersetzt. Außerdem gehört die neue Datei Ihnen, mit Standardschutz. Dies birgt insbesondere das Risiko, dass die Datei für alle lesbar sein wird, selbst wenn das Originalinput_filewar nicht.

    Variationen:

    • commandinput_file > temp_file && cp temp_file input_file && rm temp_file
      was (potenziell) immer noch dietemp_fileallgemein lesbar. Noch besser:
    • cp input_file temp_file && commandtemp_file > input_file && rm temp_file
      Diese bewahren den Linkstatus, den Besitzer und den Modus (Schutz) der Datei, möglicherweise auf Kosten der doppelten E/A. (Möglicherweise müssen Sie eine Option wie -aoder -pon verwenden cp , um die Attribute beizubehalten.)
    • commandinput_file > temp_file &&
      cp --attributes-only --preserve=all input_file temp_file &&
      mv temp_file input_file
      (nur zur besseren Lesbarkeit in einzelne Zeilen unterteilt) Dadurch bleibt der Modus der Datei (und der Eigentümer, wenn Sie Root sind) erhalten, die Datei wird jedoch Ihr Eigentümer (wenn Sie nicht Root sind) und es wird eine neue, separate Datei daraus.
  • Dieser Blog („In-place“-Bearbeitung von Dateien) schlägt vor und erklärt

    { rmEingabedatei  &&  Befehl… >Eingabedatei; } <Eingabedatei

    Dies erfordert, dass diecommandStandardeingaben verarbeiten können (das können aber fast alle Filter). Das Blog selbst bezeichnet dies als riskantes Kludge und rät von dessen Verwendung ab. Außerdem wird dadurch eine neue, separate Datei (mit nichts verknüpft) erstellt, die Ihnen gehört und die Standardberechtigungen hat.

  • Das Paket moreutils hat einen Befehl namens sponge:

    BefehlEingabedatei| Schwammdie_selbe_Datei

    Sehendiese Antwortfür mehr Informationen.

Folgendes kam für mich völlig überraschend: Syntaxfehler sagt:

[Die meisten dieser Lösungen] werden auf einem schreibgeschützten Dateisystem scheitern, wobei „schreibgeschützt“ bedeutet, dass Ihr$HOME Willebeschreibbar sein, /tmpaberschreibgeschützt(standardmäßig). Wenn Sie beispielsweise Ubuntu haben und in die Wiederherstellungskonsole gebootet haben, ist dies normalerweise der Fall. Außerdem <<<funktioniert der here-document-Operator dort auch nicht, da /tmperlesen Schreiben weil dort ebenfalls eine temporäre Datei geschrieben wird.
(vgl.diese Frageenthält eine strace'd-Ausgabe)

In diesem Fall könnte Folgendes funktionieren:

  • Nur für fortgeschrittene Benutzer: Wenn Ihr Befehl garantiert die gleiche Menge an Ausgabedaten erzeugt wie Eingabedaten (z. B. sortodertr ohnedie Option -doder -s), können Sie versuchen
    BefehlEingabedatei| dd von=die_selbe_Dateiconv=nicht ausgeführt
    Sehendiese Antwort Unddiese Antwortfür weitere Informationen, einschließlich einer Erklärung des oben genannten und Alternativen, die funktionieren, wenn Ihr Befehl garantiert die gleiche Menge an Ausgabedaten erzeugt wie Eingabedatenoder weniger(z. B. grep, oder cut). Diese Antworten haben den Vorteil, dass sie keinen (oder nur sehr wenig) freien Speicherplatz benötigen. Die Antworten oben im Formular erfordern eindeutig, dass genügend freier Speicherplatz vorhanden ist, damit das System die gesamte Eingabedatei (alte Datei) und die Ausgabedatei (neue Datei) gleichzeitig speichern kann. Dies gilt nicht unbedingt auch für die meisten anderen Lösungen (z. B. und ). Ausnahme: benötigt wahrscheinlich viel freien Speicherplatz, da die gesamte Eingabe gelesen werden muss, bevor die Ausgabe geschrieben werden kann, und die meisten, wenn nicht alle dieser Daten wahrscheinlich in einer temporären Datei gepuffert werden.commandinput_file > temp_file && …sed -ispongesort … | dd …sort
  • Nur für fortgeschrittene Benutzer:
    BefehlEingabedatei1<>die_selbe_Datei
    kann der obigen Antwort entsprechen dd. Die Syntax öffnet die benannte Datei im Dateideskriptorn<> filen für Eingabe und Ausgabe, ohne es abzuschneiden – eine Art Kombination aus und . Hinweis: Einige Programme (z. B. und ) können in diesem Szenario die Ausführung verweigern, da sie erkennen, dass die Eingabe und die Ausgabe dieselbe Datei sind. Siehen<n>catgrepdiese Antwort für eine Diskussion des oben genannten und ein Skript, das diese Antwort funktioniert, wenn Ihr Befehl garantiert die gleiche Menge an Ausgabedaten erzeugt, wie Eingabedaten vorhanden sindoder weniger.
    Achtung: Ich habe Peters Skript nicht getestet und kann daher nicht dafür bürgen.

Also, was war die Frage?

Dies ist ein beliebtes Thema bei U&L; es wird in den folgenden Fragen behandelt:

… und dabei sind Super User oder Ask Ubuntu noch nicht mitgezählt. Ich habe viele der Informationen aus den Antworten auf die obigen Fragen hier in diese Antwort eingearbeitet, aber nicht alle. (Weitere Informationen finden Sie in den oben aufgeführten Fragen und deren Antworten.)

PS Ich habeNEINZugehörigkeit zum Blog, den ich oben zitiert habe.

Antwort3

Weitere Beobachtungen zu ;, &, (und)

  • Beachten Sie, dass einige der Befehle in Terdons Antwort null sein können. Sie können beispielsweise sagen

    command1 ;
    

    (ohne command2). Dies entspricht

    command1
    

    (d. h. es läuft einfach command1im Vordergrund und wartet auf die Fertigstellung. Vergleichsweise

    command1 &
    

    (ohne ) wird im Hintergrund command2gestartet und gibt dann sofort eine weitere Shell-Eingabeaufforderung aus.command1

  • Im Gegensatz dazu ergeben , command1 &&, command1 ||und command1 |keinen Sinn. Wenn Sie eines dieser Zeichen eingeben, geht die Shell (wahrscheinlich) davon aus, dass der Befehl in einer anderen Zeile fortgesetzt wird. Sie zeigt die sekundäre (Fortsetzungs-) Shell-Eingabeaufforderung an, die normalerweise auf eingestellt ist >, und liest weiter. In einem Shell-Skript liest sie einfach die nächste Zeile und hängt sie an das an, was sie bereits gelesen hat. (Vorsicht: Dies ist möglicherweise nicht das, was Sie wollen.)

    Hinweis: Einige Versionen einiger Shells behandeln solche unvollständigen Befehle möglicherweise als Fehler. In solchen Fällen (oder in der Tat inbeliebigWenn Sie einen langen Befehl haben, können Sie \am Ende einer Zeile einen Backslash () einfügen, um der Shell mitzuteilen, dass sie den Befehl in einer anderen Zeile weiterlesen soll:

    command1  &&  \
    command2
    

    oder

    find starting-directory -mindepth 3 -maxdepth 5 -iname "*.some_extension" -type f \
                            -newer some_existing_file -user fred -readable -print
    
  • Wie terdon sagt, können (und )verwendet werden, um Befehle zu gruppieren. Die Aussage, dass sie für diese Diskussion „nicht wirklich relevant“ sind, ist umstritten. Einige der Befehle in Terdons Antwort könnten Befehle seinGruppen. Zum Beispiel,

    ( command1 ; command2 )  &&  ( command3; command4 )
    

    macht dies:

    • Führen Sie es aus command1und warten Sie, bis es beendet ist.
    • command2Führen Sie den Befehl dann aus und warten Sie, bis er beendet ist , unabhängig vom Ergebnis des ersten Befehls .
    • Wenn command2dies gelingt,

      • Führen Sie es aus command3und warten Sie, bis es beendet ist.
      • Führen Sie den Befehl dann aus und warten Sie, bis er beendet ist, unabhängig vom Ergebnis command4.

      Wenn command2dies fehlschlägt, beenden Sie die Verarbeitung der Befehlszeile.

  • Außerhalb der Klammern |bindet sehr eng, so

    command1 | command2 || command3
    

    ist äquivalent zu

    ( command1 | command2 )  ||  command3
    

    und &&und ||binden fester als ;, so

    command1 && command2 ; command3
    

    ist äquivalent zu

    ( command1 && command2 ) ;  command3
    

    d. h. command3wird unabhängig vom Beendigungsstatus von command1und/oder ausgeführt command2.

verwandte Informationen