Для читання з дескриптора файлів 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. - Схоже, дескриптор файлів є звичайним пристроєм символів.)