cat <&3
faz exatamente o que deve fazer, ou seja, ler o arquivo até chegar ao final do arquivo. Quando você o chama, a posição do arquivo no descritor de arquivo é onde você o deixou, ou seja, no final do arquivo. (Há uma única posição de arquivo, não separada para leitura e escrita).
cat /proc/$$/fd/3
não faz o mesmo que cat <&3
: abre o mesmo arquivo em um descritor diferente. Como cada descritor de arquivo tem sua própria posição e a posição é definida como 0 ao abrir um arquivo para leitura, esse comando imprime o arquivo inteiro e não afeta o script.
Se você quiser ler o que escreveu, será necessário reabrir o arquivo ou retroceder o descritor de arquivo (ou seja, defina sua posição como 0). Não existe uma maneira interna de fazer uma shell POSIX nem a maioria das implementações sh ( existe uma em ksh93 ). Existe apenas um utilitário que pode ser procurado: dd
, mas ele só pode procurar. (Existem outros utilitários que podem pular para frente, mas isso não ajuda.)
Acho que a única solução portátil é lembrar o nome do arquivo e abri-lo quantas vezes forem necessárias. Observe que, se o arquivo não for um arquivo comum, talvez você não consiga recuar de qualquer maneira.