^M と \r が一貫して動作しないのはなぜですか?

^M と \r が一貫して動作しないのはなぜですか?

おそらく私の質問に間接的に答える答えがすでにあるかもしれませんが、その多くを読んでいますが、まだこの違いに対する満足のいく答えを見つけることができませんでした。

キャリッジリターンの元の意味は、昔ながらのテレプリンタに由来していました。これは、プリントヘッドを現在の行の左側に移動することを意味しました。現在行に書き続けると、すでに書いた内容を上書きします。今日、私たちは\r文字列に明示的に入力されたテキストシンボルを使用してこの動作を指定できます。たとえば、Pythonではを実行できprint('hello\rgoodbye')、端末ではを実行できます。両方のecho $'hello\rgoodbye'場合のみ表示されますgoodbye

逆に、疑似キャリッジリターンは、ASCII制御文字^MCtrl-Mまたはで入力)を使用してEnter対話的に挿入することもできます。キャリッジリターンとして広く知られていますが、驚くべきことに insert ではなく新しい行の記号である\rinsert であるため、擬似キャリッジリターンと呼ばれます。\n

したがって、インタラクティブな入力hello、then Ctrl-M、thenはgoodbye驚くほど同等の機能を持っていませんが、hello\rgoodbye同等の機能を持っていますhello\ngoodbye

これは矛盾しませんか?これの根拠は何ですか?

ベストアンサー1

これは端末入力処理の結果である。デフォルトでは、ターミナルデバイスドライバ(ターミナル自体ではなくターミナルの入力を処理するオペレーティングシステムカーネルのソフトウェア)は、以下をCtrlM実行CtrlJしてこれを確認できます。

od -t x1

次に2文字を入力します。

$ od -t x1
^M
^J
^D
0000000 0a 0a
0000002

^M(画面には背は表示されません。)

したがって、を入力すると、CtrlMどのプログラムが入力を処理するかに関係なく、キャリッジリターン文字ではなく改行文字が表示されます。

これは設定できますstty icrnl。バラよりReturn、Enter、stty icrlfについて学ぶ同様の質問については。

おすすめ記事