이 두 "cat" 명령의 결과가 다른 이유는 무엇입니까?

이 두 "cat" 명령의 결과가 다른 이유는 무엇입니까?

infile에 특정 텍스트가 포함되어 있다고 가정하면 다음 명령 세트를 실행합니다.

구현하다3<infile

고양이-n<&3

고양이-n<&3

cat의 첫 번째 인스턴스는 파일의 내용을 표시하지만 두 번째 인스턴스에서는 아무 작업도 수행하지 않는 것 같습니다. 왜 다른가요?

답변1

동일한 명령처럼 보이지만 서로 다른 이유는 첫 번째 명령의 결과로 시스템 상태가 변경되었기 때문입니다. 구체적으로 첫 번째 파일이 cat전체 파일을 소비하므로 두 번째 파일에는 cat읽을 내용이 남아 있지 않고 즉시 EOF(파일 끝)에 도달한 후 종료됩니다.

그 이유는 두 호출 모두에서 정확히 동일한 파일 설명을 사용하고 있기 때문입니다( exec < infile만들고 파일 설명자에 할당한 파일 설명을 사용함). 열린 파일 설명과 관련된 것 중 하나는 파일 오프셋입니다. 따라서 첫 번째는 끝에 오프셋을 유지하면서 전체 파일을 읽고, 두 번째는 파일의 끝부터 읽으려고 시도하지만 읽을 내용을 찾지 못합니다.3catcat

답변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/3open("/dev/fd/3")

관련 정보