Como é um comando após o comando while executado sobre os loops?

1
  1. Em while <command> parte de um loop while, é <command> executado em cada loop, independentemente de outros loops?
  2. No exemplo a seguir, por que o loop while pode fazer read ler todas as linhas de um arquivo, uma a uma, sem o loop while read sempre lê a primeira linha do arquivo em todas as repetições?

    Sem usar o loop while, pode read ler todas as linhas do arquivo um por um?

    $ cat /tmp/tt
    1 2 3 4 5
    6 7 8 9
    10 11
    
    $ cat /tmp/tt | while read tt; do echo $tt; done
    1 2 3 4 5
    6 7 8 9
    10 11
    
    $ cat /tmp/tt | read tt
    $ echo $tt
    1 2 3 4 5
    $ cat /tmp/tt | read tt
    $ echo $tt
    1 2 3 4 5
    
por Tim 10.02.2016 / 04:20

2 respostas

1

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

    
por 10.02.2016 / 04:55
3

Q1

In while <command> part of a while loop, is <command> executed in each loop independently of other loops?

Sim, <command> será executado para cada loop do loop while executado.

Quantos loops são executados são afetados por outros loops se outros loops também consumirem a entrada stdin . O comando read lê de stdin (a opção unles -u n é usada). Algumas outras leituras podem consumir a mesma entrada, o que afetará o loop primeiro while .

Q2

Um novo código, como o seu, tem uma grande falha [1] .

$ cat /tmp/tt | {  read tt; echo "$tt";   }
1 2 3 4 5
$ cat /tmp/tt | {  read tt; echo "$tt";   }
1 2 3 4 5

O comando cat sempre será iniciado no início de um arquivo.
O comando read (sem a opção -d definida para outra coisa de new line ( $'\n' )) obterá a primeira linha e sairá (fazendo com que o canal seja fechado) . / p>

Em um loop while , mesmo se a leitura existir, ainda haverá código a ser executado (while) que manterá o canal aberto para obter a próxima linha do comando cat .

$ cat /tmp/tt | while read tt; do echo $tt; done
1 2 3 4 5
6 7 8 9
10 11

[1] seu código deve limpar $tt , tente unset tt; cat /tmp/tt |{ read tt; echo "$tt"; } para confirmar.

    
por 10.02.2016 / 06:38

Tags