while 명령 뒤에 오는 명령을 어떻게 루프에서 실행할 수 있습니까?

while 명령 뒤에 오는 명령을 어떻게 루프에서 실행할 수 있습니까?
  1. while <command>while 루프 에서 <command>각 루프의 실행은 다른 루프와 독립적입니까?
  2. 아래 예에서 while 루프는 read파일의 모든 라인을 하나씩 읽을 수 있지만 while 루프가 없는 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
    

답변1

1분기

while <command>while 루프 에서 <command>각 루프의 실행은 다른 루프와 독립적입니까?

예, <command>실행된 루프의 모든 루프에서 실행됩니다 while.

실행되는 루프 수는 다른 루프도 입력을 소비하는 경우 다른 루프의 영향을 받습니다 stdin. 이 read명령은 stdin에서 읽습니다( -u nles 옵션을 사용하지 않는 한). 일부 다른 읽기는 동일한 입력을 소비할 수 있으며 이는 영향을 미칩니다.첫 번째 while반지 모양.

2분기

코드에 큰 버그가 있어서 새 코드입니다 [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여전히 실행할 코드가 있습니다(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"; }

답변2

read두 개의 출력 인스턴스가 있는 두 개의 명령줄이 있는 경우 cat이를 사용하는 방식으로는 첫 번째 줄만 읽을 수 있습니다. 왜냐하면 readSTDIN의 첫 번째 줄은 항상 동일한 내용을 갖기 때문입니다.

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"첫 번째 줄"이 아닌 "다음 줄"이 매번 읽혀집니다.

관련 정보