Zum Lesen aus dem Dateideskriptor 6 kann ich <&6
oder </dev/fd/6
(aka /proc/self/fd/6
) verwenden. Normalerweise funktionieren beide gleich gut. Wenn dieser Dateideskriptor jedoch ein Socket ist, passieren seltsame Dinge. Beispielsweise:
$ bash -c 'ls -l /dev/fd/6;cat /dev/fd/6' 6</dev/tcp/localhost/12345
lrwx------ 1 michas michas 64 Jan 10 19:50 /dev/fd/6 -> socket:[315010]
cat: /dev/fd/6: No such device or address
Hier ls
zeigt sich, dass der Deskriptor tatsächlich vorhanden ist. Ein Zugriff auf die Daten ist auf diese Weise jedoch nicht möglich. Wenn ich cat <&6
stattdessen benutze, funktioniert alles wieder gut.
Was ist der Unterschied zwischen beiden Arten des Zugriffs auf den Dateideskriptor?
Gibt es eine gute Möglichkeit, auf einen Deskriptor zuzugreifen, wenn die Nummer in einer Variablen angegeben ist? ( </dev/fd/$fd
würde funktionieren, <&$fd
tut es aber nicht.)
(Die obige Situation kann unter Linux beobachtet werden, aber nicht unter OpenBSD. - Der Dateideskriptor scheint dort ein normales Zeichengerät zu sein.)