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".