Para ler do descritor de arquivo 6 eu posso usar <&6
ou </dev/fd/6
(aka /proc/self/fd/6
). Geralmente ambos funcionam igualmente bem. No entanto, se esse descritor de arquivo for um soquete, coisas estranhas acontecem. Por exemplo:
$ 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
Aqui ls
mostra que o descritor está realmente presente. Mas acessar os dados não é possível dessa maneira. Se eu usar, cat <&6
tudo funcionará bem novamente.
Qual é a diferença entre as duas maneiras de acessar o descritor de arquivo?
Existe uma boa maneira de acessar um descritor se o número for fornecido em uma variável? ( </dev/fd/$fd
funcionaria, mas <&$fd
não funciona.)
(A situação acima pode ser observada no linux, mas não no OpenBSD. - Parece que o descritor de arquivo é um dispositivo de caractere comum lá.)