Was Sind stdin, stdout und stderr auf Linux?

0
1877
Fatmawati Achmad Zaenuri/Shutterstock.com

stdin, stdout und stderr sind drei Daten-streams erzeugt, wenn Sie starten Sie ein Linux-Befehl. Mit Ihnen können Sie sagen, wenn Ihre Skripte sind verrohrt bzw. umgeleitet. Wir zeigen Ihnen, wie.

Ströme Verbinden Sie Zwei Punkte

Sobald Sie anfangen zu lernen über Linux und Unix-artigen Betriebssystemen, Sie stoßen werden die Begriffe stdin, stdout und stederr. Dies sind die drei standard-streams, die hergestellt wird, wenn ein Linux-Befehl ausgeführt wird. In computing, ein Strom ist etwas, dass Daten übertragen können. Bei diesen streams ist, dass Daten im text.

Datenströme, wie Wasser strömt, haben zwei enden. Sie haben eine Quelle und einen Abfluss. Welchen Linux-Befehl Sie verwenden bietet Sie ein Ende von jedem Strom. Das andere Ende wird bestimmt durch die shell, die gestartet den Befehl. Das Ende wird an das terminal angeschlossen werden-Fenster, verbunden mit einem Rohr, oder eine Weiterleitung auf eine Datei oder einen anderen Befehl, nach dem Befehl, der gestartet, der Befehl.

Die Linux-Standard-Streams

In Linux, stdin ist die standard-input-stream. Dieser nimmt den text als Eingabe. Text-Ausgabe aus dem Befehl an die shell erfolgt über den stdout (standard-out) stream. Fehlermeldungen aus der Befehl gesendet werden, durch die stderr (standard-error) stream.

So können Sie sehen, dass es zwei output-streams stdout und stderr, und einem Eingabe-stream stdin. Weil Fehlermeldungen und normalen Ausgang haben jeweils Ihre eigene Leitung zu tragen Sie in das terminal-Fenster, Sie können behandelt werden, unabhängig voneinander.

Streams Werden Behandelt Wie Dateien

Streams unter Linux—wie fast alles—werden behandelt, als seien Sie Dateien. Sie können Lesen von text aus einer Datei und schreiben Sie text in eine Datei. Diese beiden Maßnahmen einen stream von Daten. So das Konzept der Umgang mit einem Datenstrom als eine Datei ist, dass viel von einer Strecke.

Jede Datei, die im Zusammenhang mit einem Prozess zugeordnet wird, die eine eindeutige Nummer zu identifizieren. Dies ist bekannt als der file-Deskriptor. Immer wenn eine Aktion erforderlich ist, um auf eine Datei ausgeführt werden, die den Datei-descriptor verwendet wird, um die Datei zu identifizieren.

Diese Werte werden immer für stdin, stdout und stderr:

  • 0: stdin
  • 1: stdout
  • 2: stderr

Die Reaktion auf Pipes und Umleitungen

Zur Erleichterung jemand den Einstieg in ein Thema, eine gemeinsame Technik zu lehren, eine vereinfachte version des Themas. Zum Beispiel mit der Grammatik, wird uns gesagt, dass die Regel “I vor E, außer nach C”. Aber eigentlich sind es mehr Ausnahmen von dieser Regel, als es Fälle gibt, die ihm gehorchen.

In eine ähnliche Richtung, wenn man über stdin, stdout und stderr es ist bequem zu traben akzeptierte axiom, dass ein Prozess weder weiß noch interessiert, wo seine drei standard-streams sind beendet. Sollte ein Prozess kümmern, ob seine Ausgabe wird an das terminal oder umgeleitet in eine Datei? Kann es auch sagen, wenn Ihr input kommt von der Tastatur, oder wird er verrohrt in einem anderen Prozess?

Tatsächlich, ein Prozess, der Bescheid weiß—oder es zumindest herausfinden kann, sollten Sie wählen, zu prüfen—und es kann das Verhalten ändern sich entsprechend, wenn der Autor beschlossen, um diese Funktionalität hinzufügen.

Wir sehen diese Veränderung im Verhalten sehr leicht. Versuchen Sie diese zwei Befehle:

ls

ls | cat

Der ls-Befehl verhält sich anders, wenn seine Ausgaben (stdout) wird geleitet in einen anderen Befehl. Es ist ls, dass die Schalter auf einer einzigen Spalte ausgegeben, es ist keine Konvertierung durchgeführt von cat. Und ls hat die gleiche Sache, wenn die Ausgabe umgeleitet werden:

ls > capture.txt

Katze capture.txt

Umleiten von stdout und stderr

