Quando você tem duas linhas de comando com duas read instâncias de cat outputs, somente a primeira linha pode ser lida, da maneira que você usou, porque STDIN para read sempre terá o mesmo conteúdo com a mesma primeira linha.
Se você ler o conteúdo de uma saída de gato várias vezes, obterá as próximas linhas, porque STDIN para leitura não será redefinido para a linha de partida original.
$ cat /tmp/tt | ( read tt ; echo $tt )
1 2 3 4 5
$ cat /tmp/tt | ( read tt ; echo $tt ; read tt ; echo $tt )
1 2 3 4 5
6 7 8 9
$ cat /tmp/tt | ( read tt ; echo $tt ; read tt ; echo $tt ; read tt ; echo $tt )
1 2 3 4 5
6 7 8 9
10 11
Resumidamente: "(A) Se você executar read uma vez, duas vezes e na mesma entrada (STDIN), você obterá o primeiro segundo e a terceira linha. (B) Se você read muitos vezes, mas redefinir a entrada para cada read , então você só receberá a mesma primeira linha muitas vezes "
Mais informações: "agrupando" o read instances (à esquerda do pipe), o sub-shell mantém o pipe aberto. Ao usar while , novamente o sub-shell mantém o tubo aberto. Portanto, read lerá a "próxima linha" toda vez, em vez da "primeira linha".