네 줄이 포함된 파일이 있습니다.
$ 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
빠른 대답은 이것이 작동하도록 설계된 방식이라는 것입니다. 파일 설명자에는 읽기 및 쓰기 위치를 포함하는 상태가 포함되어 있습니다. 하나의 파일 설명자에서 수행되는 모든 읽기는 누가 읽고 있는지에 관계없이 읽기 위치를 이동합니다. 파일 설명자에는 하나의 읽기 위치만 포함됩니다.
다른 방법으로, (OS에 의해) 파일 설명자가 생성되면 이러한 상태 변수를 포함하는 구조체/테이블도 생성됩니다. 테이블에는 읽기 위치의 복사본이 하나만 있으며 파일 설명자에서 read() 함수가 호출될 때마다 단일 읽기 위치 변수가 업데이트됩니다.