![bash 是否使終端將換行符號 (\n) 轉換為回車符號 (\r)?](https://rvso.com/image/111971/bash%20%E6%98%AF%E5%90%A6%E4%BD%BF%E7%B5%82%E7%AB%AF%E5%B0%87%E6%8F%9B%E8%A1%8C%E7%AC%A6%E8%99%9F%20(%5Cn)%20%E8%BD%89%E6%8F%9B%E7%82%BA%E5%9B%9E%E8%BB%8A%E7%AC%A6%E8%99%9F%20(%5Cr)%EF%BC%9F.png)
答案1
Bash 已將終端更改為「原始」模式,這表示打字機字元不會以任何方式處理。 Enter 鍵產生回車符號 (\r),而不是換行符號 (\n),因此不會發生任何轉換。
答案2
生的和煮熟的模式是描述性術語。 stty raw
使用與 bash 不同的設定。
Bash 進行終端初始化準備終端設定(readline 庫的內部函數),設定終端模式以允許一次讀取單一字元而不回顯:
tiop->c_lflag &= ~(ICANON | ECHO);
然而,回車翻譯被重置為函數的不同部分:
/* Make sure we differentiate between CR and NL on input. */
tiop->c_iflag &= ~(ICRNL | INLCR);
如果你prepare_terminal_settings
比較核心工具stty
,後者的作用較少(有幾點,但 bashINLCR
也會重置):
else if (STREQ (訊息->名稱, "生") || STREQ (訊息->名稱, "熟")) { if ((info->name[0] == 'r' && 反轉) || (info->name[0] == 'c' && !reversed)) { /* 煮熟模式。 */ 模式->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL |伊克森; 模式->c_oflag |= OPOST; 模式->c_lflag |= ISIG |伊卡農; #如果 VMIN == VEOF 模式->c_cc[VEOF] = CEOF; #萬一 #如果 VTIME == VEOL 模式->c_cc[VEOL] = CEOL; #萬一 } 別的 { /* 原始模式。 */ 模式->c_iflag = 0; 模式->c_oflag &= ~OPOST; 模式->c_lflag &= ~(ISIG | ICANON #ifdef XCASE | XCASE #萬一 ); 模式->c_cc[VMIN] = 1; 模式->c_cc[VTIME] = 0; } }
POSIX 說的stty raw
:
啟用(停用)原始輸入和輸出。原始模式應等效於設定:
stty cs8 erase ^- kill ^- intr ^- \
quit ^- eof ^- eol ^- -post -inpck
-post
有趣的是(按照和的描述-inpck
)並沒有解決輸入上的回車轉換問題。
由於條款生的和煮熟的(POSIX 或 coreutils stty)與 bash 的功能不對應,提及與其實際功能相對應的 POSIX termios 功能是可行的方法:icrnl
(輸入回車換行翻譯)。