while <command>
while 루프 에서<command>
각 루프의 실행은 다른 루프와 독립적입니까?아래 예에서 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 n
les 옵션을 사용하지 않는 한). 일부 다른 읽기는 동일한 입력을 소비할 수 있으며 이는 영향을 미칩니다.첫 번째 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
이를 사용하는 방식으로는 첫 번째 줄만 읽을 수 있습니다. 왜냐하면 read
STDIN의 첫 번째 줄은 항상 동일한 내용을 갖기 때문입니다.
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
"첫 번째 줄"이 아닌 "다음 줄"이 매번 읽혀집니다.