Unixのターミナルは、非常に複雑な獣です。 Posixには、機能のpretty thorough descriptionが含まれています。以下は簡単な要約です。
通常、端末入力デバイスは「標準」モードで動作します。このモードでは、ターミナル・ドライバはライン・バッファを維持し、必要に応じてユーザ入力を読み取ることによってそれを満たす。バッファが空になり、プログラムによってさらに多くのデータが要求された場合、ドライバはプログラムにデータを追加する前に入力行全体を読み込みます。したがって、バッファが空の場合、getc
でも1文字を読み取ると、getc
が返される前に、端末ドライバのバッファに全体が読み込まれます。
ドライバが入力文字を読み取るときに、特定の特殊文字がないかどうかをチェックします。何か他のものがラインバッファに加えられ、端末装置にエコーされる。 (端末装置への入力と出力は独立しているので、ドライバやプログラムが入力をエコーしなかった場合は画面上に何も表示されないので、通常混乱します。例)
すべての特殊文字は設定可能です。かなりの数があります。ここでは、より一般的なもののいくつかされています
- バッファに改行文字挿入を入力し、保留中の読み取りが返すように入力行を終了します。
- Ctrl-D(
EOF
)文字自体は破棄されますが、入力が終了し、保留中の読込みが返されます。入力バッファが空の場合(Ctrl-Dがラインの先頭で押された場合)、ゼロ長のバッファが保留中の読み込みに返され、ファイルマーカーの終わりとして解釈されます。
- Bksp(
ERASE
)入力バッファが空でない限り、入力バッファから最後の文字を削除し、画面から消去します。
- Ctrl-C(
INTR
)SIGINT
をプロセスに送信します。
- Ctrl-Z(
SUSP
)SIGTSTP
をプロセスに送信します。
- Ctrl-U(
KILL
)入力バッファ全体を削除します。
- Ctrl-S(
STOP
)出力を停止します。
- Ctrl-Q(
START
)STOP
文字で停止した場合は出力を再開します。
Linuxの端末ドライバは文字をエコーされた場合、それは通常、エコー制御文字(ASCIIコードが0x20の未満である文字)は、そのコード0x40の高い文字が続くキャレット(^)とし、これ通常は手紙です。 ESC
文字にはコード0x1Bが含まれているため、通常はキャレットとしてエコーされ、その後に0x5Bという文字が続きます。これは角カッコが開きます。したがって、通常、ESC
は^[
とエコーされます。キーボード上の
多くのキーは、実際には複数の文字を送信し、ほぼすべてのこれらの配列のは、[ESCで始まります。上矢印は、例えば、コードESC[を送り、そしてあなたは、カーソルの移動文字を処理しない素朴なプログラムを実行している場合ので、あなたは上矢印キーを押したときに^[[A
がエコー表示されます。
表示される文字は、Unicodeグリフに対応しない文字を表示する方法の1つです。このボックスには、Unicodeコードポイントに対応する4桁の16進数(この場合U + 001B、ESC
文字)が含まれています。なぜこのようなことが起こったのか分かりませんが、ターミナルエコーに寄与するさまざまなコンポーネント間の競合状態の結果である可能性が最も高いです。
unix.stackexchange.comの方が適しているので、この質問を議論の対象外とすることにしました。 – chepner