Es ist ein Vorteil, um mit Fehlermeldungen geliefert wird durch einen von Bach gewidmet. Es bedeutet, können wir leiten Sie einen Befehl die Ausgabe (stdout) in eine Datei und sehe immer noch Fehlermeldungen (stderr) in das terminal-Fenster. Sie reagieren auf den Fehler, wenn Sie müssen, sobald Sie auftreten. Es hält auch die Fehlermeldungen von kontaminierenden die Datei stdout umgeleitet wurde in.

Geben Sie den folgenden text in einen editor und speichern Sie Sie in einer Datei namens error.sh.

#!/bin/bash

echo “Über, um zu versuchen, auf eine Datei zuzugreifen, die nicht existiert”
Katze bad-filename.txt

Machen Sie das Skript ausführbar mit diesem Befehl:

chmod +x error.sh

Die erste Zeile des Skripts Echos text in das terminal-Fenster, über den stdout-stream. Die zweite Linie versucht, auf eine Datei zuzugreifen, die nicht existiert. Dies generiert eine Fehlermeldung, geliefert über stderr.

Führen Sie das Skript mit diesem Befehl:

./error.sh

Wir können sehen, dass beide streams output, stdout und stderr, wurden im terminal angezeigt windows.

Lassen Sie uns versuchen, leiten Sie die Ausgabe in eine Datei:

./error.sh > capture.txt

Die Fehlermeldung erfolgt über stderr wird weiterhin gesendet, um das terminal-Fenster. Wir können überprüfen Sie den Inhalt der Datei, um zu sehen, ob die stdout-Ausgabe ging zu der Datei.

Katze capture.txt

Die Ausgabe von stdin umgeleitet wurde, um die Datei als erwartet.

Die > Umleitung-symbol funktioniert mit stdout standardmäßig. Sie können verwenden Sie eine der numerischen Datei-Deskriptoren, um anzuzeigen, welcher standard-Ausgabe-stream, die Sie umleiten möchten.

Explizit umleiten von stdout, verwenden Sie diese Umleitung Anweisung:

1>

Explizit redirect stderr, verwenden Sie diese Umleitung Anweisung:

2>

Lassen Sie uns versuchen, um unsere Tests wieder, und diese Zeit werden wir nutzen, 2>:

./error.sh 2> capture.txt

Die Fehlermeldung wird umgeleitet, und die stdout echo-Nachricht gesendet, um das terminal-Fenster:

Mal sehen, was ist in der capture.txt Datei.

Katze capture.txt

Die stderr-Nachricht ist in capture.txt wie erwartet.

Die Umleitung Sowohl stdout und stderr

Sicherlich, wenn wir umleiten kann entweder auf stdout oder stderr in eine Datei unabhängig von einander, wir sollten in der Lage sein, um Sie umzuleiten beide gleichzeitig in zwei verschiedene Dateien?

Ja, wir können. Dieser Befehl leitet stdout in eine Datei namens capture.txt und stderr in eine Datei namens error.txt.

./error.sh 1> capture.txt 2> error.txt

Da beide streams Ausgabe–standard-Ausgabe und standard-Fehler umgeleitet werden, um Dateien, es gibt keine sichtbare Ausgabe im terminal-Fenster. Wir sind zurückgekehrt, um die Kommandozeile, als ob nichts stattgefunden hat.

Lassen Sie uns prüfen Sie den Inhalt der einzelnen Dateien:

Katze capture.txt
Katze error.txt

Umleiten von stdout und stderr in die Gleiche Datei

Das ist ordentlich, wir haben jeder von den standard-output-streams gehen, um seine eigene Datei. Die einzige andere Kombination, die wir tun können, ist, zu senden, sowohl stdout und stderr in die gleiche Datei.

Wir können dies erreichen, mit dem folgenden Befehl:

./error.sh > capture.txt 2&>1

Lassen Sie uns brechen, dass nach unten.

  • ./error.sh: Startet die error.sh -Skript-Datei.
  • > capture.txt: Leitet die stdout-stream auf der capture.txt Datei. > ist die Kurzform für 1>.
  • 2>&1: Diese verwendet die &> redirect-Anweisung. Diese Anleitung ermöglicht Ihnen die shell zu machen, die einen stream habe das gleiche Ziel wie ein anderes streamen. In diesem Fall, sagen wir, “redirect stream 2, stderr, die auf das gleiche Ziel, das stream 1, stdout wird umgeleitet.”

Es gibt keinen sichtbaren Ausgang. Das ist ermutigend.

Schauen wir uns die capture.txt Datei und sehen, was drin ist.

Katze capture.txt

Sowohl die stdout-und stderr-streams umgeleitet wurden, um ein einziges Ziel-Datei.

Um die Ausgabe eines Streams umgeleitet und leise weggeworfen, leiten die Ausgabe nach /dev/null.

Die Erkennung der Umleitung In einem Skript

