Vorausgesetzt file2
, der Befehl existiert bereits
> file1 < file2 cat
erscheint der Inhalt kopiert werden file2
zu file1
.
Aber ich kann diese Struktur nicht verstehen.
Ich verstehe, dass "Nothing" file1
angesprochen wird (Erstellen oder Löschen seines Inhalts). Dann wird auf den Inhalt von file2
verwiesen file1
.
Warum ist cat
nach file2
? Woher weiß es, cat file2
ob die Operanden nicht in der richtigen Reihenfolge sind?
shell
io-redirection
shaqed
quelle
quelle
Antworten:
Bevor die Shell den
cat
Befehl in der Befehlszeile ausführt , sucht sie nach Umleitungen.Es gibt zwei Weiterleitungen:
>file1
Dadurch wird die Standardausgabe des Befehls auf "" gesetztfile1
.<file2
Dies bewirkt, dass die Standardeingabe des Befehls von kommtfile2
.Die Tatsache, dass diese Umleitungen an einem nicht funktionierenden Ort in der Befehlszeile platziert werden, spielt keine Rolle.
ist das gleiche wie
das ist das gleiche wie
etc.¹
Beachten Sie, dass das
cat
Dienstprogramm in all diesen Fällen ohne Befehlszeilenargumente ausgeführt wird . Die Umleitungen sind keine Operanden descat
Befehls, sondern Anweisungen an die Shell, um Umleitungen in und aus dem Befehl einzurichten (wobei die Standardeingabe und -ausgabe mit Dateien verbunden werden). Die Shell richtet die Umleitungen vor dem Aufrufen des Befehls ein.Der Unterschied zwischen
cat file
undcat <file
(oder, wenn Sie so wollen<file cat
) besteht darin, dass im ersten Fall dascat
Dienstprogramm selbst die Datei, die als Operand in der Befehlszeile angegeben ist, zum Lesen öffnet, während im zweiten Fall die Shell dies tut öffne die Datei und verbindecat
den Eingabestream mit it². Im zweiten Fallcat
wird festgestellt, dass ihm kein Dateioperand zugewiesen wurde, und automatisch von der Standardeingabe zum Lesen gewechselt. Dies ist eine Funktion voncat
und einiger anderer Dienstprogramme, die nicht alle Dienstprogramme ausführen.cat
liest auch von seiner Standardeingabe, wenn er den Operanden hat-
. Auch dies ist nur fürcat
und für einige andere Dienstprogramme (dh nichts, was die Shell tut) etwas Besonderes . Zur Verwendungcat
im aktuellen Verzeichnis auf einer Datei , deren Name ist-
, fügen Sie einen Pfad zu dem Dateinamen, wie zum Beispiel./-
.¹ Die Reihenfolge der Weiterleitungen ist unter Umständen immer noch wichtig. With
cat <file2 >file1
wird beispielsweisefile1
nicht abgeschnitten, wenn kein Zugriff möglichfile2
ist (die Umleitungen werden von links nach rechts analysiert). Die relative Platzierung des Wortescat
ist jedoch noch willkürlich und wird dies nicht beeinflussen.² Siehe auch die Frage " cat gibt beim Öffnen einer nicht vorhandenen Datei einen anderen Fehler aus ".
Die Tatsache, dass die Shell die Umleitungen einrichtet, bevor sie den Befehl in der Befehlszeile ausführt, ist der Grund, warum solche Dinge fehlschlagen und Sie eine leere Ausgabedatei erhalten:
Hier schneidet die Shell die Datei ab (leert sie),
file
bevor siesort file
diesort
Standardausgabe der Datei ausführt und mit der Datei verbindet. Dassort
Dienstprogramm öffnetfile
und sortiert dann seinen Inhalt (der nichts ist). Das Ergebnis (nichts) wird über den Standardausgabestream an übergebenfile
.Das Mittel in diesem speziellen Fall (zum Sortieren einer Datei "an Ort und Stelle") ist
oder
Das ist mehr oder weniger das, was
sort
passiert, wenn die-o
Datei zur Angabe des Namens der Ausgabedatei verwendet wird.Nur um die Aussage zu sichern, dass die Umleitungen möglicherweise vor dem tatsächlichen Namen des Dienstprogramms in der Befehlszeile stehen:
Und auch darüber, dass die Umleitung nicht zu den Operanden des Dienstprogramms gehört:
quelle
<in foo | bar >out
alles in logische Reihenfolge bringt. Ich bin auch gernecho >&2 Something bad happened
für die Fehlerausgabe von Shell-Skripten. Aber>out <in cat
ist nur Verschleierungsort file >file
richtig durchgeführt werden?sort -o file file
.< file1 > file2 cat
wäre besser als,> file2 < file1 cat
da dies vermeiden würdefile2
, abgeschnitten zu werden, wennfile1
es nicht geöffnet werden kann.