Was versteht man unter STDOUT und STDIN?

10

Ich lese ein Buch, es heißt:

Jedem Prozess stehen mindestens drei Kommunikationskanäle zur Verfügung: „Standardeingang“ (STDIN), „Standardeingang“ (STDOUT) und „Standardfehler“ (STDERR).

Die meisten Befehle akzeptieren ihre Eingabe von STDIN und schreiben ihre Ausgabe in STDOUT. Sie schreiben Fehlermeldungen an STDERR. Mit dieser Konvention können Sie Befehle wie Bausteine ​​aneinanderreihen, um zusammengesetzte Pipelines zu erstellen.

Die Schale interpretiert die Symbole <, >und >>als Befehle einen Befehl der Eingabe oder Ausgabe zu oder von einer Datei umzuleiten.

Verwenden Sie das | Symbol, das allgemein als Pipe bezeichnet wird, um die STDOUT eines Befehls mit der STDIN eines anderen Befehls zu verbinden .

ps -ef | grep httpd

Im Grunde bedeutet dies, dass die Standardeingabe ein Befehl ist, mit dem der Benutzer in eine Datei schreiben kann, während die Standardausgabe ein Befehl ist, bei dem die Bash-Shell in die Shell geschrieben wird, und der Standardfehler genau wie die Ausgabe ist, aber nur Wird aufgerufen, wenn ein Fehler im Dateisystem vorliegt. Dann kommen wir zum Teil der Verbindung von STDOUT und STDIN und ich bin verloren.

John Merlino
quelle

Antworten:

25

Standardeingabe und Standardausgabe sind keine Befehle.

Stellen Sie sich Befehle als Maschinen in einer Fabrik mit Fließband vor. Die meisten Maschinen verfügen über ein Förderband zum Einspeisen von Daten und ein Förderband zum Einspeisen von Daten. Sie sind die Standardeingabe bzw. die Standardeingabe. Der Standardfehler ist eine Öffnung an der Seite der Maschine, durch die Ausschuss ausgeworfen werden kann.

+-------+     +------------------+       +------------------+     +------+
| input |     |    machine A     |       |    machine B     |     |output|
| reser ­­­|=====|<stdin     stdout>|=======|<stdin     stdout>|=====|bucket|
| voir |    |      stderr      |      |      stderr      |    |      |
+-------+     +------------------+       +------------------+     +------+
                      ||                          ||

Das obige Diagramm zeigt ein Förderband, das zwei Maschinen durchläuft. Die Daten stammen aus dem Eingangsbehälter auf der linken Seite, werden der Maschine A zugeführt, dann wird die Ausgabe weiter zur Maschine B (für die sie eingegeben wird) geleitet, und die Ausgabe der Maschine B wird im Ausgabebehälter auf der rechten Seite abgelegt.

In Unix-Begriffen wird dies als Pipeline bezeichnet . Die Metapher ist die der Installation: Ein Rohr verbindet Maschine A mit Maschine B. Die Shell-Syntax für die obige Pipeline lautet

<input-file.txt commandA | commandB >output-file.txt

Das < Umleitungssymbol weist die Shell an, commandAdie Standardeingabe input-file.txtvor dem Start mit der Datei zu verbinden commandA. (Sie können die Umleitung vor oder nach dem Befehlsnamen einfügen.) Das >Umleitungssymbol weist die Shell an, commandBdie Standardausgabe mit zu verbinden output-file.txt. Das Pipe- |Symbol (" ") in der Mitte weist die Shell an, commandAdie Standardausgabe mit commandBder Standardeingabe zu verbinden , bevor sie gestartet wird.

Befehle können mehr als eine Eingabe und mehr als eine Ausgabe haben, aber das ist Material für einen anderen Tag .

Gilles 'SO - hör auf böse zu sein'
quelle
3
Das Bild hat sehr geholfen
JohnMerlino
Schöne Analogie. Ich habe das Konzept der Stream-Pipeline seit vielen Jahren verstanden, aber irgendwie hat noch niemand die Analogie zwischen Fabrik und Förderer verwendet, was es wirklich leicht (und prägnant) verständlich macht. Vielen Dank!
Owen Blacker
1
Tolle Analogie. Ich werde mir diesen ausleihen, wenn es dir nichts ausmacht.
Tivie
Gilles, ich habe unten eine Frage zu Ihrer Formulierung gestellt: unix.stackexchange.com/q/96724/29146 . Könntest du das klarstellen?
Strugee
@ Gilles - Können Sie ein Beispiel hinzufügen, das die Option zum Definieren der Umleitung vor oder nach dem Befehl veranschaulicht? Kann die Pipeline beispielsweise als input-file.txt> commandA oder input-file.txt <commandA gelesen werden?
Motiviert
6

standard input is a command that allows user to write to a file

Kein Befehl, sondern ein Stream. Standard In und Out sind wie Briefkästen. Wenn ein Programm gestartet wird, erhält es eine Box zum Empfangen und eine Box zum Senden von E-Mails. Normalerweise erfolgt die Eingabe über die Tastatur und wird in den Posteingang gestellt. Die in den Postausgang gesendete E-Mail landet auf Ihrem Terminalbildschirm.

standard output is a command that has the bash shell write output to the shell

Das Programm weiß eigentlich nicht, wo Standard-Out-Punkte sind. Wenn Sie A nach B leiten (wie in $ A | B), wenn A E-Mails in den Postausgang legt, landet sie im Posteingang von B. B verarbeitet die Eingabe und legt seine eigene Mail im Postausgang ab, was Sie auf dem Terminal sehen.

Wie bereits erwähnt, sind Streams Standard-In / Out-Streams. Das Postfach oder der Dateideskriptor ist ein Ende des Streams. Ein Rohr bedeutet, den Standard von A mit dem Standard von B zu verbinden.

Splitter des Chaos
quelle