![bash はターミナルに改行 (\n) を復帰 (\r) に変換させますか?](https://rvso.com/image/111971/bash%20%E3%81%AF%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E3%81%AB%E6%94%B9%E8%A1%8C%20(%5Cn)%20%E3%82%92%E5%BE%A9%E5%B8%B0%20(%5Cr)%20%E3%81%AB%E5%A4%89%E6%8F%9B%E3%81%95%E3%81%9B%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
答え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
(復帰改行を入力する)。