キーボードではエスケープシーケンスを送信できませんが、なぜ他のttyでは送信できますか?

キーボードではエスケープシーケンスを送信できませんが、なぜ他のttyでは送信できますか?

私は、あるttyから別のttyへの書き込み、設定の変更tty1などのさまざまなトリックを実行して、端末がどのように機能するかを理解しようとしています。tty2また、キーボードから直接エスケープシーケンスを送信して色を変更してみました。つまり、echo -e '\e[0;31m'コマンドを通すのではなく、直接キーボード入力を介することです。これはうまくいきません。

私は次の手順を実行します。

  1. tty1開いてtty2
  2. スリープモードに入ってtty2いるときにを押します。 「一つ」という単語を入力してください。bashsleep 10m

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

  1. 行ってtty1みてくださいecho -n ^[[0;31m > /dev/tty2。最初の文字^[はこのように入力されますCtrl+v Esc
  2. 戻ってtty2「two」という単語を入力してください。はい - 他のttyのコマンドで色が赤に変わりました。

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

  1. 手順3、4を繰り返しますが、緑色と「3」という単語を使用してください。

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

  1. 最後に、別の文字列を介してエスケープシーケンスを送信せずにttyキーボードから直接^[[0;37m入力して、すべての tty2操作を同じ方法で実行しましたEsc(readlineがスリープモードなので、+は必要ありませんCtrl)。しかし、次のようになりました。v[0;37m

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

質問: なぜこれが起こるのですか?すべての文字は同じで、端末の状態は同じですが、ある場合は端末がエスケープシーケンスを取得し、他の場合はそうではありません。


編集する

この質問に対する答えは次のとおりです。Linux ttyで解釈されないエコーエスケープシーケンス

答え1

を実行するとecho送信されます。出力ターミナルに行きます。端末は、送信された出力の色を変更するなどのエスケープシーケンスを解釈します。これらのエスケープシーケンスはアプリケーションから送信するためのものなので、端末で実行されているアプリケーションの出力から認識されます。通常、ターミナルで実行されるアプリケーションはターミナルエミュレータ(シェル)によって起動され、順番に起動されるアプリケーションですが、実行すると実際には「echo … >/dev/tty2ターミナルechoで実行中」です(一種の出力がターミナルに渡されることが重要です。)

などを押すとEsc [送信されます入力するターミナルに行きます。端末は、受信する入力の色を変更するなど、エスケープシーケンスを解釈しません。端末は入力のエスケープシーケンスを解釈しますが、まったく異なる目的で使用されます。これはファンクションキーの押し方をエンコードする方法です。

キーボード入力とテキスト出力はどのように機能しますか?関連する背景知識が必要です。

答え2

これはxorgのxtermでも機能します。

stty -echoctl
sleep <a bit>

Escapeその後、「死んだ」端末で「次へ」をクリックします。

[32m

次に押すキーはすでに緑色です! Ctrl-Cを使用してスリープモードを終了すると、プロンプトはそのまま残ります。

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

この質問は非常に具体的なケースです。 readline/bash が昏睡状態にある間にキーボードから画面にエスケープシーケンスをこっそり送る方法です。

通常のechoctl / ctlechoを使用すると、シェルがsleepキーを押す(入力)をエコーし​​た後、^[Escキー(出力)が画面のように直接エコーされます。 「CSI(Control Sequence Introducer)」の特別な意味が消えました。

それでは(受け取った)答えが間違っていませんか?


ここでは、行の編集を中断して続行しないことを決定したように、Ctrl-Cを押してカーソルを「行」の「l」の上に置きます。

$  weird -cmd ^Cne
$  stty -echoctl
$  weird -cmd line
$  # nice but now it looks like it got exec'd

これがstty echoctlオプションの主な目的のようです。

EscapePressがakaの略であることに気づきました。したがって、ttyがシーケンスを待たずにすぐに^ [文字をECHOすることは論理的です。通常のechoctlが開かれると、echoctlなしでHomeキーが生成されます。つまり、その後、Homeキーがカーソルを配置します。control-[^[sleep^[[Hstty -echoctl左上私のxterm画面!

(Bashが目を覚ますと、Homeキーが機能します。行を始めます。)

これらの2bind -p行は組み込み/terminfo xtermです:

"\eOH": beginning-of-line
"\e[H": beginning-of-line

関連情報