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.