Umleitung (Computer)

Im Computer, Umleitung ist eine Form von Interprozesskommunikationund ist eine Funktion, die den meisten gemeinsam ist Befehlszeileninterpreten, einschließlich der verschiedenen Unix -Muscheln das kann umleiten Standardströme zu benutzerdefinierten Standorten.
Im Unix-artig Betriebssysteme, Programme leiten sich mit dem um DUP2(2) Systemanrufoder es weniger flexibel, aber höhere Ebene stdio Analoga, Freopen(3) und Popen (3).
Umleiten von Standardeingangs- und Standardausgaben umleiten
Die Umleitung wird normalerweise durch Platzierung bestimmter Platzierung implementiert Figuren zwischen Befehle.
Basic
Typischerweise das Syntax dieser Charaktere ist wie folgt, mit Verwendung <
Eingabe umzuleiten und >
Ausgabe umleiten. command > file1
ausgeführt BefehlPlatzieren Sie die Ausgabe ein Datei1im Gegensatz dazu, es am Terminal anzuzeigen, das ist das übliche Ziel für die Standardausgabe. Dieser Wille Klamotten Alle vorhandenen Daten in Datei1.
Verwendung command < file1
ausgeführt Befehl, mit Datei1 als Eingabequelle im Gegensatz zu der Klaviatur, was die übliche Quelle für Standardeingaben ist.
command < infile > outfile
kombiniert die beiden Funktionen: Befehl liest aus im Ordner und schreibt an Outfile
Varianten
Um die Ausgabe an das Ende der Datei anzuhängen, anstatt sie zu kuscheln, die >>
Operator wird verwendet: command1 >> file1
.
Um aus einem Stream Literal (eine Inline -Datei, übergeben an die Standardeingabe) zu lesen, kann man a verwenden Hier Dokument, Verwendung der <<
Operator:
$ Tr a-Z a-Z << END_TEXT> Eins zwei drei > uno dos tres > End_text EINS ZWEI DREI Uno dos tres
Um aus einer Zeichenfolge zu lesen, kann man a verwenden hier String, Verwendung der <<<
Operator: tr a-z A-Z <<< "one two three"
, oder:
$ Zahlen="eins zwei drei" $ Tr a-Z a-Z <<< "$ Zahlen" EINS ZWEI DREI
Rohrleitungen

