infile에 특정 텍스트가 포함되어 있다고 가정하면 다음 명령 세트를 실행합니다.
구현하다
3<infile
고양이-n
<&3
고양이-n
<&3
cat의 첫 번째 인스턴스는 파일의 내용을 표시하지만 두 번째 인스턴스에서는 아무 작업도 수행하지 않는 것 같습니다. 왜 다른가요?
답변1
동일한 명령처럼 보이지만 서로 다른 이유는 첫 번째 명령의 결과로 시스템 상태가 변경되었기 때문입니다. 구체적으로 첫 번째 파일이 cat
전체 파일을 소비하므로 두 번째 파일에는 cat
읽을 내용이 남아 있지 않고 즉시 EOF(파일 끝)에 도달한 후 종료됩니다.
그 이유는 두 호출 모두에서 정확히 동일한 파일 설명을 사용하고 있기 때문입니다( exec < infile
만들고 파일 설명자에 할당한 파일 설명을 사용함). 열린 파일 설명과 관련된 것 중 하나는 파일 오프셋입니다. 따라서 첫 번째는 끝에 오프셋을 유지하면서 전체 파일을 읽고, 두 번째는 파일의 끝부터 읽으려고 시도하지만 읽을 내용을 찾지 못합니다.3
cat
cat
답변2
@jw013의 좋은 답변에 추가하면 그것이 관련이 있다는 것을 깨닫는 데 도움이 될 수 있습니다.
{
cat -n
cat -n
} < infile
< file
예, 약어입니다 0< file
. 즉, 3 대신 파일 설명자 0을 사용합니다.
좀 혼란스럽게 만들기 위해 이 버전은 다음과 같습니다.
exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3
동작은 실행 중인 운영 체제에 따라 다르며,유형( infile
일반 파일 vs 파이프 vs 장치...)
Solaris와 대부분의 상용 Unices에서 an은 open("/dev/fd/3")
a와 어느 정도 동일 합니다 dup(3)
(따라서 May < /dev/fd/3
동일<&3
와/dev/fd/3
open("/dev/fd/3")