터미널 라인 입력 종료를위한 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를 입력하면. ( exvi에서 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.