infile에 특정 텍스트가 포함되어 있다고 가정하고 다음 명령 세트를 실행해야합니다.
exec
3<infile
고양이 -n
<&3
고양이 -n
<&3
cat의 첫 번째 인스턴스는 파일의 내용을 표시하지만 두 번째는 아무것도하지 않는 것 같습니다. 왜 다른가요?
답변
그것들은 같은 명령처럼 보이지만 다른 이유는 첫 번째 명령의 결과로 시스템 상태가 변경 되었기 때문입니다. 특히 첫 번째 cat
파일은 전체 파일을 소비하므로 두 번째 파일 cat
은 읽을 항목이없고 EOF (파일 끝)에 즉시 도달 한 후 종료됩니다.
그 이유는 두 가지 호출 모두에 대해 정확히 동일한 파일 설명 (파일 디스크립터로 작성 exec < infile
하고 파일 디스크립터에 지정한 설명 3
)을 사용하기 때문입니다 cat
. 열린 파일 설명과 관련된 것 중 하나는 파일 오프셋입니다. 따라서 첫 번째 cat
파일은 전체 파일을 읽고 마지막에는 오프셋을 남겨두고 두 번째 파일은 파일 끝에서 가져 오려고하지만 읽을 것이 없습니다.
답변
@ jw013의 훌륭한 답변에 추가하면 다음과 동일하다는 것을 깨닫는 데 도움이 될 수 있습니다
{
cat -n
cat -n
} < infile
< file
의 약자입니다 0< file
. 즉 3 대신 파일 설명자 0을 사용합니다.
그리고이 문제를 조금 혼란스럽게하기 위해이 버전 :
exec 3< infile
cat -n /dev/fd/3
cat -n /dev/fd/3
동작 해가 다르게 당신이 그것을 실행되는 OS와에 따라 종류 의 infile
(장치 대 파이프 대 일반 파일 …)
Solaris 및 대부분의 상용 유닉스에, 만일이 open("/dev/fd/3")
더 많거나 적은 동등한 것입니다 dup(3)
(그래서 < /dev/fd/3
같은 관한 <&3
리눅스, 일반 파일, 동안) /dev/fd/3
원본 파일에 대한 심볼릭 링크로 구현되어 있으므로, open("/dev/fd/3")
(처음부터 새롭게을 엽니 다 그리고 아마도 fd와 다른 플래그로 3).