네 줄의 파일이 있습니다.
$ cat file
First line
Second line
Third line
Fourth line
$
이 파일을 네 번 읽을 때 항상 첫 번째 줄을 읽었는데, 이는 예상된 결과입니다.
$ for i in {1..4}; do read line <file; echo "$line" ; done
First line
First line
First line
First line
$
그러나 파일 설명자 3에 연결한 file
다음 동일한 방식으로 읽으면 각각의 읽기가 입력 스트림을 "먹습니다".
$ exec 3<file
$ for i in {1..4}; do read -u 3 line; echo "$line" ; done
First line
Second line
Third line
Fourth line
$
파일 설명자가 왜 이렇게 동작합니까?
답변1
다음과 같이 말하면 read var <file
명령이 완료된 후 파일 설명자가 닫힙니다. 따라서 다음에 루프를 통과할 때 파일 설명자는 처음으로 재설정됩니다.
이 경우 exec 3<file
읽기 read -r -u 3 var
명령이 완료되고 읽기 위치가 업데이트되더라도 파일 설명자는 계속 열려 있으므로 다음에 읽기는 다음 줄을 가져옵니다.
참고: 이 작업을 수행하더라도 여전히 비슷하게 작동합니다 exec 0<file
.read -r var
답변2
간단한 대답은 이것이 작동하는 방식이라는 것입니다. 파일 설명자에는 읽기 및 쓰기 위치를 포함하는 상태가 포함되어 있습니다. 파일 설명자에 대해 수행된 각 읽기는 이를 읽는 사람에 관계없이 읽기 위치를 이동합니다. 파일 설명자에는 하나의 읽기 위치만 포함됩니다.
즉, 파일 설명자가 운영 체제에 의해 생성될 때 이러한 상태 변수를 포함하는 구조/테이블도 생성됩니다. 테이블에는 읽기 위치의 복사본이 하나만 있으며 파일 설명자에서 read() 함수가 호출될 때마다 단일 읽기 위치 변수가 업데이트됩니다.