Для чтения из файлового дескриптора 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. - Кажется, дескриптор файла является обычным символическим устройством там.)