Ctrl+D 結束終端行輸入

Ctrl+D 結束終端行輸入

如果我做

$ cat > file.txt

文字Ctrl- DCtrl-D

問題1:如果我不按回車鍵,為什麼我必須按Ctrl-D兩次?

如果我做

$ cat > file.txt

pa bam pshhh 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行?

答案1

在 Unix 中,大多數可以讀寫的物件——普通檔案、管道、終端機、原始磁碟機——都被設計成類似於檔案。

一個程式像cat這樣從它的標準輸入中讀取:

n = read(0, buffer, 512);

需要 512 位元組。n是實際讀取的位元組數,如果發生錯誤則為 -1。

如果您對普通檔案重複執行此操作,您將獲得一堆 512 位元組的讀取,然後在檔案尾部讀取稍短的內容,如果您嘗試讀取超過檔案末尾,則讀取 0。因此,cat將運行直到nis <= 0。

從終端讀取略有不同。輸入一行後,Enter按鍵終止,read僅傳回該行。

您可以輸入一些特殊字元。一是Ctrl-D。當您鍵入此內容時,作業系統會將您鍵入的所有目前行(但不是其Ctrl-D本身)傳送到執行讀取的程式。這是一個偶然的事情:如果Ctrl-D是該行的第一個字符,程式將被發送一個長度為 0 的行 - 就像程式會查看它是否剛剛到達普通文件的末尾一樣。cat 不需要做任何不同的事情,無論是從普通檔案或終端機讀取。

另一個特殊字元是Ctrl-Z。當您在一行中的任何位置鍵入它時,作業系統會丟棄您在此之前鍵入的所有內容,並向程式發送 SIGTSTP 訊號,該程式通常會停止(暫停)它並將控制權傳回給 shell。

所以在你的例子中

$ 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是一個 hack。

在內心深處,Ctrl+ D(儘管被稱為eof特點)實際上並不意味著文件結束:它意味著「立即將待處理的輸入發送到應用程式」。這實際上接近Ctrl+ M( eol) 的含義,它會傳送待處理的輸入加上換行符號。

當您在+後(即在行首)或另一個+後立即按Ctrl+時,待處理的輸入為空。因此應用程式接收 0 位元組的輸入。在一個DCtrlMCtrlDread呼叫時,讀取 0 位元組表示檔案結束。


當您按Ctrl+時Z,待處理的輸入將被丟棄。因此,只有在按+之前cat輸入換行符號或Ctrl+已發送到應用程式的內容(即)才會被處理。DCtrlZ

相關內容