Programme können zusammen ausgeführt werden, so dass ein Programm die Ausgabe von einem anderen ohne explizite Zwischendatei liest. command1 | command2
ausgeführt Kommando1mit seiner Ausgabe als Eingabe für Kommando2 (allgemein genannt Rohrleitungen, mit dem "|
"Charakter wird als" Rohr "bekannt.
Die beiden Programme, die die Befehle ausführen, können parallel mit dem einzigen Speicherplatz für Arbeitspuffer ausgeführt werden (Linux erlaubt für jeden Puffer bis zu 64.000) plus jeder Arbeitsfläche, die für die Verarbeitung jedes Befehls erforderlich ist. Beispielsweise kann ein Befehl "Sortier" keine Ausgabe erzeugen, bis alle Eingabedatensätze gelesen wurden, da sich der allerletzte Datensatz als erstes in sortierter Reihenfolge herausstellen könnte. Dr. Alexia Massalins experimentelles Betriebssystem, Synthesewürde die Priorität jeder Aufgabe anpassen, da sie nach der Fülle ihrer Eingangs- und Ausgangspuffer lief.
Dies führt zum gleichen Endergebnis wie die Verwendung von zwei Weiterleitungen und einer temporären Datei wie in:
$ command1> tempfile$ command2 <tempfile$ RM Tempfile
Aber hier, Kommando2 fängt erst an, um auszuführen, bis Kommando1 hat fertig, und eine ausreichend große Kratzdatei ist erforderlich, um die Zwischenergebnisse sowie für jeden Arbeitsraum jeder Aufgabe zu halten. Obwohl DOS die "Pipe" -Syntax erlaubt, wird dieser zweite Ansatz verwendet. Angenommen, ein langjähriges Programm "Arbeiter" produziert verschiedene Nachrichten, sobald es funktioniert, und ein zweites Programm kopiert den Zeitstempel pro Datensatz aus Stdin zu Stdout, vorangestellt nach Datum und Uhrzeit des Systems, zu der der Datensatz empfangen wird. Eine Sequenz wie z. Worker | TimeStamp > LogFile.txt
Würde nur dann Zeitstempel produzieren, wenn der Arbeiter fertig war, und nur anzeigen, wie schnell die Ausgabedatei gelesen und geschrieben werden konnte.
Ein gutes Beispiel für das Kommandospitzen ist die Kombination Echo
mit einem anderen Befehl, um etwas Interaktives in einer nicht interaktiven Hülle zu erreichen, z. echo -e 'user\npass' | ftp localhost
. Das läuft die ftp Client mit Eingabe Benutzer, Drücken Sie Rückkehr, dann passieren.
Bei lässigem Gebrauch ist der erste Schritt einer Pipeline häufig Katze
oder Echo
, lesen aus einer Datei oder Zeichenfolge. Dies kann oft durch Eingangsindirektion oder a ersetzt werden hier Stringund die Verwendung von Katze und Rohrleitungen anstelle von Input -Umleitung wird als bezeichnet als Nutzloser Gebrauch von Katze. Zum Beispiel die folgenden Befehle:
$ Katze infile | Befehl $ Echo $ String | Befehl $ Echo -e 'Benutzer \ npass' | FTP localhost
kann ersetzt werden durch:
$ Befehl < infile $ Befehl <<< $ String $ FTP localhost <<< $ 'Benutzer \ npass'
Wie Echo
ist oft ein Shell-Internal-Befehl, seine Verwendung ist nicht so kritisiert wie Katze, was ein externer Befehl ist.
Umleiten von und von den Standarddateihandles
Im Unix -Muscheln abgeleitet vom Original Bourne ShellDie ersten beiden Aktionen können durch Platzierung einer Zahl (die platzieren Dateideskriptor) unmittelbar vor dem Charakter; Dies wirkt sich aus, welcher Strom für die Umleitung verwendet wird. Die Unix -Standard -E/A -Streams sind:
Handhaben | Name | Beschreibung |
---|---|---|
0 | Stdin | Standardeingabe |
1 | Stdout | Standardausgabe |
2 | Stderr | Standart Fehler |
Zum Beispiel, command 2> file1
ausgeführt BefehlRegie der Standart Fehler streamen zu Datei1.
In Schalen abgeleitet von CSH (das C Shell) Die Syntax findet stattdessen die an & (Ampersand) Charakter der Umleitungsfiguren und erzielte so ein ähnliches Ergebnis. Der Grund dafür besteht darin, zwischen einer Datei namens '1' und stdout zu unterscheiden, d. H. cat file 2>1
vs cat file 2>&1
. Im ersten Fall wird Stderr in eine Datei mit dem Namen 'umgeleitet' umgeleitet.1'Und im zweiten wird Stderr in Stdout umgeleitet.
Eine weitere nützliche Fähigkeit besteht darin, einen Standarddateihandle zu einem anderen umzuleiten. Die beliebteste Variation ist die Zusammenführung Standart Fehler hinein Standardausgabe So können Fehlermeldungen zusammen mit der üblichen Ausgabe zusammengearbeitet werden (oder abwechselnd). Zum Beispiel, find / -name .profile > results 2>&1
Wird versuchen, alle benannten Dateien zu finden .Profil. Ohne Umleitung ausgeführt, wird es Treffer ausgeben Stdout und Fehler (z. B. mangelnde Privilegien für das Durchlaufen von geschützten Verzeichnissen) nach Stderr. Wenn die Standardausgabe in die Datei gerichtet ist ErgebnisseIn der Konsole werden Fehlermeldungen angezeigt. Um sowohl Treffer als auch Fehlermeldungen in der Datei zu sehen Ergebnisse, verschmelzen Stderr (Handle 2) in Stdout (Handle 1) Verwenden 2>&1
.
Wenn die zusammengeführte Ausgabe in ein anderes Programm geleitet werden soll, haben Sie die Dateiverführungssequenz 2>&1
muss dem Rohrsymbol vorangehen, also, find / -name .profile 2>&1 | less
Eine vereinfachte, aber nicht posixen konforme Form des Befehls, command > file 2>&1
ist (nicht in Bourne Shell vor Version 4, endgültiger Veröffentlichung oder in der Standard Shell verfügbar Debian Almquist Shell verwendet in Debian/Ubuntu): command &>file
oder command >&file
.
Es ist möglich zu verwenden 2> & 1
Vor ">
"Aber das Ergebnis wird allgemein missverstanden. Die Regel ist, dass jede Umleitung den Griff zum Ausgangsstrom unabhängig voneinander feststellt.2> & 1
"Sets Handle 2
zu welchem Griff 1
zeigt auf, was zu diesem Zeitpunkt normalerweise ist Stdout. Dann ">
"Umleitungen des Griffs 1
zu etwas anderem, z. eine Datei, aber es tut es nicht Wechseln Sie den Griff 2
, was immer noch darauf hinweist Stdout.
Im folgenden Beispiel wird die Standardausgabe auf geschrieben Datei, aber Fehler werden von stderr zu stdout umgeleitet, d. H. An den Bildschirm gesendet: command 2>&1 > file
.
Um sowohl Fehler als auch Standardausgabe zu schreiben Datei, die Reihenfolge sollte umgekehrt werden. Die Standardausgabe würde zuerst in die Datei umgeleitet, dann würde Stderr zusätzlich in den STDOut -Handle umgeleitet, der bereits in die Datei geändert wurde: command > file 2>&1
.
Gekettete Pipelines
Die Umleitungs- und Rohrleitungs -Token können zusammengekettet werden, um komplexe Befehle zu erzeugen. Zum Beispiel, sort infile | uniq -c | sort -n > outfile
sortiert die Zeilen von im Ordner In lexikografischer Reihenfolge schreibt einzigartige Linien, die durch die Anzahl der Vorkommen vorangestellt sind, die resultierende Ausgabe numerisch sortiert und die endgültige Ausgabe in platziert Outfile. Diese Art von Konstruktion wird sehr häufig in verwendet Shell -Skripte und Stapeldateien.
Zu mehreren Ausgängen umleiten
Der Standardbefehl T -Shirt Kann die Ausgabe von einem Befehl zu mehreren Zielen umleiten:ls -lrt | tee xyz
. Dadurch wird die Dateilistenausgabe sowohl die Standardausgabe als auch die Datei angelegt xyz.
Siehe auch
- Hier-dokument, eine Möglichkeit, Text für Eingaben in Befehlszeilenschalen anzugeben
- Schaufelschaufel
- Befehlssubstitution
- Prozesssubstitution
Externe Links
- Die einzelne Unix -Spezifikation, Version 4 von Die offene Gruppe : Duplizieren Sie einen offenen Dateideskriptor - Systemschnittstellenreferenz, Referenz,
- Umleitungdefinition durch das Linux Information Project (LINFO)
- E/A -Umleitung in Das Linux -Dokumentationsprojekt
- Umleitung in Fenstern
- Erstellen eines Kinderprozesses mit umgeleiteten Eingang und Ausgabe in Fenstern