Aby odczytać z deskryptora pliku 6, mogę użyć <&6
lub </dev/fd/6
(aka /proc/self/fd/6
). Zwykle oba działają równie dobrze. Jednak jeśli deskryptorem pliku jest gniazdo, zdarzają się dziwne rzeczy. Na przykład:
$ 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
Tutaj ls
pokazuje, że deskryptor jest rzeczywiście obecny. Ale dostęp do danych nie jest w ten sposób możliwy. Jeśli użyję cat <&6
zamiast tego wszystko znowu działa dobrze.
Jaka jest różnica między obu sposobami dostępu do deskryptora pliku?
Czy istnieje dobry sposób na dostęp do deskryptora, jeśli liczba jest podana w zmiennej? ( </dev/fd/$fd
działałoby, ale <&$fd
nie działa.)
(Powyższą sytuację można zaobserwować na Linuksie, ale nie na OpenBSD. - Wygląda na to, że deskryptor pliku jest tam zwykłym urządzeniem znakowym.)