bashを使用すると、ターミナルは改行(\ n)をキャリッジリターン(\ r)に変換しますか?

bashを使用すると、ターミナルは改行(\ n)をキャリッジリターン(\ r)に変換しますか?

2つの端末を開き、上のcat端末から読むために下の端末で実行しました。

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

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

それでは、ラインフィード()をキャリッジリターン()にbash変換するように端末設定を変更するのはどうですか?\n\r

答え1

Bashは端末を「raw」モードに変更しました。これは、タイプライター文字が何らかの方法で処理されないことを意味します。 Enterキーは改行(\ n)ではなくキャリッジリターン(\ r)を生成するため、変換は発生しません。

答え2

生のそして料理スキーマは説明的な用語です。 stty rawbashとは異なる設定を使用してください。

端末初期化のための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、後者は少ない操作を行います(いくつかのポイントがありますが、bashINLCRもリセットされます)。

      else if (STREQ (情報->名前、"生") || STREQ (情報->名前、"調理済み"))
        {
          if((情報 - >名前[0] == 'r'&&リバース)
              || (情報->名前[0] == 'c' && ! 駅))
            {
              /*クッキングモード。 */
              モード - > c_iflag | = IGNPAR IXON |
              モード-> c_oflag |= OPOST;
              モード - > c_lflag | = ISIG | Ikanon;
#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キャリッジリターンと改行翻訳入力)。

関連情報