만약 내가한다면
$ cat > file.txt
텍스트 - -CtrlDCtrlD
질문 1: Enter를 누르지 않으면 왜 Ctrl-를 D두 번 눌러야 합니까?
만약 내가한다면
$ cat > file.txt
파밤프쉬 Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
$ cat > file.txt
빵야 빵야 빵야
Ctrl-Z
[2]+ Stopped cat > file.txt
$ cat file.txt
pa bam pshhh
두 번째 파일에는 왜 한 줄만 있습니까?
답변1
Unix에서 읽고 쓸 수 있는 대부분의 객체(일반 파일, 파이프, 터미널, 원시 디스크 드라이브)는 파일처럼 설계되었습니다.
프로그램은 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
.
답변2
Ctrl+ D가 해킹이기 때문입니다 .
Deep down, Ctrl+ D(불려도eof
특징)은 실제로 파일 끝을 의미하지 않습니다. 이는 "보류 중인 입력을 응용 프로그램에 즉시 보냅니다"를 의미합니다. 이는 실제로 대기 중인 입력과 개행 문자를 보내는 Ctrl+ M( )의 의미 에 가깝습니다 .eol
+ 바로 뒤(즉, 줄의 시작 부분) 또는 다른 +를 누르면 Ctrl보류 중인 입력이 비어 있습니다. 따라서 애플리케이션은 0바이트의 입력을 받습니다. 안에DCtrlMCtrlDread
호출 시 0바이트를 읽으면 파일 끝을 나타냅니다.
Ctrl+ 를 누르면 Z보류 중인 입력이 삭제됩니다. 따라서 +를 누르거나 +가 애플리케이션으로 전송되기 cat
전에 입력된 개행 문자 만 처리됩니다.CtrlDCtrlZ