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 <
).
linux
command-line
bash
pipe
ccalvert
quelle
quelle
|
ist, dass es keinen Namen verwendet. Die Ausgabe des Befehls l-hand wird direkt an die Eingabe für den Befehl auf der rechten Seite der Pipe übergeben.ls -1r
(Beachten Sie das Argument Nr. 1) sollte zu einem ähnlichen Ergebnis führen wiels | sort -r
.cat /somefile | grep cool
. Dies nimmt die Ausgabe von somefile und stellt sie für grep zur Verfügung, und grep druckt dann alle Zeilen, in denen das Wort cool enthalten ist.Antworten:
Das Folgende wird ein wenig vereinfacht, um neuen Benutzern zu helfen.
Zunächst müssen Sie das Konzept der Standardeingabe und der Standardausgabe verstehen.
In Linux und anderen UNIX-ähnlichen Betriebssystemen verfügt jeder Prozess über eine Standardeingabe (
stdin
) und eine Standardausgabe (stdout
). Die übliche Situation ist, dass diesstdin
Ihre Tastatur undstdout
Ihr Bildschirm oder Terminalfenster ist.Wenn du also rennst
ls
, wirft es die Ausgabe aufstdout
. Wenn Sie nichts anderes tun, wird der Bildschirm oder das Terminalfenster angezeigt.Nun interagieren einige Linux-Befehle mit dem Benutzer und verwenden
stdin
dies, wobei Ihr Texteditor einer dieser Befehle ist . Es liest ausstdin
, um Ihre Tastatureingaben zu akzeptieren, Dinge zu tun und dann Dinge zu schreibenstdout
.Es gibt jedoch auch nicht interaktive oder "Filter" -Befehle, die NICHT interaktiv funktionieren, sondern eine Reihe von Daten benötigen. Diese Befehle nehmen alles
stdin
, was es gibt, tun etwas und werfen es dann zustdout
Schauen wir uns einen anderen Befehl mit dem Namen an
du
- steht für die Festplattennutzung.du /usr
Zum Beispiel wirdstdout
eine Liste aller Dateien in diesem Verzeichnis und ihrer Größe gedruckt (so wie bei jedem anderen Linux-Befehl):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 Menge Dinge entnehmenstdin
und sortieren.Also, wenn wir das tun:
# du /usr | sort -nr
wir bekommen das, was ein bisschen besser ist:
Und Sie können jetzt sehen, dass die "Pipe" den
stdout
von einem Befehl mit demstdin
von einem 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 selbst tippen
sort
, wird weiterhin versucht, auszulesenstdin
. Dastdin
es mit Ihrer Tastatur verbunden ist, wartet es darauf, dass Sie etwas eingeben und verarbeiten, bis Sie Strg-D drücken. Es wird Sie nicht dazu auffordern, da es nicht wirklich für die interaktive Verwendung gedacht ist.Es ist möglich, dass ein Programm erkennt, ob
stdin
es interaktiv ist oder nicht. Einige Programme verhalten sich daher möglicherweise anders, wenn Sie sie selbst oder am Ende einer Pipe ausgeben.Außerdem führt das Weiterleiten eines Programms, das nur interaktiv funktioniert
vi
, zu einer schlechten 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
du
die Ausgabe 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. Es gibt jedoch einen Befehltee
, mit dem Sie Ihren Kuchen haben und ihn auch essen können Kopieren Sie die empfangenen Datenstdin
instdout
eine Datei Ihrer Wahl. Sie können dies wahrscheinlich auchbash
mit einer arkanen Syntax tun, die Et-Zeichen und Klammern enthält, die ich nicht kenne.quelle
stdin
undstdout
ist unter Windows anders als unter Linux, obwohl es aus Sicht von Windowscmd.exe
oder Powershell wahrscheinlich nicht sehr viel ist .GetStdHandle()
. Es ist auch trivial, die Standard-Streams eines [untergeordneten] Prozesses mit .NET umzuleiten, von denen ich glaube, dass sie Win32-Funktionen zugeordnet sind (da bin ich mir nicht 100% sicher - ich bin kein Win32-Entwickler).STARTUPINFO
Struktur für festlegenCreateProcess()
.Wenn Sie mit Ausgabe- und Eingabeumleitung vertraut sind, ist die Erklärung recht einfach.
macht das selbe wie
aber ohne
tempfile
. Der Ausgang vonCommand1
ist direkt mit dem Eingang von verbundenCommand2
und die Übertragung erfolgt im Speicher.quelle
CreateFile
oderWriteFile
ruft an, um Ihren Anspruch zu stützen. / edit: Das ist natürlich für den Windows-Teil.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
vsls | more
(oder unter Windows mit DIR und DIR | MORE)Wenn Sie> more verwendet haben, 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. Sie können die Datei auch senden, indem Sie den Inhalt der Datei an diese weiterleiten oder <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 2 Befehlen. Die <und> befinden sich zwischen einem Befehl und einer Datei. Das> wird in eine Datei ausgegeben. Das <wird aus einer Datei eingegeben.
quelle
Das Pipe-Zeichen (
|
) verbindet die Ausgabe eines Programms mit der Eingabe eines anderen.In diesem Beispiel wird
echo
das Wort gedruckthello
undwc -c
die Anzahl der Zeichen für die Eingabe bestimmt:quelle
Um dies zu verstehen, probieren Sie es selbst aus:
Jetzt hängst du mit einem Cursor und es tut nichts. Was passiert, wenn Sie Daten eingeben?
Immer noch nichts, richtig? Drücken Sie nun Strg + D
Das heißt, es nimmt Eingaben (was Sie eingegeben haben), macht etwas damit (sortiert) und gibt es als Ausgabe zurück. Der
ls
Befehl nimmt keine Eingaben entgegen, sondern generiert nur Ausgaben. Das Pipe-Symbol nimmt die Ausgabe vonls
und gibt sie als Eingabe an densort
Befehl weiter.>
speist die Ausgabe nicht in ein Programm ein, sondern speichert sie als Datei.<
Verwendet eine Datei als Eingabe.quelle