Eingabe und Ausgabe in Linux
In Linux sind Eingabe und Ausgabe wesentliche Konzepte, die es Ihnen ermöglichen, mit dem System zu interagieren und Daten zu verarbeiten. Das Verständnis, wie Eingabe und Ausgabe in der Linux-Umgebung funktionieren, ist entscheidend für eine effektive Arbeit im Terminal.
Standard Input, Output und Fehler
In Linux gibt es drei Standardstreams: STDIN
(Standard Input), STDOUT
(Standard Output) und STDERR
(Standard Error). Diese Streams werden verwendet, um Eingabe, Ausgabe und Fehlermeldungen beim Ausführen von Programmen und Befehlen zu verarbeiten.
STDIN
ist der Standard-Eingabestream, der Daten von der Tastatur oder einem anderen Programm liest. Die Nummer0
repräsentiert denSTDIN
-Stream.STDOUT
ist der Standard-Ausgabestream, der die Ausgabe eines Programms oder Befehls anzeigt. Die Nummer1
repräsentiert denSTDOUT
-Stream.STDERR
ist der Standard-Fehlerstream, der Fehlermeldungen und diagnostische Informationen anzeigt. Die Nummer2
repräsentiert denSTDERR
-Stream.
Standardmäßig ist STDIN
mit der Tastatur verbunden, und STDOUT
und STDERR
sind mit dem Terminal verbunden. Das bedeutet, dass wenn Sie einen Befehl in der Shell ausführen, die Eingabe von der Tastatur stammt und die Ausgabe sowie Fehlermeldungen auf dem Terminal angezeigt werden.
Eine gute Praxis ist es, Fehlermeldungen von regulärer Ausgabe zu trennen, damit Sie Fehler leicht identifizieren und behandeln können. Einige Programme halten sich jedoch möglicherweise nicht an diese Konvention, und Fehlermeldungen können mit regulärer Ausgabe vermischt sein.
Eingabeumleitung
In Linux ermöglicht die Eingabeumleitung die Steuerung, woher die Eingabe stammt. Standardmäßig ist bei der Ausführung eines Befehls in der Shell STDIN
mit der Tastatur verbunden.
Die Eingabeumleitung ermöglicht es, zu ändern, woher der Befehl seine Eingabe liest. Sie können die Eingabe umleiten, sodass sie aus einer Datei und nicht aus der Tastatur stammt.
Um die Eingabe aus einer Datei umzuleiten, verwenden Sie das kleiner-als-Symbol (<
) gefolgt vom Dateinamen. Zum Beispiel, um die Eingabe aus einer Datei namens input.txt
zu lesen, würden Sie den folgenden Befehl verwenden:
command < input.txt
Hier ist ein Beispiel, wie die Eingabeumleitung in realen Szenarien funktioniert. Angenommen, Sie haben eine Datei namens data.txt
, die eine Liste von Namen enthält, und Sie möchten die Anzahl der Namen in der Datei mit dem Befehl wc
zählen. Anstatt jeden Namen manuell in das Terminal einzugeben, können Sie die Eingabe aus der Datei umleiten. Durch Ausführen des Befehls wc -l < data.txt
wird der wc
-Befehl die Inhalte von data.txt
als Eingabe lesen und die Anzahl der Zeilen zählen, was die Anzahl der Namen in der Datei darstellt. Auf diese Weise sparen Sie Zeit und Mühe, indem Sie die Namen nicht manuell eingeben müssen. Der Inhalt der Datei data.txt
könnte wie folgt aussehen:
John Doe
Jane Smith
Michael Johnson
Emily Brown
William Davis
In diesem Fall enthält die Datei eine Liste von 5 Namen, jeweils in einer separaten Zeile. Durch Umleiten des Eingangs von der Datei wird der wc
-Befehl die Anzahl der Zeilen in der Datei zählen und das Ergebnis anzeigen.
Das doppelte kleiner-als-Symbol (<<
) wird für ein Here-Dokument verwendet, das es Ihnen ermöglicht, Eingaben interaktiv an einen Befehl zu übergeben. Zum Beispiel:
Befehl << EOF
Dies sind einige Eingaben.
EOF
In diesem Fall werden die Eingaben interaktiv zwischen den Markierungen <<
und EOF
bereitgestellt. Dies kann nützlich sein, wenn Sie mehrere Zeilen Eingaben an einen Befehl übergeben müssen.
Ausgaberichtung
Die Ausgaberichtung ermöglicht es Ihnen, zu ändern, wohin der Befehl seine Ausgabe sendet. Sie können die Ausgabe umleiten, damit sie anstatt zum Terminal in eine Datei geht.
Um die Ausgabe in eine Datei umzuleiten, verwenden Sie das Größer-als-Symbol (>
), gefolgt vom Dateinamen. Zum Beispiel, um die Ausgabe in eine Datei namens output.txt
umzuleiten, würden Sie den folgenden Befehl verwenden:
Befehl > output.txt
Hinweis:
>
ist eine Vereinfachung von1>
, wasSTDOUT
in eine Datei umleitet. Wenn SieSTDERR
in eine Datei umleiten möchten, können Sie2>
verwenden.
Wenn Sie die Ausgabe an eine vorhandene Datei anhängen möchten, anstatt sie zu überschreiben, können Sie das doppelte Größer-als-Symbol (>>
) anstelle des einfachen Größer-als-Symbols (>
) verwenden. Zum Beispiel:
Befehl >> output.txt
Das kaufmännische Und-Symbol (&
) bezieht sich auf einen Dateideskriptor. Im Kontext der Ausgaberichtung repräsentiert 1
STDOUT
und 2
STDERR
. Durch Kombinieren der Dateideskriptoren mit den Umleitungszeichen können Sie sowohl STDOUT
als auch STDERR
in dieselbe Datei umleiten. Zum Beispiel:
Befehl > output.txt 2>&1
Lassen Sie uns den Befehl aufschlüsseln:
Befehl
ist der Befehl, den Sie ausführen möchten.>
(gleichbedeutend mit1>
) leitet denSTDOUT
-Strom zur Dateioutput.txt
um.2>
leitet denSTDERR
-Stream irgendwohin um.&1
bezieht sich auf den Dateideskriptor1
, derSTDOUT
ist.
Durch Kombinieren von 2>
und &1
leiten Sie STDERR
an denselben Speicherort wie STDOUT
um, der in diesem Fall die Datei output.txt
ist.
Kombination von Eingabe- und Ausgaberichtung
Sie können die Eingabe- und Ausgaberichtung kombinieren, um gleichzeitig aus einer Datei zu lesen und in eine Datei zu schreiben. Zum Beispiel:
command < input.txt > output.txt
Durch die Verwendung von Eingabe- und Ausgaberichtung können Sie steuern, woher die Eingabe stammt und wohin die Ausgabe geht, was Ihre Shell-Befehle flexibler und leistungsfähiger macht.
Verwenden von Pipes zum Verbinden von Befehlen
Pipes sind ein leistungsstarkes Feature in Linux, das es Ihnen ermöglicht, mehrere Befehle zu verbinden und komplexe Befehlssequenzen zu erstellen. Die Verwendung von Pipes kann Ihre Produktivität und Effizienz erheblich steigern, wenn Sie in der Befehlszeile arbeiten.
Ein Pipe wird durch das senkrechte Strichsymbol |
dargestellt. Es ermöglicht die Umleitung der Ausgabe eines Befehls als Eingabe für einen anderen Befehl. Dadurch können Sie mehrere Befehle miteinander verketten und Operationen auf den zwischen ihnen fließenden Daten ausführen.
Angenommen, Sie haben ein Verzeichnis mit einer großen Anzahl von Textdateien und möchten die Wortanzahl für jede Datei finden. Sie können den Befehl ls
verwenden, um alle Dateien im Verzeichnis aufzulisten, und dann die Ausgabe an den Befehl wc
weiterleiten, um die Wörter zu zählen. Der Befehl würde so aussehen:
ls | wc -w
In diesem Beispiel listet der Befehl ls
alle Dateien im Verzeichnis auf und das Pipe-Symbol |
leitet die Ausgabe an den Befehl wc
weiter. Der Befehl wc
zählt dann die Wörter in der Eingabe und zeigt das Ergebnis an.
Pipes können mit jedem Befehl verwendet werden, der Ausgaben erzeugt. Sie ermöglichen es Ihnen, leistungsstarke Kombinationen von Befehlen zu erstellen und komplexe Aufgaben mühelos auszuführen.
Eine weitere häufige Anwendung für Pipes ist das Filtern und Verarbeiten von Text. Zum Beispiel können Sie das grep
-Kommando verwenden, um nach einem bestimmten Muster in einer Datei zu suchen, und dann die Ausgabe an das sort
-Kommando weiterleiten, um die Zeilen zu sortieren. Die resultierende Ausgabe kann dann in eine neue Datei umgeleitet oder auf dem Bildschirm angezeigt werden.
Hier ist ein Beispiel:
grep 'error' log.txt | sort > errors.txt
In diesem Beispiel sucht das grep
-Kommando nach Zeilen, die das Wort error
in der Datei log.txt
enthalten, und der Pipe leitet die Ausgabe an das sort
-Kommando weiter. Das sort
-Kommando sortiert dann die Zeilen alphabetisch und das >
-Symbol leitet die Ausgabe in die Datei errors.txt
.
Die Verwendung von Pipes zum Verbinden von Befehlen ermöglicht es Ihnen, komplexe Befehlssequenzen zu erstellen und wiederkehrende Aufgaben zu automatisieren. Es gibt Ihnen die Flexibilität, Operationen auf der Ausgabe eines Befehls durchzuführen, bevor Sie sie an den nächsten Befehl weitergeben, was es Ihnen ermöglicht, leistungsstarke Datenpipelines zu erstellen.
Fazit
Eingabe und Ausgabe sind grundlegende Konzepte in Linux, die es Ihnen ermöglichen, mit dem System zu interagieren und Daten zu verarbeiten. Indem Sie verstehen, wie Eingabe- und Ausgaberichtlinien, Pipes und Streams funktionieren, können Sie effektiver im Terminal arbeiten und eine Vielzahl von Aufgaben effizient ausführen.