bash 是否使終端將換行符號 (\n) 轉換為回車符號 (\r)?

bash 是否使終端將換行符號 (\n) 轉換為回車符號 (\r)?

我打開了兩個終端,並從下面的終端執行cat從上面的終端讀取:

在此輸入影像描述

在上面的終端機中我輸入"Hello World<Enter>Bye",但看起來上面的終端將Enter密鑰作為回車符 ( \r) 發送。

那麼是否bash更改終端的設定以使其將換行符號 ( \n) 轉換為回車符 ( \r) 呢?

答案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輸入回車換行翻譯)。

相關內容