it-swarm.com.de

Was bedeutet das Linux-Pipe-Symbol "|" tun?

Hier ist ein Befehl, der Dateien in einem Ordner in umgekehrter Reihenfolge sortiert

ls | sort -r

Was bewirkt das Symbol | in diesem Befehl?

Was ich hier wirklich suche, ist eine gute (leicht verständliche) Erklärung der Pipes für Linux-Anfänger. Ich sehe hier im Superuser andere Fragen zu Pipes, aber nichts, was eine Antwort hervorruft, die in einfachen Worten erklärt, was sie tun und wie sie sich von der Umleitung unterscheiden (das Symbol > oder <).

23
ccalvert

Das Folgende wird ein wenig vereinfacht, um neuen Benutzern zu helfen.

Zunächst muss man das Konzept der Standardeingabe und der Standardausgabe verstehen.

In Linux und anderen UNIX-ähnlichen Betriebssystemen hat jeder Prozess eine Standardeingabe (stdin) und eine Standardausgabe (stdout). Normalerweise ist stdin Ihre Tastatur und stdout Ihr Bildschirm oder Terminalfenster.

Wenn Sie also ls ausführen, wird die Ausgabe in stdout geworfen. Wenn Sie nichts anderes tun, wird der Bildschirm oder das Terminalfenster angezeigt.

Nun interagieren einige Linux-Befehle mit dem Benutzer und verwenden dazu stdin, wobei Ihr Texteditor einer dieser Befehle ist. Es liest aus stdin, um Ihre Tastatureingaben zu akzeptieren, Dinge zu tun und dann Dinge in stdout zu schreiben.

Es gibt jedoch auch nicht interaktive oder "Filter" -Befehle, die NICHT interaktiv funktionieren, sondern eine Reihe von Daten benötigen. Diese Befehle nehmen alles, was stdin hat, machen etwas damit und werfen es dann auf stdout

Schauen wir uns einen anderen Befehl mit dem Namen du an - steht für die Datenträgerverwendung. du /usr gibt beispielsweise eine Liste aller Dateien in diesem Verzeichnis und ihrer Größe aus (in stdout wie bei jedem anderen Linux-Befehl):

# du /usr
2312    /usr/games
124     /usr/lib/tc
692     /usr/lib/rygel-1.0
400     /usr/lib/apt/methods
40      /usr/lib/apt/solvers
444     /usr/lib/apt
6772    /usr/lib/gnash

Wie Sie gleich erkennen können, ist es nicht sortiert, und Sie möchten es wahrscheinlich in der Reihenfolge der Größe sortiert haben.

sort ist einer dieser "Filter" -Befehle, die eine Reihe von Dingen aus stdin nehmen und sortieren.

Also, wenn wir das tun:

# du /usr | sort -nr

wir bekommen das, was ein bisschen besser ist:

4213348 /usr
2070308 /usr/lib
1747764 /usr/share
583668  /usr/lib/vmware
501700  /usr/share/locale
366476  /usr/lib/x86_64-linux-gnu
318660  /usr/lib/libreoffice
295388  /usr/lib/vmware/modules
290376  /usr/lib/vmware/modules/binary
279056  /usr/lib/libreoffice/program
216980  /usr/share/icons

Und Sie können jetzt sehen, dass die "Pipe" die stdout eines Befehls mit der stdin eines anderen verbindet. Normalerweise werden Sie es in Situationen wie diesen verwenden, in denen Sie die Ausgabe eines Befehls filtern, sortieren oder anderweitig bearbeiten möchten. Sie können kaskadiert werden, wenn Sie die Ausgabe über mehrere Filterbefehle verarbeiten möchten.

Wenn Sie sort selbst eingeben, wird weiterhin versucht, aus stdin zu lesen. Da stdin mit Ihrer Tastatur verbunden ist, wartet es darauf, dass Sie etwas eingeben und verarbeiten, bis Sie Strg-D drücken. Es fordert Sie nicht auf, da es nicht wirklich für die interaktive Verwendung gedacht ist.

Es ist möglich, dass ein Programm erkennt, ob stdin interaktiv ist oder nicht. Einige Programme verhalten sich daher möglicherweise anders, wenn Sie sie selbst oder am Ende einer Pipe ausgeben.

Wenn Sie ein Programm wie vi weiterleiten, das nur interaktiv funktioniert, haben Sie eine schlechte Zeit.

