Para leer del descriptor de archivo 6 puedo usar <&6o </dev/fd/6(aka /proc/self/fd/6). Por lo general, ambos funcionan igual de bien. Sin embargo, si ese descriptor de archivo es un socket, suceden cosas extrañas. Por ejemplo:
$ 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
Aquí lsmuestra que el descriptor está realmente presente. Pero acceder a los datos no es posible de esta manera. Si uso cat <&6en su lugar, todo vuelve a funcionar bien.
¿Cuál es la diferencia entre ambas formas de acceder al descriptor de archivo?
¿Hay una buena manera de acceder a un descriptor si el número se da en una variable? ( </dev/fd/$fdfuncionaría, pero <&$fdno funciona)
(La situación anterior se puede observar en Linux, pero no en OpenBSD. Parece que ese descriptor de archivo es un dispositivo de caracteres normal allí).