Для чтения из файлового дескриптора 6 я могу использовать <&6или </dev/fd/6(иначе /proc/self/fd/6). Обычно оба работают одинаково хорошо. Однако если этот дескриптор файла оказывается сокетом, происходят странные вещи. Например:
$ 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
Здесь lsпоказано, дескриптор действительно присутствует. Но получить доступ к данным таким образом невозможно. Если я использую cat <&6вместо этого все снова работает хорошо.
В чем разница между обоими способами доступа к дескриптору файла?
Есть ли хороший способ получить доступ к дескриптору, если число указано в переменной? ( </dev/fd/$fdбудет работать, но <&$fdне работает.)
(Вышеуказанная ситуация может наблюдаться в Linux, но не в OpenBSD. - Кажется, дескриптор файла является обычным символическим устройством там.)