Wir diskutierten darüber, wie ein Befehl erkennen kann, wenn einer der streams umgeleitet werden, und können wählen, sein Verhalten zu ändern entsprechend. Können wir dies in unserer eigenen Skripte? Ja, wir können. Und es ist eine sehr einfache Technik zu verstehen und einzusetzen.

Geben Sie den folgenden text in einen editor und speichern Sie es als input.sh.

#!/bin/bash

if [ -t 0 ]; then

echo stdin kommt von der Tastatur

sonst

echo stdin kommt aus einem Rohr oder einer Datei

fi

Verwenden Sie den folgenden Befehl ein, um es ausführbar machen:

chmod +x input.sh

Der Clou ist die Prüfung innerhalb der eckigen Klammern. Die -t (terminal) option liefert true (0), wenn die Datei mit der zugehörigen Datei-Deskriptor beendet in das terminal-Fenster. Wir habe verwendet, der Datei-Deskriptor 0 als argument in der Prüfung, das entspricht stdin.

Wenn stdin mit einem terminal verbunden ist-Fenster wird der test als wahr erweisen. Wenn stdin verbunden ist, um eine Datei oder eine pipe, der test schlägt fehl.

Wir können jede bequeme text-Datei zu generieren, die Eingang in das Skript. Hier verwenden wir eine sogenannte dummy.txt.

./input.sh < dummy.txt

Die Ausgabe zeigt, dass das Skript erkennt, dass die Eingabe nicht von der Tastatur, es kommt aus einer Datei. Wenn Sie sich entschieden haben, können Sie variieren Ihr Skript Verhalten sich entsprechend.

Das war mit einem Datei-Umleitung, versuchen wir es mit einem Rohr.

Katze dummy.txt | ./input.sh

Das Skript erkennt, dass die Eingabe-Pipe hinein. Oder genauer gesagt, es erkennt einmal mehr, dass die stdin-stream ist nicht angeschlossen, um ein terminal-Fenster.

Lassen Sie das Skript ausführen, die weder Rohre noch leitet.

./input.sh

Den stdin-stream verbunden ist, um das terminal-Fenster, und das script meldet diese entsprechend.

Um zu überprüfen, die gleiche Sache mit den output-stream, wir benötigen ein neues Drehbuch. Geben Sie Folgendes in einen editor und speichern Sie es als output.sh.

#!/bin/bash

if [ -t 1 ]; then

echo stdout gehen, um das terminal-Fenster

sonst

echo stdout umgeleitet wird, oder verrohrt

fi

Verwenden Sie den folgenden Befehl ein, um es ausführbar machen:

chmod +x input.sh

Die einzige bedeutende änderung das Skript ist in der test-in die eckigen Klammern. Wir sind mit der Ziffer 1 zur Darstellung der Datei-Deskriptor für Ausgabe auf stdout.

Probieren Sie es aus. Werden wir leiten Sie die Ausgabe durch cat.

./Ausgabe | Katze

Das Skript erkennt, dass die Ausgabe nicht direkt auf ein terminal-Fenster.

Wir können auch testen Sie das Skript durch umleiten der Ausgabe in eine Datei.

./output.sh > capture.txt

Es gibt keine Ausgabe auf dem terminal-Fenster, sind wir schweigend an die Eingabeaufforderung zurückgegeben. Wie wir erwarten würden.

Wir können, schauen Sie in die capture.txt Datei, um zu sehen, was gefangen genommen wurde. Verwenden Sie den folgenden Befehl, dies zu tun.

Katze capture.sh

Wieder der einfache test in unserem Skript erkennt, dass der stdout-stream wird nicht direkt versendet, um ein terminal-Fenster.

Wenn wir das Skript ausführen, ohne irgendwelche pipes oder Umleitungen, es sollte erkennen, dass stdout geliefert wird, direkt in das terminal-Fenster.

./output.sh

Und das ist genau das, was wir sehen.

Streams Des Bewusstseins

Wissen Sie, wie Sie sagen, wenn Ihre Skripts verbunden sind, um das terminal-Fenster, oder ein Rohr, oder umgeleitet werden, können Sie passen Ihr Verhalten entsprechend an.

Logging-und Diagnose-Ausgang können mehr oder weniger detailliert, je nachdem, ob es auf dem Bildschirm oder in eine Datei. Fehlermeldungen werden protokolliert, um eine andere Datei als die normale Ausgabe eines Programms.

Wie es gewöhnlich der Fall ist, mehr wissen bringt mehr Optionen.

LESEN SIE WEITER

  • › Wie bewerbe ich mich für die Apple-Karte
  • › Native App Ist Wahrscheinlich Nur eine Alte Web-Browser
  • › Wie Sie zu Öffnen Alte Web-Seiten in Internet Explorer auf Windows 10
  • “Was Bedeutet “Yeet” Bedeuten, und Wie Verwenden Sie Es?
  • › Erstellen von Desktop-Verknüpfungen auf Windows-10-der Einfache Weg