Você não está fazendo nada errado: é isso que devemos esperar.
O primeiro cat <&0 consome todo o conteúdo da entrada padrão, porque é isso que o cat faz: lê todas as suas entradas até o final.
Quando o segundo cat <&0 é executado, não há mais nada a ser consumido na entrada padrão: o fim do arquivo já foi alcançado anteriormente.
Se, em um script de shell, você precisar fazer 2 ou mais passagens por meio de sua entrada padrão, será necessário despejá-lo em um arquivo temporário e processar o arquivo temporário quantas vezes desejar.
A criação segura de arquivos temporários em /tmp e a certeza de que eles são descartados corretamente quando seu script é encerrado ou morre é deixada como um exercício para você: -)
A propósito, o <&0 é desnecessário e não faz nada. Sua função é apontar a entrada padrão para o descritor de arquivo 0 ... que é a entrada padrão ... que é, por definição, onde a entrada padrão já aponta! Você pode apenas fazer esse comando cat sozinho.