Verständnis Shell-Umleitung auf nicht vorhandene Dateien
-
07-07-2019 - |
Frage
ls > ls.out
Dies wird auch ls.out in der Liste enthalten. Mein Verständnis ist:> (Shell-Ausgabe Umleitungsoperator eine Datei schafft erstes (die STDOUT- nehmen), wenn es nicht bereits vorhanden ist und dann ls Befehl kommt zu spielen und es ist mit der gerade in der Ausgabe ls.out Datei erstellt. Ist das richtig? Wenn nicht, können Sie bitte die Funktionsweise dieses Befehls auszuarbeiten.
In ähnlicher
wc temp > temp
Wird drucken 0 0 0 Temp in der gerade erstellten temporären Datei.
Dieses Verhalten von Shell ist interessant. Ich frage mich, wie es tatsächlich funktioniert. BTW, sind beide Übungen in der Unix-Programmierumgebung Buch. Als ich die Antwort bereits erwähnt, möchte ich einige Experten mein Verständnis zu korrigieren.
Lösung
Wenn die Standardausgabe mit >
Umleitung, die Shell die Datei erstellen (als leere Datei), wenn es nicht bereits vorhanden ist. Ferner wird die Datei vor der Shell Gabeln und execs geöffnet der Befehl ausgeführt wird. Wenn Sie wc temp > temp
tun, öffnet sich die Shell die Datei zum Schreiben und dann Gabeln und execs wc
auf seiner geöffneten Datei vorbei in den Prozess behandelt.
Andere Tipps
Simplifizierung:
ls
schaut auf den inode (Verzeichniseintrag), die die Umleitung erstellt.
wc
kann die Inode sehen, dass die Umleitung erstellt, aber wenn es auf den Inhalt sieht sie sind leer, weil es (wc
) sie noch nicht geschrieben hat.
Edit:
Als erstes wird in beiden Fällen die Umleitung (>ls.out
oder >temp
) erzeugt eine leere Datei. Ein Eintrag (Inode) im Verzeichnis wird auf den Speicherort der Datei zu zeigen und einige Informationen darüber enthält. Sehen Sie sich die Wikipedia-Artikel über Inodes .
Als nächstes wird im Fall von ls
, alle Einträge in dem Verzeichnis, einschließlich der für ls.out
, die gerade erstellt wurde , gelesen und geschrieben stdout
(was in diesem Fall wird der Inhalt von ls.out
).
Oder im Fall von wc
, es ist das Zählen des Newline, Wort- und Byte-Anzahl der neu erstellten Datei namens temp
, die leer ist , so schreibt es die Null zählt in die Datei nach zählt (nichts).
Der Inhalt der Dateien (temp
oder ls.out
) wird nicht geschrieben, bis schließlich das Lesen durchgeführt wird, so dass sie nicht aufgenommen haben.
Für eine bessere Weise zu vergleichen , was ls
und wc
tun, versuchen Sie diesen Befehl (wenn ls.out
ist nicht existent):
ls -l > ls.out
Sie sollten sehen, dass die Dateigröße für ls.out
Null ist nach der Liste innen (cat ls.out
) enthalten ist, aber wenn man Sie ls -l ls.out
werden sehen, dass es nicht Null ist. Dies entspricht dem, was Sie sehen, geschieht mit wc
.
betrachten wc -l temp > temp
Wenn temp
bereits existiert und hatte 20 Zeilen immer noch sagen, das Ergebnis der cat temp
nach dem obigen Befehl ausgeführt wird, wird es 0 Temp sein.
Ich denke, das liegt daran, dass der Schal eine neue leere temp
schafft auch wenn temp
bestand somit die bestehenden temporären Überschreiben und damit, wenn wc
die num von Linien in temp
zu zählen versucht, es wird Null.
In der Tat > temp
wird von Shell zuerst ausgeführt und dann wird wc -l temp
ausgeführt.