터미널 라인 입력 종료를위한 Ctrl + D


21

만약 내가한다면

$ cat > file.txt

텍스트 Ctrl- DCtrl-D

질문 1 : Enter 키를 누르지 않으면 왜 Ctrl-을 D두 번 눌러야합니까?

만약 내가한다면

$ cat > file.txt

펜실바니아 빵의 pshhh Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
$ cat > file.txt

pa bam pshhh

Ctrl-Z

[2]+  Stopped         cat > file.txt
$ cat file.txt
pa bam pshhh

한 줄로 파일이 두 번째 인 이유는 무엇입니까?


2
stackexchange sites 우산 아래 의이 스레드는 당신이보고있는 답변을 가지고 있습니다 : stackoverflow.com/questions/7369170/… . 도움이 되길 바랍니다.

예, 파이썬과 관련이 없지만 내 질문은 중복됩니다.
— 안개

ctrl-z를 입력하면 실제로 새로운 쉘 프롬프트가 표시 cat됩니까 , 아니면 중지 중이 라는 메시지 가 표시됩니까?
— Mark Plotnick

질문을 업데이트하겠습니다
— mist

답변:


30

유닉스에서 읽고 쓸 수있는 대부분의 객체 (일반 파일, 파이프, 터미널, 원시 디스크 드라이브)는 모두 파일과 유사하게 만들어집니다.

다음과 같은 프로그램 cat은 표준 입력에서 읽습니다.

n = read(0, buffer, 512);

512 바이트를 요청합니다. n실제로 읽은 바이트 수이거나 오류가있는 경우 -1입니다.

일반 파일을 사용하여이 작업을 반복적으로 수행하면 512 바이트의 읽기가 발생하고 파일의 끝에서 읽기가 다소 짧아지고 파일의 끝을지나 읽으려고하면 0이됩니다. 따라서 <= 0이 cat될 때까지 실행됩니다 n.

터미널에서 읽는 것은 약간 다릅니다. Enter키로 끝나는 줄을 입력하면 read해당 줄만 반환합니다.

입력 할 수있는 특수 문자가 몇 가지 있습니다. 하나는 Ctrl-D입니다. 이것을 입력하면 운영 체제는 입력 한 모든 현재 행 ( Ctrl-D자체가 아닌 )을 읽기를 수행하는 프로그램으로 보냅니다 . 그리고 다음은 고요한 일입니다. Ctrl-D줄의 첫 번째 문자 인 경우 프로그램은 일반 파일의 끝 부분에 도달했는지 확인하는 것처럼 길이가 0 인 행을 전송합니다. 일반 파일에서 읽든 터미널에서 읽든 상관없이 cat 다르게 할 필요는 없습니다 .

또 다른 특수 문자는 Ctrl-Z입니다. 라인의 어느 곳에서나 입력하면, 운영 체제는 그 시점까지 입력 한 모든 것을 버리고 SIGTSTP 신호를 프로그램에 전송합니다.이 신호는 보통 프로그램을 중지 (일시 정지)하고 제어를 쉘로 리턴합니다.

예를 들어

$ cat > file.txt
pa bam pshhh<Ctrl+Z>
[2]+  Stopped         cat > file.txt

버린 일부 문자를 입력 한 후 cat출력 파일에 아무것도 쓰지 않고 중지되었습니다.

$ cat > file.txt
pa bam pshhh
<Ctrl+Z>
[2]+  Stopped         cat > file.txt

한 줄을 입력 cat하여 출력 파일 을 읽고 쓴 다음 Ctrl-Z중지되었습니다 cat.


1
이것들은 표준 모드 터미널 에서만 적용 됩니다 . 이 경우에도 변경 될 수 있습니다.
— mikeserv

@mikeserv 사실입니다. 여기서는 OP가 무엇을보고 있는지 설명하고 싶었습니다. 나는 raw / icanon 터미널 모드, 다른 특수 문자, 사용자 정의 방법, OS에 따라 어떻게 다른지 등을 설명하는 것을 고려했지만 너무 오래 대답하고 싶지 않았습니다.
— Mark Plotnick

위의 내용은 입력이 진행되지 않으면 cat키보드에서 데이터를 읽고 처음으로 read0을 산출 하지 않은 프로그램 이 계속 진행될 수 있음을 의미하며 필요한 control-D의 수는 다음과 같이 결정됩니다. 프로그램이 결정을 내리는 데 필요한 연속 0의 수는?
— supercat

@supercat 원하는 경우 프로그램이 계속 읽을 수 있습니다. 에서 ex편집기, 당신은 행의 첫 번째 문자 편집기 쇼 당신에게 프로그램이 아닌 종료 몇 줄로 제어-D를 입력하면. ( ex및 vi에서 Control-D는 "아래로"의 니모닉입니다.) 많은 쉘에서 Control-D를 입력하지만 백그라운드에서 작업이 실행되면 쉘은 종료하지 않고이를 알려줍니다. 그러나 Control-D를 다시 입력하면 쉘은 실제로 종료하고 싶다고 결정합니다. 그렇게 할 것입니다.
— Mark Plotnick

@MarkPlotnick :이 0 바이트 딸꾹질이 파이프를 통해 전송 될 수있는 방법이 있습니까?
— supercat

19

Ctrl+ D는 해킹 이기 때문 입니다.

깊게 내려가는 Ctrl+ D( eof문자 라고하더라도 )는 실제로 파일 끝을 의미하지는 않습니다. "현재 보류중인 입력을 응용 프로그램에 보내기"를 의미합니다. 이것은 실제로 Ctrl+ M( eol) 의 의미에 가깝습니다 . 보류중인 입력과 개행을 보냅니다.

당신이 키를 누르면 Ctrl+ D즉시 후 Ctrl+ M(행의 시작 부분에서 IE) 또는 다른 후 Ctrl+ D, 대기중인 입력이 비어 있습니다. 따라서 응용 프로그램은 0 바이트의 입력을받습니다. A의 read전화, 0 바이트를 읽는 파일의 끝을 알립니다.


Ctrl+ 를 누르면 Z보류중인 입력이 삭제됩니다. 따라서 단지 이미 애플리케이션 (인 전송되었던 어떤 cat개행을 입력하거나함으로써) Ctrl+ D누르기 전에 Ctrl+하는 것은 Z처리된다.


1
Gille의 답변 중 하나에서 ctrl + D에 대한 자세한 내용은 여기를 참조하십시오 .
— Ramesh

말했듯이 Ctrl-D는 파일 끝을 의미하지 않습니다. 사실 Ctrl-D가 EOT (텍스트 끝)이기 때문에 그런 의미는 아닙니다.
— H2ONaCl
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.