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중 하나는 드라이버 동작에 영향을주기 위해 터미널 장치에 발행됩니다.

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

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

$ 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.