
如果我做
$ 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
將運行直到n
is <= 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
。