bash はターミナルに改行 (\n) を復帰 (\r) に変換させますか?

bash はターミナルに改行 (\n) を復帰 (\r) に変換させますか?

2 つのターミナルを開き、下のターミナルからcat上のターミナルからの読み取りを実行しました。

ここに画像の説明を入力してください

上記の端末では と入力しましたが、上記の端末はキーをキャリッジリターン ( ) として"Hello World<Enter>Bye"送信したようです。Enter\r

bashでは、ターミナルの設定を変更して、改行 ( \n) を復帰 ( \r)に変換するのでしょうか?

答え1

Bash はターミナルを「raw」モードに変更しました。つまり、入力文字はいかなる方法でも処理されません。Enter キーは改行文字 (\n) ではなく復帰文字 (\r) を生成するため、変換は行われません。

答え2

そして調理済みモードは説明的な用語です。bash stty rawとは異なる設定を使用します。

Bashはターミナルの初期化をターミナル設定を準備する(readline ライブラリの内部関数)、エコーなしで一度に 1 文字ずつ読み取ることができるように端末モードを設定します。

  tiop->c_lflag &= ~(ICANON | ECHO);

ただし、改行文字の変換はリセットされ、関数の異なる部分:

  /* Make sure we differentiate between CR and NL on input. */
  tiop->c_iflag &= ~(ICRNL | INLCR);

比較するprepare_terminal_settingsコアユーティリティstty後者はより少ないことを行います (いくつかのポイントがありますが、bash もリセットしますINLCR)。

      そうでない場合 (STREQ (info->name, "raw") || STREQ (info->name, "cooked"))
        {
          if ((info->name[0] == 'r' && 逆順)
              || (info->name[0] == 'c' && !逆順))
            {
              /* 調理モード。 */
              mode->c_iflag |= BRKINT | IGNPAR | ISTRIP | ICRNL | IXON;
              モード->c_oflag |= OPOST;
              モード->c_lflag |= ISIG |イカノン;
#VMIN == VEOFの場合
              モード->c_cc[VEOF] = CEOF;
#終了
#VTIME == VEOLの場合
              モード->c_cc[VEOL] = CEOL;
#終了
            }
          それ以外
            {
              /* 生のモード。 */
              モード->c_iflag = 0;
              モード->c_oflag &= ~OPOST;
              mode->c_lflag &= ~(ISIG | ICANON
#ifdef 例外
                                 | エックスケース
#終了
                );
              モード->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復帰改行を入力する)。

関連情報