Terminalfenster auf einem Linux-Computer

Fatmawati Achmad Zaenuri/Shutterstock.com

|_+_|, |_+_| und |_+_| sind drei Datenströme, die erstellt werden, wenn Sie einen Linux-Befehl starten. Sie können sie verwenden, um festzustellen, ob Ihre Skripte weitergeleitet oder umgeleitet werden. Wir zeigen Ihnen wie.



Streams verbinden zwei Punkte

Sobald Sie anfangen, Linux und Unix-ähnliche Betriebssysteme kennenzulernen, werden Sie auf die Begriffe |_+_|, |_+_| und |_+_| stoßen. Diese sind drei Standardstreams die erstellt werden, wenn ein Linux-Befehl ausgeführt wird. In der Computertechnik ist ein Stream etwas, das Daten übertragen kann. Bei diesen Streams handelt es sich bei diesen Daten um Text.

Datenströme haben wie Wasserströme zwei Enden. Sie haben eine Quelle und einen Abfluss. Welchen Linux-Befehl Sie auch immer verwenden, stellt ein Ende jedes Streams bereit. Das andere Ende wird von der Shell bestimmt, die den Befehl gestartet hat. Dieses Ende wird entsprechend der Befehlszeile, die den Befehl gestartet hat, mit dem Terminalfenster verbunden, mit einer Pipe verbunden oder zu einer Datei oder einem anderen Befehl umgeleitet.

Die Linux-Standardstreams

Unter Linux |_+_| ist der Standard-Eingabestrom. Dies akzeptiert Text als Eingabe. Die Textausgabe des Befehls an die Shell erfolgt über das |_+_| (Standard-Out) Stream. Fehlermeldungen des Befehls werden über |_+_| . gesendet (Standardfehler) stream.

Sie können also sehen, dass es zwei Ausgabeströme gibt, |_+_| und |_+_| und einen Eingabestrom |_+_|. Da Fehlermeldungen und normale Ausgaben jeweils über einen eigenen Kanal zum Terminalfenster führen, können sie unabhängig voneinander behandelt werden.

Streams werden wie Dateien behandelt

Streams werden unter Linux – wie fast alles andere – so behandelt, als wären sie Dateien. Sie können Text aus einer Datei lesen und Text in eine Datei schreiben. Beide Aktionen beinhalten einen Datenstrom. Das Konzept, einen Datenstrom als Datei zu verarbeiten, ist also nicht so weit hergeholt.

iPhone schaltet sich zu schnell aus
Anzeige

Jeder Datei, die einem Prozess zugeordnet ist, wird eine eindeutige Nummer zugewiesen, um sie zu identifizieren. Dies wird als Dateideskriptor bezeichnet. Immer wenn eine Aktion für eine Datei ausgeführt werden muss, der Dateideskriptor wird verwendet, um die Datei zu identifizieren.

Diese Werte werden immer verwendet für |_+_|, |_+_| und |_+_|:

  • 0 : stdin
  • eins : stdout
  • zwei : stderr

Reagieren auf Pipes und Redirects

Um jemandem den Einstieg in ein Thema zu erleichtern, besteht eine gängige Technik darin, eine vereinfachte Version des Themas zu vermitteln. Bei der Grammatik wird uns beispielsweise gesagt, dass die Regel I vor E ist, außer nach C. Aber eigentlich gibt es sind weitere Ausnahmen von dieser Regel als es Fälle gibt, die ihm gehorchen.

In ähnlicher Weise, wenn über |_+_|, |_+_| und |_+_| . gesprochen wird es ist bequem, das akzeptierte Axiom auszuprobieren, dass ein Prozess weder weiß noch sich darum kümmert, wo seine drei Standardströme enden. Sollte sich ein Prozess darum kümmern, ob seine Ausgabe an das Terminal geht oder in eine Datei umgeleitet wird? Kann es sogar erkennen, ob seine Eingabe von der Tastatur kommt oder von einem anderen Prozess dorthin geleitet wird?

Tatsächlich weiß ein Prozess Bescheid – oder kann es zumindest herausfinden, falls er sich für eine Überprüfung entscheiden sollte – und er kann sein Verhalten entsprechend ändern, wenn der Softwareautor beschließt, diese Funktionalität hinzuzufügen.

Anzeige

Wir können diese Verhaltensänderung sehr leicht sehen. Probieren Sie diese beiden Befehle aus:

stdin

stdout

Die |_+_| Befehl verhält sich anders, wenn seine Ausgabe (|_+_|) in einen anderen Befehl geleitet wird. Es ist |_+_| die auf eine einspaltige Ausgabe umschaltet, ist keine Konvertierung, die von |_+_| durchgeführt wird. Und |_+_| macht dasselbe, wenn die Ausgabe umgeleitet wird:

stderr

stdin

Umleitung von stdout und stderr

