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 "" gesetzt file1
.
<file2
Dies bewirkt, dass die Standardeingabe des Befehls von kommt file2
.
Die Tatsache, dass diese Umleitungen an einem nicht funktionierenden Ort in der Befehlszeile platziert werden, spielt keine Rolle.
$ cat <file2 >file1
ist das gleiche wie
$ <file2 cat >file1
das ist das gleiche wie
$ <file2 >file1 cat
etc.¹
Beachten Sie, dass das cat
Dienstprogramm in all diesen Fällen ohne Befehlszeilenargumente ausgeführt wird . Die Umleitungen sind keine Operanden des cat
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
und cat <file
(oder, wenn Sie so wollen <file cat
) besteht darin, dass im ersten Fall das cat
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 verbinde cat
den Eingabestream mit it². Im zweiten Fall cat
wird festgestellt, dass ihm kein Dateioperand zugewiesen wurde, und automatisch von der Standardeingabe zum Lesen gewechselt. Dies ist eine Funktion von cat
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ür cat
und für einige andere Dienstprogramme (dh nichts, was die Shell tut) etwas Besonderes . Zur Verwendung cat
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 beispielsweise file1
nicht abgeschnitten, wenn kein Zugriff möglich file2
ist (die Umleitungen werden von links nach rechts analysiert). Die relative Platzierung des Wortes cat
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:
$ sort file >file
Hier schneidet die Shell die Datei ab (leert sie), file
bevor sie sort file
die sort
Standardausgabe der Datei ausführt und mit der Datei verbindet. Das sort
Dienstprogramm öffnet file
und sortiert dann seinen Inhalt (der nichts ist). Das Ergebnis (nichts) wird über den Standardausgabestream an übergeben file
.
Das Mittel in diesem speziellen Fall (zum Sortieren einer Datei "an Ort und Stelle") ist
$ sort -o file file
oder
$ sort file >file.sorted && mv file.sorted file
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:
Ein "einfacher Befehl" ist eine Folge von optionalen Variablenzuweisungen und -umleitungen in beliebiger Reihenfolge, optional gefolgt von Wörtern und Umleitungen, die von einem Steueroperator beendet werden. [Ref: POSIX Shell Command Language 2.9.1 Einfache Befehle]
Und auch darüber, dass die Umleitung nicht zu den Operanden des Dienstprogramms gehört:
Die optionale Zahl, der Umleitungsoperator und das Wort dürfen in den Argumenten für den auszuführenden Befehl (falls vorhanden) nicht enthalten sein. [Ref: POSIX Shell Command Language 2.7-Umleitung]