前提条件
Linux仮想端末(tty)はVT102-仮想端末サブシステムのソースコード。
本物VT100(ほぼ似ています。VT102)には次のような動作があります。
- 内部にワイヤーモードでは、入力したすべての文字が最初にコンピュータに送信され、次に端末に返されます。ホストから戻るまで端末画面には何も表示されません。
- エスケープシーケンスも例外ではありません。ホストから返された後にのみ解析され実行されます。つまり、フォントの色を赤に変更するには入力する必要があり、そのシーケンスはコンピュータに送信され、再び
ESC[0;31m
エコーされます。VT102これを受けて分析して適用してください。ターミナルフォントの色を変更する他の方法はありません(ワイヤーモデル)。わからないVT102フォントの色は異なりますが、これは単なる例です。
マニュアルの図:
マニュアルから抜粋:
ライン/ローカル
ライン/ローカル機能により、オペレータはターミナルをオンラインまたはローカル(オフライン)状態に簡単に切り替えることができます。端末がオンラインの場合(ON-LINEインジケータが点灯)、キーボードに入力されたすべての文字がコンピュータに直接送信され、コンピュータからのメッセージが画面に表示されます。 LOCALステータス(LOCALインジケータが点灯している)では、端末はコンピュータから電気的に切り離され、キーボードに入力された文字はコンピュータに直接送信または受信されません。
出典:VT100シリーズビデオターミナル技術マニュアル、第3版、1982年7月。
質問
Linuxが異なる動作をするのはなぜですかtty
?
bash
邪魔にならないように省電力モードに設定してからプレーンEsc[0;31m
テキストを入力してインポートすると、色は変わらないため、エスケープシーケンスは効果がありません。
数年前も同様の質問を受けました。キーボードではエスケープシーケンスを送信できませんが、なぜ他のttyでは送信できますか?しかし、今は理解できます。VT102Linuxサブシステムが実際のハードウェア端末とは異なり、なぜそのように動作するのか理解したいと思います。
答え1
まず、この質問はレトロコンピューティングしかし、コミュニティはこのサイトがこのサイトに適していると判断しました。しかし、コメントセクションで答えを得たので、ここにコピーしました。
Linux Virtual Consoleは、オンラインモードでLinux(シリアル)ttyデバイスに接続されている(一種の)VT102端末をエミュレートします。 Linux ttyドライバは通常エスケープされた制御文字をエコーしません。^[。 tty ドライバーがこれを実行したくない場合は、次のようにします。スティックトレキオ。さらに、実際のVT102端末は色をサポートせず、実際にはVT102と互換性がないため、Linux Virtual Consoleでは機能しません。
試してみましたが、stty -ctlecho
ほぼ予想通りに動作します。サブ問題は1つだけです。これが本当です。VT102人がエスケープシーケンスを押して入力を開始した後も表示される文字がないので、ESC人は盲目的に入力していますか?
答え2
非常に長い質問で簡素化されました。
Linux ttyが異なる動作をするのはなぜですか?
実はこれじゃない端末ただし、アプリケーション(例:シェル)文字がエコーされる内容と方法を制御します。あなたはそれを使用することができますstty
アプリケーションは一時的にターミナルモードを変更します(一部のシェルでは再び変更します)。たとえば、次のようになります。
stty -cooked
(「生」にすると、ターミナルドライバが邪魔になりません。)
答え3
...盲目的に入る
私の考えでは、私たちはかなり近いと思います。文書をとてもよく書いています。デモがありません!旧Qでキーボードからエスケープシーケンスを送信するダメなものだけ見せてくれますね! 2つのタイトルがありますか? ? ?もっと明確にできますか?そして私と同じスクリーンショットがあります(上記のリンクされた質問に対する私の答えにあります)。
誰も次のいずれかに入力しないでください。長い注文盲目的に。よく設定されたVTxxxには、CSが保存される特殊キーと特殊バインディング、シェル機能があります。これらのシステムでは、すべてが調整されます。 Linuxとxtermは標準に近い唯一のものなので、これを模倣しています。
しかし、そうです。 Esc キーは、次のキーが入力ではなくコマンドであることを意味します。したがって、誰かがバイトを予約し、事前定義されたシーケンスを確認する必要があります。
しかし、シーケンスが不可能になると、シェルはシャットダウンモードを終了して再びエコーを開始します。 Escを押して[を押してから1,1,1...を押すと、角かっこと2つの「1」が失われます。
Escapeの後に入力してみてください[32m
。 「m」が再び表示されます。これは、シェルがシーケンスを放棄したことを意味します。役に立たない^[[32は消えました。どこかから消えた。
bash / readlineをキャンセルしてttyを停止します。画面全体に色文字(太字、下線、点滅、見えない)を入れることができる子供用のおもちゃが残ります。
私はあなたの質問を理解できません。 」エコ「Escape Sequence」は、読み取りプロンプトで(abcを入力した後)左矢印を使用しようとしたときなど、表示に合わずに実際に反映されるシーケンスです。
$ read
abc^[[D
通常のプロンプトで「abc」と入力し、Escapeと入力し、盲目的に「[D」と入力すると、カーソルが左に移動します。矢印キーは生成するより簡単な方法です。
シーケンスに進むには、echo -e '\e...'
またはecho '^[...'
(ctrl-Vを使用)を使用します。このように、シェルはエスケープ文字を送信し、解釈(料理?)しません。
そして、あなたはCSをttyの顔に直接投げる方法stty -echoctl
も見つけました。sleep 1000
すみません:ttyドライバー顔。
[ここで-bash-is-sleeping-and-tty-offguard jpegの間、より良い色の変更が必要です...]