Es ist von Vorteil, wenn Fehlermeldungen von einem dedizierten Stream geliefert werden. Das bedeutet, dass wir die Ausgabe eines Befehls (|_+_|) in eine Datei umleiten können und trotzdem alle Fehlermeldungen (|_+_|) im Terminalfenster sehen. Sie können bei Bedarf auf die auftretenden Fehler reagieren. Es verhindert auch, dass die Fehlermeldungen die Datei kontaminieren, die |_+_| wurde umgeleitet.

Geben Sie den folgenden Text in einen Editor ein und speichern Sie ihn in einer Datei namens error.sh.

stdout

Machen Sie das Skript mit diesem Befehl ausführbar:

stederr

Die erste Zeile des Skripts gibt Text über das |_+_| . an das Terminalfenster zurück Strom. Die zweite Zeile versucht, auf eine Datei zuzugreifen, die nicht existiert. Dadurch wird eine Fehlermeldung generiert, die über |_+_| geliefert wird.

Führen Sie das Skript mit diesem Befehl aus:

stdin

Wir können sehen, dass beide Ausgabeströme, |_+_| und |_+_|, wurden in den Terminalfenstern angezeigt.

Versuchen wir, die Ausgabe in eine Datei umzuleiten:

stdout

Anzeige

Die Fehlermeldung, die über |_+_| . geliefert wird wird immer noch an das Terminalfenster gesendet. Wir können den Inhalt der Datei überprüfen, um zu sehen, ob die |_+_| Ausgabe ging in die Datei.

windows 10 weiße titelleiste
stderr

Die Ausgabe von |_+_| wurde wie erwartet in die Datei umgeleitet.

Die |_+_| Umleitungssymbol funktioniert mit |_+_| standardmäßig. Sie können einen der numerischen Dateideskriptoren verwenden, um anzugeben, welchen Standardausgabestream Sie umleiten möchten.

Um |_+_| explizit umzuleiten, verwenden Sie diese Umleitungsanweisung:

stdout

Um |_+_| explizit umzuleiten, verwenden Sie diese Umleitungsanweisung:

stderr

Versuchen wir unseren Test noch einmal, und diesmal verwenden wir |_+_|:

stdin

Die Fehlermeldung wird umgeleitet und das |_+_| |_+_| Nachricht wird an das Terminalfenster gesendet:

Sehen wir uns an, was sich in der Datei capture.txt befindet.

stdin

Die |_+_| Die Nachricht befindet sich wie erwartet in der Datei capture.txt.

Umleitung von stdout und stderr

Sicherlich, wenn wir entweder |_+_| . umleiten können oder |_+_| unabhängig voneinander in eine Datei umleiten können, sollten wir beide gleichzeitig in zwei verschiedene Dateien umleiten können?

Anzeige

Ja wir können. Dieser Befehl leitet |_+_| in eine Datei namens capture.txt und |_+_| in eine Datei namens error.txt.

stdout,

Da beide Ausgabeströme – Standardausgabe und Standardfehler – in Dateien umgeleitet werden, gibt es im Terminalfenster keine sichtbare Ausgabe. Wir kehren zur Befehlszeilenaufforderung zurück, als ob nichts passiert wäre.

Lassen Sie uns den Inhalt jeder Datei überprüfen:

stderr stdin

Umleiten von stdout und stderr in dieselbe Datei

Das ist nett, wir haben jeden der Standardausgabestreams in eine eigene dedizierte Datei. Die einzige andere Kombination, die wir tun können, ist, beide |_+_| . zu senden und |_+_| in dieselbe Datei.

Dies können wir mit dem folgenden Befehl erreichen:

stdout

Lassen Sie uns das aufschlüsseln.

  • ./error.sh : Startet die Skriptdatei error.sh.
  • > capture.txt : Leitet die |_+_| . um in die Datei capture.txt streamen. |_+_| steht für |_+_|.
  • 2> & 1 : Dies verwendet die &> Umleitungsanweisung. Mit dieser Anweisung können Sie der Shell mitteilen, dass ein Stream zum gleichen Ziel wie ein anderer Stream gelangen soll. In diesem Fall sagen wir, dass Stream 2, |_+_|, an dasselbe Ziel umgeleitet wird, an das Stream 1, |_+_|, umgeleitet wird.

Es gibt keine sichtbare Ausgabe. Das ist ermutigend.

xbox one controller treiber mac

Lassen Sie uns die Datei capture.txt überprüfen und sehen, was darin enthalten ist.

stderr

Sowohl die |_+_| und |_+_| Streams wurden an eine einzelne Zieldatei umgeleitet.

Um die Ausgabe eines Streams umzuleiten und stillschweigend zu verwerfen, leiten Sie die Ausgabe an |_+_|.

Umleitung innerhalb eines Skripts erkennen

Wir haben besprochen, wie ein Befehl erkennen kann, ob einer der Streams umgeleitet wird, und sein Verhalten entsprechend ändern kann. Können wir dies in unseren eigenen Skripten erreichen? Ja wir können. Und es ist eine sehr einfach zu verstehende und anzuwendende Technik.

Anzeige

Geben Sie den folgenden Text in einen Editor ein und speichern Sie ihn als input.sh.

ls

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

stdout

