Einer der mächtigsten Shell-Operatoren in Linux ist die Pipe. In diesem Artikel werden wir sehen, wie normale und benannte Pipes funktionieren, wie man sie benutzt und wie sie sich voneinander unterscheiden.
Pipes sind eine der wertvollsten Befehlszeilenfunktionen von Linux und Unix-ähnlichen Betriebssystemen. Rohre werden in einer Vielzahl von Anwendungen verwendet. Wenn Sie sich einen Artikel über die Linux-Befehlszeile ansehen, werden Sie feststellen, dass Pipes häufig erscheinen.
Das vertikale Balkensymbol |
bezeichnet ein Rohr. Aufgrund der Pipe können Sie die Ausgabe eines Befehls nehmen und als Eingabe an einen anderen Befehl weiterleiten.
Als Ergebnis kann die Ausgabe eines Befehls als Eingabe für einen anderen verwendet werden, und die Ausgabe dieses Befehls kann als Eingabe für den nächsten Befehl verwendet werden, und so weiter.
Sie sind also nicht auf einen einzelnen Pipe-Befehl beschränkt. Sie können sie beliebig oft stapeln.
Mit anderen Worten, eine Pipe ist eine Form der Umleitung, die in Linux verwendet wird, um die Ausgabe eines Programms zur weiteren Verarbeitung an ein anderes Programm zu senden. Mit Pipes können Sie Operationen ausführen, die die Shell standardmäßig nicht unterstützt.
Die Syntax für den Pipe- oder unbenannten Pipe-Befehl lautet |
Zeichen zwischen zwei beliebigen Befehlen:
command1 | command2 | ... | commandN
Wie funktioniert eine Pipe unter Linux
Um zu sehen, wie Pipe funktioniert, sehen wir uns die folgenden Beispiele an.
Wir haben ein Verzeichnis voller vieler verschiedener Arten von Dateien. Wir wollen also wissen, wie viele Dateien eines bestimmten Typs sich in diesem Verzeichnis befinden.
So können wir mit ls
einfach eine Liste von Dateien erhalten Befehl:
ls -l
Wir werden grep verwenden, um die Dateitypen zu trennen, nach denen wir suchen. Beispielsweise suchen wir nach Dateien mit dem Wort txt
in ihrem Namen oder als Dateierweiterung.
Wir verwenden das spezielle Shell-Zeichen |
um ls
zu leiten ‘ Ausgabe an grep
.
ls | grep txt
Wie Sie dem obigen Bild entnehmen können, ist die Ausgabe der Datei ls
Befehl wurde nicht an das Terminalfenster gesendet.
Daher wird das Ergebnis nicht auf dem Bildschirm angezeigt. Stattdessen wird stattdessen auf die Eingabe von grep
umgeleitet Befehl. Die Ausgabe, die wir oben sehen, kommt von grep
, der letzte Befehl in dieser Kette.
Beginnen wir nun damit, unsere Kette zu erweitern. Wir können Dateien txt
zählen durch Hinzufügen des wc
Befehl an die Kette. Wir werden das -l
verwenden Option (Anzahl Zeilen) mit wc
.
ls | grep txt | wc -l
Im obigen Beispiel grep
ist nicht mehr der letzte Befehl in der Kette, daher sehen wir seine Ausgabe nicht. Stattdessen die Ausgabe von grep
wird in das wc
eingespeist Befehl.
Das Ergebnis, das wir im Terminalfenster sehen, kommt von wc
. Es meldet zwei Dateien, txt
im Verzeichnis.
Was ist eine benannte Pipe unter Linux?
Wie der Name schon sagt, handelt es sich um Pfeifen mit Namen. Einer der Hauptunterschiede zwischen regulären Pipes und benannten Pipes ist, dass benannte Pipes im Dateisystem vorhanden sind . Das heißt, sie werden wie Dateien angezeigt.
Die benannte Pipe in Linux ist eine Methode zum Übergeben von Informationen von einem Computerprozess zu einem anderen, wobei eine Pipe mit einem bestimmten Namen verwendet wird. Named Pipes sind auch als FIFO bekannt, was für First In, First Out steht .
Sie können eine benannte Pipe mit mkfifo
erstellen Befehl. Zum Beispiel:
mkfifo mypipe
Ob eine Datei eine benannte Pipe ist, erkennen Sie am p
Bit im Abschnitt Dateiberechtigungen.
ls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 12:58 mypipe
Die Named Pipes sind Dateien im Dateisystem selbst. Im Gegensatz zu einer Standard-Pipe wird auf eine Named Pipe wie auf jeden anderen Dateityp als Teil des Dateisystems zugegriffen.
Der Named-Pipe-Inhalt befindet sich im Arbeitsspeicher und wird nicht auf die Festplatte geschrieben. Es wird also erst passiert, wenn beide Rohrenden geöffnet wurden. Und Sie können mehrmals in eine Pipe schreiben, bevor sie am anderen Ende geöffnet und gelesen wird.
Durch die Verwendung von Named Pipes können Sie einen Prozess einrichten, bei dem ein Prozess in eine Pipe schreibt und ein anderer aus einer Pipe liest, ohne sich Gedanken darüber machen zu müssen, ihre Interaktion zu timen oder sorgfältig zu orchestrieren.
Um zu sehen, wie benannte Pipes funktionieren, sehen wir uns die folgenden Beispiele an. Lassen Sie uns zuerst unsere Named Pipe erstellen:
mkfifo mypipe
Lassen Sie uns nun Nachrichten mit dieser Pipe konsumieren.
tail -f mypipe
Öffnen Sie ein weiteres Terminalfenster, schreiben Sie eine Nachricht an diese Pipe:
echo "hi" >> mypipe
Im ersten Fenster sehen Sie nun das „hi“ ausgedruckt:
tail -f pipe1
hi
Da es sich um eine Pipe handelt und die Nachricht verbraucht wurde, sehen Sie, wenn wir die Dateigröße überprüfen, dass sie immer noch 0:
istls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 14:11 mypipe
Da eine benannte Pipe nur eine Linux-Datei ist, können wir sie mit dem Befehl rm entfernen. Um die in den vorherigen Beispielen erstellte Pipe zu entfernen, würden wir daher Folgendes ausführen:
rm mypipe
Wann sollten reguläre oder benannte Pipes verwendet werden
Die Verwendung einer regulären Pipe anstelle einer benannten Pipe in Linux hängt von den Eigenschaften ab, nach denen wir suchen. Einige können Persistenz, bidirektionale Kommunikation, ein Dateiname, das Erstellen eines Filters und das Einschränken von Zugriffsberechtigungen sein.
Wenn wir beispielsweise die Ausgabe eines Befehls mehrmals filtern möchten, scheint die Verwendung einer anonymen Pipe die geeignetste Option zu sein.
Wenn wir andererseits einen Dateinamen benötigen und keine Daten auf der Festplatte speichern möchten, suchen wir nach einer Named Pipe.
Abschließend, wenn Sie das nächste Mal mit Befehlen am Linux-Terminal arbeiten und Daten zwischen Befehlen verschieben, wird eine Pipe den Vorgang hoffentlich schnell und einfach machen.
Schlussfolgerung
Dieser Artikel hat Ihnen die Vielseitigkeit von Pipes gezeigt, wenn sie in Linux-Befehlen verwendet werden. Es ist dennoch relativ einfach, kann aber eine Vielzahl komplizierter Abfragen lösen.
Darüber hinaus ist dieses Befehlszeilentool einfach und funktioniert mit UNIX- und Linux-Plattformen.
Weitere Informationen zu pipe
Befehl unter Linux finden Sie auf der Handbuchseite.