Terminal
為什麼 ^M 和 r 行為不一致?
也許已經有答案間接回答了我的問題,但我已經閱讀了其中的許多內容,但還沒有找到一個令人滿意的答案來解決這個差異。
輸入的本義來自舊的電傳列印機:它的意思是把列印頭移到目前行的左邊。如果你一直在目前行寫,你將覆蓋已經寫的內容。
\r
如今,我們可以使用在字元串中顯式鍵入的文本符號來指定此行為。例如,在 Python 中你可以做print('hello\rgoodbye')
,在終端裡你可以做echo $'hello\rgoodbye'
,在這兩種情況下你只會看到goodbye
.相反,偽輸入也可以與 ASCII 控製字元互動插入(使用或
^M
鍵入)。我稱它為偽輸入,因為儘管它被廣泛稱為輸入,但令人驚訝的是它並沒有 insert ,而是 insert ,這是一個新行的符號。Ctrl-M``Enter``\r``\n
因此,互動式輸入
hello
,然後Ctrl-M
,然後goodbye
,令人驚訝地沒有達到 的等價物hello\rgoodbye
,而是 的等價物hello\ngoodbye
。這不是很矛盾嗎?這背後的原因是什麼?
這是終端輸入處理的結果:預設情況下,終端設備驅動程序(作業系統核心中處理來自終端的輸入的軟體,而不是終端本身)轉換
Ctrl``M
為Ctrl``J
. 您可以通過執行看到這一點od -t x1
然後輸入兩個字元:
$ od -t x1 ^M ^J ^D 0000000 0a 0a 0000002
(您不會
^M
在螢幕上看到等。)因此,當您鍵入 時
Ctrl``M
,無論程序正在處理您的輸入,都不會看到輸入,而是看到換行符。這可以配置為
stty icrnl
. 有關類似問題,請參閱了解 Return、Enter 和 stty icrlf 。