Die Umleitung von Eingabe und Ausgabe ist eine natürliche Funktion jeder Programmier- oder Skriptsprache. Technisch gesehen geschieht dies immer dann, wenn Sie mit einem Computer interagieren. Die Eingabe wird von stdin
gelesen (Standardeingabe, normalerweise Ihre Tastatur oder Maus), die Ausgabe geht an stdout
(Standardausgabe, ein Text- oder Datenstrom), und Fehler werden an stderr
gesendet . Wenn Sie verstehen, dass diese Datenströme existieren, können Sie steuern, wohin Informationen gehen, wenn Sie eine Shell wie Bash oder Zsh verwenden.
Standard in, Standard out und Standard Error existieren als Speicherorte im Dateisystem unter Linux. Sie können sie in /dev
sehen :
$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@
Sie können direkt nicht viel damit anfangen, aber es ist manchmal nützlich, sie als Meta-Speicherorte zu betrachten, an die Sie Daten senden können.
Die Grundlagen der Umleitung sind einfach:Verwenden Sie eine Anzahl von >
Zeichen zum Umleiten der Ausgabe und einige <
Zeichen um die Eingabe umzuleiten.
Ausgabe umleiten
So schreiben Sie die Ausgabe des Befehls ls in eine Datei:
$ ls > list.txt
Sie sehen die Ausgabe von ls
nicht wie Sie es normalerweise tun würden, da die Ausgabe in die list.txt
geschrieben wird Datei anstelle Ihres Bildschirms. Dies ist in der Tat so vielseitig, dass Sie damit sogar den Inhalt einer Datei in eine andere kopieren können. Es muss auch keine Textdatei sein. Sie können die Umleitung für Binärdaten verwenden:
$ cat image.png > picture.png
(Falls Sie sich fragen, warum Sie das jemals tun sollten, es ist für eine manchmal nützliche Auswirkung auf Dateiberechtigungen.)
Eingabe umleiten
Sie können die Eingabe auch "in" einen Befehl umleiten. Dies ist wohl weniger nützlich als das Umleiten der Ausgabe, da viele Befehle bereits fest codiert sind, um Eingaben von einem von Ihnen bereitgestellten Argument entgegenzunehmen. Es kann jedoch nützlich sein, wenn ein Befehl eine Liste von Argumenten erwartet und Sie diese Argumente in einer Datei haben und sie schnell aus der Datei in Ihr Terminal "kopieren und einfügen" möchten (außer Sie möchten eigentlich nicht kopieren und einfügen):
$ sudo dnf install $(<package.list)
Übliche Anwendungen der Eingabeumleitung sind das here-Dokument (oder einfach hier-doc kurz) und hier-string Techniken. Diese Eingabemethode leitet einen Textblock bis zu einer speziellen Dateiende-Markierung in den Standardeingabestrom um (die meisten Leute verwenden EOF
, aber es kann jede Zeichenfolge sein, von der Sie erwarten, dass sie eindeutig ist). Versuchen Sie, dies einzugeben (bis zur zweiten Instanz von EOF
) in ein Terminal:
$ echo << EOF
> foo
> bar
> baz
> EOF
Das erwartete Ergebnis:
foo
bar
baz
Ein Hier-Dokument ist ein gängiger Trick, der von Bash-Skriptern verwendet wird, um mehrere Textzeilen in eine Datei oder auf den Bildschirm zu kopieren. Solange Sie nicht vergessen, die Klausel mit Ihrer End-of-File-Markierung zu beenden, ist dies ein effektiver Weg, unhandliche Listen von echo
zu vermeiden oder printf
Aussagen.
Ein hier-String ähnelt einem hier-doc , aber es besteht aus nur einem String (oder mehreren Strings, die als ein einzelner String mit Anführungszeichen getarnt sind):
$ cat <<< "foo bar baz"
foo bar baz
Umleitung von Fehlermeldungen
Fehlermeldungen gehen an einen Stream namens stderr
, bezeichnet als 2>
zwecks Weiterleitung. Dieser Befehl leitet Fehlermeldungen an eine Datei namens output.log
weiter :
$ ls /nope 2> output.log
Senden von Daten an /dev/null
Mehr über Bash
- Bash-Spickzettel
- Eine Einführung in die Programmierung mit Bash
- Eine Anleitung für Systemadministratoren zum Bash-Scripting
- Neueste Bash-Artikel
So wie es Orte für Standardeingang, Standardausgang und Fehler gibt, gibt es auch einen Ort für nirgendwo auf dem Linux-Dateisystem. Es heißt null
, und es befindet sich in /dev
, daher wird es oft von Leuten als "devnull" ausgesprochen, die es zu häufig verwenden, um "slash dev slash null" zu sagen.
Sie können Daten an /dev/null
senden Weiterleitung nutzen. Zum Beispiel find
Der Befehl ist in der Regel ausführlich und meldet häufig Berechtigungskonflikte beim Durchsuchen Ihrer Dateien:
$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file
Der find
Der Befehl verarbeitet dies als Fehler, sodass Sie nur die Fehlermeldungen nach /dev/null
umleiten können :
$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file
Umleitung verwenden
Die Umleitung ist eine effiziente Methode, um Daten in Bash von einem Ort zum anderen zu übertragen. Möglicherweise verwenden Sie die Umleitung nicht ständig, aber wenn Sie lernen, sie bei Bedarf zu verwenden, können Sie viele unnötige Dateien öffnen und Daten kopieren und einfügen, die im Allgemeinen alle Mausbewegungen und viele Tastendrücke erfordern. Greifen Sie nicht zu solchen Extremen. Lebe das gute Leben und verwende die Weiterleitung.