Wenn Sie mit der Ausgabe- und Eingabeumleitung vertraut sind, ist die Erklärung wirklich ganz einfach.
Command1 | Command2
macht dasselbe wie
Command1 > tempfile
Command2 < tempfile
aber ohne tempfile
. Die Ausgabe von Command1
ist direkt mit dem Eingang von Command2
verbunden und die Übertragung erfolgt im Arbeitsspeicher.
Das Folgende ist etwas vereinfacht, um neuen Benutzern zu helfen.
Nun, zuerst ist es notwendig, das Konzept der Standardeingabe und Standardausgabe zu verstehen.
In Linux und anderen UNIX-ähnlichen Betriebssystemen hat jeder Prozess eine Standardeingabe (stdin
) und eine Standardausgabe (stdout
). Die übliche Situation ist diese stdin
ist Ihre Tastatur und stdout
ist Ihr Bildschirm oder Terminalfenster.
Wenn Sie also ls
ausführen , wird es seine Ausgabe an stdout
werfen . Wenn Sie nichts weiter tun, wird es zu Ihrem Bildschirm oder Terminalfenster gehen und Sie können es anzeigen.
Jetzt interagieren einige Linux-Befehle mit dem Benutzer und verwenden stdin
Dazu gehört Ihr Texteditor. Es liest ab stdin
um Ihre Tastenanschläge 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, aber eine Menge Daten benötigen. Diese Befehle nehmen alles stdin
hat, tun Sie etwas damit und werfen Sie es dann auf stdout
Schauen wir uns einen anderen Befehl namens du
an - steht für Festplattennutzung. du /usr
, wird beispielsweise ausgedruckt (an stdout
wie jeder andere Linux-Befehl) eine Liste aller Dateien in diesem Verzeichnis und ihrer Größe:
# 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 auf Anhieb erkennen können, ist es nicht sortiert, und Sie möchten wahrscheinlich, dass es nach Größe sortiert wird.
sort
ist einer dieser "Filter"-Befehle, der eine Menge Zeug aus stdin
nimmt und sortieren.
Also, wenn wir das tun:
# du /usr | sort -nr
wir bekommen das, was etwas 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
verbindet eines Befehls an stdin
eines anderen. Normalerweise werden Sie es in solchen Situationen verwenden, in denen Sie die Ausgabe eines Befehls filtern, sortieren oder anderweitig manipulieren möchten. Sie können kaskadiert werden, wenn Sie die Ausgabe über mehrere Filterbefehle verarbeiten möchten.
Wenn Sie sort
eingeben von selbst wird es immer noch versuchen, ab stdin
zu lesen . Seit stdin
an Ihre Tastatur angeschlossen ist, wartet es darauf, dass Sie tippen und Dinge verarbeiten, bis Sie Strg-D drücken. Es wird Sie nicht auffordern, da es nicht wirklich für die interaktive Verwendung gedacht ist.
Ein Programm kann feststellen, ob stdin
interaktiv ist oder nicht, daher können sich einige Programme anders verhalten, wenn Sie sie allein oder am Ende einer Pipe ausgeben.
Auch das Pipen eines Programms, das nur interaktiv funktioniert, wie vi
, wird dazu führen, dass Sie eine schlechte Zeit haben.
Pipes unterscheiden sich von der Umleitung darin, dass die Daten von einem Befehl zum nächsten verschoben werden, ohne irgendwo gespeichert zu werden. Also, im obigen Beispiel du
Die Ausgabe von wird nirgendwo gespeichert. In den meisten Fällen möchten Sie dies bei Pipes nicht, 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
damit Sie Ihren Kuchen haben und ihn auch essen können, kopiert er, was er von stdin
erhält an beide stdout
und eine Datei Ihrer Wahl. Sie können dies wahrscheinlich auch über bash
tun mit irgendeiner obskuren Syntax mit kaufmännischen Und-Zeichen und Klammern, die ich nicht kenne.
Wirklich, wenn Sie wissen wollen, was Pipes tun und was der Unterschied zwischen> und | ist, dann gehen Sie in ein Verzeichnis mit vielen Dateien und
von einem Terminal ls
gegenüber ls | more
(oder von Windows aus mit DIR und DIR | MORE)
Wenn Sie> more verwendet haben, werden Sie sehen, dass eine Datei mit dem Namen „more“ erstellt wird, anstatt die Ausgabe von ls an den Befehl „more“ zu senden. Wenn also jemand>more tun würde, wäre es wahrscheinlich ein Fehler, man würde nicht>more tun, was man>file1 tun würde. Mehr ist ein bekannter Befehl.
Das
$ grep a
$ cat Datei1 | grep aabc
grep mit 2 Parametern hat die Form grep pattern file. grep mit einem Parameter ist grep pattern. Und Sie können ihm die Datei senden, indem Sie den Inhalt der Datei dorthin leiten oder indem Sie
Außerdem nehmen viele Befehle sowieso eine Datei als Eingabe, so dass grep a file1 funktioniert, genau wie cat file1 | grep a und grep a
Ich habe sogar vor 15 Jahren Pipes (|) und> unter DOS gemacht.
Um zusammenzufassen, wie | unterscheidet sich von