GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum wird der Dateideskriptor nur einmal geöffnet und gelesen?

Warum kann es nur einmal verwendet werden, wenn wir den Dateideskriptor selbst öffnen und ihn auf stdin umleiten?
Bitte sehen Sie sich das Beispiel unten an, um zu verstehen, was ich sagen möchte. Nach dem einmaligen Lesen mit dem cat-Befehl wird die Datei beim zweiten Mal nicht über denselben Dateideskriptor gelesen.

└─$ exec 6< input.txt
└─$ cat <&6
i am just string
and another string..
└─$ cat <&6
└─$

Akzeptierte Antwort:

Um die Datei zu drucken, die erste cat muss es bis zum Ende lesen. exec 6< input.txt bewirkt, dass die Shell den Dateideskriptor hält, bis die
Shell stirbt oder sie schließt, sodass der Datei-Offset immer noch auf das Ende der
Datei zeigt, wenn der zweite cat aufgerufen wird, die somit nichts nach stdout schreibt.

Auf einem Linux-basierten System können Sie dies sehen, indem Sie einen Blick in die Dateideskriptorinfo werfen:

echo "File contents" > input.txt
exec 6< input.txt
cat "/proc/$$/fdinfo/6"
cat <&6
cat "/proc/$$/fdinfo/6"
cat <&6

Wenn Sie dieses Skript ausführen, erhalten Sie so etwas wie

pos:    0
flags:  0100000
mnt_id: 113
File contents
pos:    14
flags:  0100000
mnt_id: 113

Bestätigen, dass der Offset (pos ) ist nicht 0
wenn die zweite cat wird ausgeführt, zeigt aber stattdessen auf sein Ende.

Um den Offset zurückzusetzen, können Sie eine weitere exec 6< input.txt hinzufügen dazwischen die cat s.


Linux
  1. Lesen und schreiben Sie Daten von überall mit Umleitung im Linux-Terminal

  2. Lesen und schreiben Sie in dieselbe Datei unter Linux, ohne sie zu überschreiben?

  3. Warum (und wie) hat die Verwendung von Cat auf Binärdateien das Terminal durcheinander gebracht?

  4. Wie lautet der Befehl zum Kopieren, Lesen und Entfernen von Dateien unter Linux

  5. Grep in einer riesigen Logdatei (>14 GB) nur die letzten x GB?

Warum wird select unter Linux verwendet

Warum führt das Forking meines Prozesses dazu, dass die Datei unendlich gelesen wird?

Vorteile der Cat'ing-Datei und der Weiterleitung an grep

Warum wird das Root-Verzeichnis durch ein /-Zeichen gekennzeichnet?

Warum respektiert mount die Nur-Lesen-Option für Bind-Mounts nicht?

Linux + wie man nur bestimmten Benutzern das Lesen der Datei gibt