Was genau passiert, wenn auf eine Pipe eine Befehlsgruppierung folgt?

Was genau passiert, wenn auf eine Pipe eine Befehlsgruppierung folgt?

Ich habe einen Ausdruck wie diesen gesehen command1 | {command2;command3;command4}und überlegt, was dieser eigentlich bedeutet. Ich kenne das Pipe-Symbol und weiß, dass es {...}die Ausführung der Befehle innerhalb der geschweiften Klammern in der Haupt-Shell erzwingt, aber ich bin verwirrt, was sie in Kombination bedeuten.

Antwort1

Es spielt keine Rolle, wie komplex die Teile einer Pipeline sind. Sie können sie bei Bedarf oft einfach als separate Skripte visualisieren (insbesondere in Shells wie bashdieser, die jeden Teil einer Pipeline ohnehin in einer Untershell ausführen).

Das Drehbuch

command2
command3
command4

... welchegrobist das, was { command2; command3; command4; }übersetzt wird in (ohne zu berücksichtigen, dass { ...; }nominell bedeutet, dass die Befehle nicht in einer Subshell ausgeführt werden), erhält Eingabe aus der Ausführung von

command1

Je nachdem, was diese drei Befehle im ersten Skript tun, verbrauchen wahrscheinlich einer oder mehrere von ihnen die Eingabe von command1, und wenn einer oder mehrere von ihnen eine Ausgabe erzeugen, geht diese an den nächsten Teil der Pipeline oder an das Terminal oder wohin auch immer die Ausgabe der Pipeline umgeleitet wird.

Antwort2

{...}erzwingt die Ausführung der Befehle innerhalb der geschweiften Klammern in der Haupt-Shell

Dies ist keine gute Beschreibung dessen, was Klammern im Allgemeinen tun. Klammern gruppieren Befehle auf eine Weise, die keine Untershell erstellt. Mit anderen Worten: Klammern erstellen an sich keine Untershell: Code in Klammern wird in derselben Shell ausgeführt, als ob es keine Klammern gäbe, im Gegensatz zu Code in Klammern, der immer in einer Untershell ausgeführt wird (sodass seine Umleitungen, Variablen usw. die übergeordnete Shell oder eine andere Shell nicht beeinflussen).

Der Sinn von Klammern besteht darin, das Schreiben komplexer Befehle zu ermöglichen, bei denen die Syntax einen einzelnen Befehl erwartet. Beispielsweise command1 | { command2; command3; command4; }ist in (beachten Sie, dass die Leerzeichen und das abschließende Semikolon erforderlich sind) die rechte Seite der Pipe { command2; command3; command4; }. Der Befehl { command2; command3; command4; }führt aus command2, dann command3, dann command4. Alle diese Befehle nehmen Eingaben aus der Pipe entgegen. (Da die Befehle nacheinander ausgeführt werden, command3erhält , was auch immer nach den Ausführungen übrig bleibt command2, und so weiter.)

Antwort3

Betrachten Sie die Klammern als eine unbenannte Funktion. zB

command234 () { command2; command3; command4; }

command1 | command234 

führt zum selben Ergebnis. Wenn die Dinge zu kompliziert werden, benenne ich die Gruppierung lieber. Und sei es nur zum Testen.

Antwort4

Die Standardausgabe von command1wird für den ersten Befehl im Befehlsblock verwendet, der mit dem Lesen von der Standardeingabe beginnt. In den meisten Fällen ist dies command2.

verwandte Informationen