Apenas para adicionar à boa resposta de @ jw013, pode ajudar a perceber que é o mesmo que
{
cat -n
cat -n
} < infile
< file
sendo curto 0< file
, use o descritor de arquivo 0 em vez de 3.
E apenas para confundir um pouco o assunto, esta versão:
exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3
Comporta-se de maneira diferente, dependendo do sistema operacional em que você o executa e do tipo de infile
(arquivo normal x pipe x dispositivo ...)
No Solaris e a maioria dos Unices comerciais, um open("/dev/fd/3")
é mais ou menos equivalente a um dup(3)
(assim < /dev/fd/3
é aproximadamente o mesmo que <&3
), enquanto no Linux, para arquivos regulares, /dev/fd/3
é implementado como um link simbólico para o arquivo original, então open("/dev/fd/3")
a abre de novo desde o início ( e possivelmente com bandeiras diferentes do fd 3).