Как команда выполняется после команды while, выполняемой над циклами?

  1. В while <command> часть цикла while, выполняется <command> в каждом цикле независимо от других циклов?
  2. В следующем примере, почему цикл while может read прочитанные все строки файла один за другим, а без цикла while read всегда читает первую строку файла в каждом повторении?

    Без использования цикла while можно read все строки файла один за другим?

     $ 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 

Когда у вас есть две команды с двумя экземплярами read выходов cat , тогда только первая строка может быть прочитана так, как вы использовали, потому что STDIN для read всегда будет иметь одно и то же содержимое с той же первой строкой.

Если вы будете читать содержимое одного выхода cat несколько раз, вы получите следующие строки, потому что STDIN для чтения не будет возвращен к исходной стартовой строке.

 $ 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 

Короче говоря: «(A) Если вы выполняете read один раз, дважды и три раза на одном и том же входе (STDIN), вы получите первую вторую и третью строки. (B) Если вы read много раз, но сбросите ввод для каждого read , то вы будете получать только одну и ту же первую строку много раз "

Дополнительная информация: «группируя» экземпляры read (слева от трубы), суб-оболочка держит трубку открытой. При использовании в while же время суб-оболочка держит трубку открытой. Следовательно, read будет читать «следующая строка» каждый раз, а не «первая строка».

Q1

В while <command> часть цикла while, выполняется <command> в каждом цикле независимо от других циклов?

Да, <command> будет выполнена для каждого цикла цикла while.

Сколько циклов выполняется, на них влияют другие циклы, если другие циклы также потребляют вход stdin . Команда read считывает из stdin (используется опция unles -un ). Некоторые другие чтения могут потреблять один и тот же вход, который будет влиять на первый цикл while.

Q2

Новый код, так как у вас большая ошибка [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 

Команда cat всегда будет начинаться с начала файла.
Команда read (без параметра -d установленного на что-то еще из new line ( $'\n' )), выберет первую строку и выйдет (заставив закрыть трубку) .

В цикле while, даже если чтение существует, есть еще код, который должен быть выполнен (время), которое будет держать канал открытым, чтобы получить следующую строку из команды cat .

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

[1] ваш код должен очистить $tt , попробуйте unset tt; cat /tmp/tt |{ read tt; echo "$tt"; } unset tt; cat /tmp/tt |{ read tt; echo "$tt"; } unset tt; cat /tmp/tt |{ read tt; echo "$tt"; } для подтверждения.