GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Was bedeutet das Linux-Pipe-Symbol | tun?

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 dient auch zum Verknüpfen eines Befehls und einer Datei und nicht eines Befehls mit einem Befehl. Aber während> die Ausgabe eines Befehls an eine Datei sendet, sendet

$ 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 - Die Pipe befindet sich zwischen 2 Befehlen. Die befinden sich zwischen einem Befehl und einer Datei. Das> wird in eine Datei ausgegeben. Das


Linux
  1. Meistern Sie den Linux-ls-Befehl

  2. Was bedeutet &am Ende eines Linux-Befehls?

  3. Was soll der export-Befehl unter Linux bewirken?

  4. Was macht das -e in einem Bash-Shebang?

  5. Was bedeutet das Suffix .d unter Linux?

ExplainShell – Finden Sie heraus, was jeder Teil eines Linux-Befehls tut

Seashells – Leiten Sie die Ausgabe Ihres Linux-Befehls in Echtzeit ins Web

Was bedeutet Cat-Befehl unter Linux?

Der Timer-Befehl in Linux

Was sind Pipes unter Linux? Wie funktioniert die Pipe-Umleitung?

Was ist der Kill-Befehl in Linux?