Der clevere Teil ist der innerhalb der eckigen Klammern testen . Die |_+_| (Terminal) Option gibt true (0) zurück, wenn die Datei mit dem Dateideskriptor verknüpft ist endet im Terminalfenster . Wir haben den Dateideskriptor 0 als Argument für den Test verwendet, der |_+_| darstellt.

Wenn |_+_| mit einem Terminalfenster verbunden ist, wird sich der Test als wahr erweisen. Wenn |_+_| mit einer Datei oder Pipe verbunden ist, schlägt der Test fehl.

Wir können jede beliebige Textdatei verwenden, um Eingaben für das Skript zu generieren. Hier verwenden wir eine namens dummy.txt.

ls

Die Ausgabe zeigt, dass das Skript erkennt, dass die Eingabe nicht von einer Tastatur kommt, sondern von einer Datei. Wenn Sie möchten, können Sie das Verhalten Ihres Skripts entsprechend variieren.

Anzeige

Das war mit einer Dateiumleitung, versuchen wir es mit einer Pipe.

WLAN-Passwort auf dem Mac finden
cat

Das Skript erkennt, dass seine Eingabe über eine Pipe geleitet wird. Genauer gesagt erkennt es noch einmal, dass die |_+_| stream ist nicht mit einem Terminalfenster verbunden.

Lassen Sie uns das Skript ohne Pipes oder Redirects ausführen.

ls

Die |_+_| stream ist mit dem Terminalfenster verbunden und das Skript meldet dies entsprechend.

Um dasselbe mit dem Ausgabestream zu überprüfen, benötigen wir ein neues Skript. Geben Sie Folgendes in einen Editor ein und speichern Sie es als output.sh.

stdout

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

stderr

Die einzige wesentliche Änderung an diesem Skript ist im Test in den eckigen Klammern. Wir verwenden die Ziffer 1, um den Dateideskriptor für |_+_| darzustellen.

Probieren wir es aus. Wir leiten die Ausgabe durch |_+_|.

stdout

Anzeige

Das Skript erkennt, dass seine Ausgabe nicht direkt in ein Terminalfenster geht.

Wir können das Skript auch testen, indem wir die Ausgabe in eine Datei umleiten.

stdout

Es erfolgt keine Ausgabe im Terminalfenster, wir kehren still zur Eingabeaufforderung zurück. Wie wir es erwarten würden.

Wir können in die Datei capture.txt schauen, um zu sehen, was erfasst wurde. Verwenden Sie dazu den folgenden Befehl.

stderr

eingebautes mikrofon funktioniert nicht

Auch hier erkennt der einfache Test in unserem Skript, dass die |_+_| stream wird nicht direkt an ein Terminalfenster gesendet.

Anzeige

Wenn wir das Skript ohne Pipes oder Umleitungen ausführen, sollte es erkennen, dass |_+_| wird direkt an das Terminalfenster geliefert.

stdout

Und genau das sehen wir.

Bewusstseinsströme

Wenn Sie wissen, ob Ihre Skripte mit dem Terminalfenster oder einer Pipe verbunden sind oder umgeleitet werden, können Sie ihr Verhalten entsprechend anpassen.

Protokoll- und Diagnoseausgaben können mehr oder weniger detailliert sein, je nachdem, ob sie auf dem Bildschirm oder in einer Datei ausgegeben werden. Fehlermeldungen können in einer anderen Datei als der normalen Programmausgabe protokolliert werden.

Wie so oft bringt mehr Wissen mehr Möglichkeiten.

Linux-Befehle
Dateien Teer · pv · Katze · tac · chmod · Griff · unterschied · sed · Mit · Mann · geschoben · popd · fsck · Testdisk · seq · fd · pandoc · CD · $PFAD · awk · beitreten · jq · falten · einzigartig · Journalctl · Schwanz · Zustand · ls · fstab · rauswerfen · weniger · chgrp · chown · rev · suchen · Saiten · Typ · umbenennen · Postleitzahl · entpacken · montieren · ummount · Installieren · fdisk · mkfs · rm · rmdir · rsync · df · gpg · wir · Nano · mkdir · von · ln · Patch · Konvertieren · rclon · Fetzen · SRM
Prozesse alias · Bildschirm · oben · nett · renice · Fortschritt · strace · System · tmux · chsh · Geschichte · beim · Charge · kostenlos · die · dmesg · Benutzermod · ps · chroot · xargs · tty · kleiner Finger · lsof · vmstat · Auszeit · Mauer · ja · töten · Schlaf · sudo · seine · Zeit · groupadd · Benutzermod · Gruppen · lshw · stilllegen · neu starten · halt · ausschalten · passwd · lscpu · crontab · Datum · bg · fg
Vernetzung netstat · Klingeln · Traceroute · ip · ss · Wer ist · fail2ban · bmon · Sie · Finger · nmap · ftp · Locken · wget · Wer · Wer bin ich · In · iptables · ssh-keygen · ufw

VERBUNDEN: Beste Linux-Laptops für Entwickler und Enthusiasten

WEITER LESEN