Pipes unterscheiden sich von der Umleitung darin, dass die Daten von einem Befehl zum nächsten gemischt werden, ohne dass sie irgendwo gespeichert werden. Im obigen Beispiel wird die Ausgabe von du also nirgendwo gespeichert. Die meiste Zeit möchten Sie dies nicht mit Pipes tun, da der Grund für die Verwendung von Pipes darin besteht, die Ausgabe eines Befehls auf irgendeine Weise zu verarbeiten - aber es gibt einen Befehl tee, mit dem Sie Ihren Kuchen haben und ihn auch essen können kopiert, was es von stdin empfängt, in stdout und in eine Datei Ihrer Wahl. Sie können dies wahrscheinlich auch in bash mit einer arkanen Syntax tun, die Et-Zeichen und Klammern enthält, die ich nicht kenne.

26
LawrenceC

Wenn Sie mit Ausgabe- und Eingabeumleitung vertraut sind, ist die Erklärung recht einfach.

Command1 | Command2

macht das selbe wie

Command1 > tempfile
Command2 < tempfile

aber ohne tempfile. Die Ausgabe von Command1 ist direkt mit der Eingabe von Command2 verbunden, und die Übertragung erfolgt im Speicher.

27
Daniel B

Wenn Sie wirklich wissen möchten, was Pipes tun und was zwischen> und | zu unterscheiden ist, wechseln Sie in ein Verzeichnis mit vielen Dateien und

von einem Terminal ls vs ls | more (oder unter Windows mit DIR und DIR | MORE)

Wenn Sie> more verwenden, wird eine Datei mit dem Namen 'more' erstellt, anstatt die Ausgabe von ls an den Befehl 'more' zu senden. Wenn also jemand mehr tun würde, wäre es wahrscheinlich ein Fehler, man würde nicht mehr tun, als Sie tun würden file1. More ist ein bekannter Befehl.

Das <like the> dient auch zum Verknüpfen eines Befehls und einer Datei anstelle eines Befehls mit einem Befehl. Aber während> die Ausgabe eines Befehls an eine Datei sendet, sendet <eine Datei als Eingabe für einen Befehl. Ich verwende selten <, da ich normalerweise cat file1 | verwende um die Ausgabe einer Datei an einen Befehl zu senden.

$ grep a <file1 abc

$ cat file1 | grep a abc

grep mit 2 Parametern hat die Form grep pattern file. grep mit einem Parameter ist grep pattern. Und Sie können die Datei senden, indem Sie den Inhalt der Datei an sie weiterleiten, oder indem Sie <verwenden. Wenn Sie <verwenden, schreiben Sie zuerst den Befehlsnamen und anschließend den Dateinamen. Bei Verwendung von | Um den Inhalt einer Datei weiterzuleiten, verwenden Sie cat file1 | Befehl.

Außerdem nehmen viele Befehle eine Datei als Eingabe, sodass grep eine Datei1 genau wie cat file1 | funktioniert grep a und grep a <file1.

Ich habe vor 15 Jahren Pipes (|) und> auf DOS gemacht.

Um zusammenzufassen, wie | unterscheidet sich von <und> - Die Pipe befindet sich zwischen zwei Befehlen. Die <und> befinden sich zwischen einem Befehl und einer Datei. Das> wird in eine Datei ausgegeben. Das <wird aus einer Datei eingegeben.

3
barlop

Das Pipe-Zeichen (|) verbindet die Ausgabe eines Programms mit der Eingabe eines anderen.

In diesem Beispiel gibt echo das Wort hello aus, und wc -c zählt die Zeichen seiner Eingabe:

echo hello | wc -c
3
bbaassssiiee

Um dies zu verstehen, probieren Sie es selbst aus:

sort -r

Jetzt hängst du mit einem Cursor und es tut nichts. Was passiert, wenn Sie Daten eingeben?

1
2
3
5
4

Immer noch nichts, oder? Drücken Sie nun Strg + D

5
4
3
2
1

Das heißt, es nimmt Eingaben (was Sie eingegeben haben), macht etwas damit (sortiert) und gibt es als Ausgabe zurück. Der Befehl ls nimmt keine Eingaben entgegen, sondern generiert nur Ausgaben. Das Pipe-Symbol übernimmt die Ausgabe von ls und leitet sie als Eingabe an den Befehl sort weiter.

> leitet die Ausgabe nicht an ein Programm weiter, sondern speichert sie als Datei. < verwendet eine Datei als Eingabe.

2
jornane