Ctrl-D (EOF)가 쉘을 종료하는 이유는 무엇입니까?


68

이 이스케이프 시퀀스를 입력하여 문자 그대로 "파일을 종료"합니까? 즉, 대화식 쉘 세션이 다른 파일 스트림과 같이 쉘에 의해 실제 파일 스트림으로 표시됩니까? 그렇다면 어떤 파일입니까?

아니면 Ctrl+ D신호가 자리 표시 자일 뿐입니 까? "사용자가 입력을 마치고 종료 할 수 있음"을 의미합니까?



6
참고로 bash에서는 set -o ignoreeof해당 동작을 변경하기 위해 할 수 있습니다 .
Keith

나는 같은 문제가 있었다. 내 실수는 실수로 konsole 프로필 바로 가기를 "Ctrl + d"에 할당했다는 것입니다. 나의 가장 자랑스러운 순간이 아닙니다.
브라이언 시몬 슨

답변:


78

^D문자 (라고도 \04또는 0x4로는 TRANSMISSION OF END 유니 코드)를위한 디폴트 값 eof커널 단말 또는 의사 단말 드라이버 특별 제어 문자 파라미터 (정확하게의 tty직렬 또는 의사 - 부착 회선 제어 tty 장치 ). 이것이 TCSETS / TCGETS에 전달 c_cc[VEOF]termios구조 ioctl중 하나는 드라이버 동작에 영향을주기 위해 터미널 장치에 발행됩니다.

그것들을 보내는 일반적인 명령 ioctlsstty명령입니다.

모든 매개 변수를 검색하려면 다음을 수행하십시오.

$ stty -a
속도 38400 보드; 줄 58; 열 191; 라인 = 0;
intr = ^ C; 종료 = ^ \; 지우기 = ^ ?; 죽이기 = ^ U; eof = ^ D ; eol = <undef>; eol2 = <undef>; swtch = <undef>; 시작 = ^ Q; 중지 = ^ S; susp = ^ Z; rprnt = ^ R; 웨 라제 = ^ W; 다음 = ^ V; 플러시 = ^ O;
최소 = 1; 시간 = 0;
-parenb -parodd cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon -ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten 에코 echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke

eof매개 변수는 터미널 장치가 icanon모드에 있을 때만 관련됩니다 .

이 모드에서 터미널 드라이버 (터미널 에뮬레이터가 아님) 는 문자 를 지우고 전체 줄을 지우는 입력 할 수 있는 매우 간단한 라인 편집기를 구현합니다 . 응용 프로그램이 터미널 장치에서 읽을 때까지는 아무것도 보이지 않습니다. 당신은 누르면 어떤 지점에서 반환을 마지막 포함한 전체 라인 문자 (기본적를, 터미널 드라이버는 또한 번역 에 터미널에 의해 전송 로 ).BackspaceCtrl-UReturnread()LFCRReturnLF

을 누르지 않고 지금까지 입력 한 내용을 보내려면 문자를 Enter입력 할 수 있습니다 eof. 터미널 에뮬레이터로부터 해당 문자를 수신하면, 터미널 드라이버 는 행 의 현재 내용을 제출 하여 그 행을 수행하는 응용 프로그램 read이 그대로 수신합니다 (그리고 후행 LF문자를 포함하지 않음 ).

현재 행이 비어 있고 응용 프로그램이 이전에 입력 한 행을 완전히 읽은 경우 read0 문자를 리턴합니다.

이는 파일 끝을 응용 프로그램으로 나타냅니다 (파일에서 읽을 때 더 이상 읽을 것이 없을 때까지 읽습니다). eof문자를 보내면 응용 프로그램에서 더 이상 입력을 사용할 수 없기 때문에 문자 라고합니다 .

이제 현대 쉘 은 터미널 드라이버 내장 터미널보다 훨씬 고급 인 icanon자체 라인 편집기 를 구현하기 때문에 프롬프트에서 터미널을 모드로 설정하지 않습니다 . 그러나 자신의 라인 편집기 에서 사용자를 혼란스럽게하지 않기 위해 ^D캐릭터 (또는 터미널 eof설정에 관계없이 )에 동일한 의미 ( eof)를 부여합니다.


나는이 주석이 Stephane에 의해 쓰여졌다는 것을 읽기 시작한 것을 알고 있었다. 나는 당신이 NYC에 있다면, 당신과 함께 점심을 먹고 당신의 두뇌를 선택하고 싶습니다.
Gregg Leventhal

@GreggLeventhal. 감사. 그래도 NYC에 갈 가능성은 매우 얇습니다.
Stéphane Chazelas

7 비트 ASCII
Bananguin

9

CTRL_D는 이것이 텍스트 스트림의 끝이라는 신호입니다. 파일을 끝내지 않고 입력 스트림을 입력하여 종료합니다. 또한 CTRL_D는 hexdump 도구로 찾을 수 있으므로 문자 또는 바이트를 나타내지 않습니다.

# cat >test.txt
asdf# hexdump -C test.txt 
00000000  61 73 64 66                                       |asdf|
00000004
# ll test.txt 
-rw-r--r-- 1 root root 4 Jan 21 11:55 test.txt

5
그리고 그것이 쉘을 끝내는 이유는 쉘이 기본적으로 입력을 받아들이고 그것을 처리하는 프로세스이기 때문입니다. 더 이상 입력이 올 것이라고 말하지 않으면 쉘이 더 이상 할 일이 없습니다.
Jenny D

나는 EOF 시퀀스가 ​​텍스트 파일에 포함되어 있지 않으며 읽을 데이터가 더 이상 없다는 것을보고하기 위해 OS에 의해 생성된다는 것을 알고 있습니다. 대화식 터미널 세션이 다른 파일 스트림과 마찬가지로 쉘에서 실제 파일 스트림으로 표시되는지 여부를 실제로 묻습니다.
Geeb

명확히하기 위해 원래 질문을 편집했습니다.
Geeb

2
예, bash로가는 스트림은 다른 스트림과 같습니다. CTRL_D는 입력 스트림이 끝났으며 bash가 종료 될 수 있음을 알립니다.
Thorsten Staerk
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.