Você ainda pode ler o descritor de arquivo. O problema é que você está usando a chamada de sistema "dup2" para fazer uma segunda referência a um descritor de arquivo, e um descritor de arquivo tem uma posição. Depois do primeiro gato, a posição está no final dos dados. Você pode ler os dados um pouco de cada vez (aqui eu uso read
como exemplo para ler uma linha de cada vez, normalmente você usaria ler -r), e estou usando perl como uma maneira fácil de retroceder a posição para o início do arquivo.
$ exec 3<<<'This is some text
> and some more
> that is all folks'
$ read <&3 ; echo "$REPLY"
This is some text
$ read <&3 ; echo "$REPLY"
and some more
$ perl -e 'sysseek(stdin,0,0);' <&3
$ read <&3 ; echo "$REPLY"
This is some text