web-dev-qa-db-ja.com

キーボードからエスケープシーケンスを送信できないのに、別のttyから送信できるのはなぜですか?

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

私はこのステップを実行します:

  1. tty1tty2を開きます
  2. tty2で、sleep 10mによってbashをスリープモードにします。 Word'one 'と入力します。

enter image description here

  1. tty1に移動し、echo -n ^[[0;31m > /dev/tty2を実行します。最初の文字^[はこの方法で入力されます CtrlvEsc
  2. tty2に戻り、Word'two 'と入力します。はい-別のttyからのコマンドにより、色が赤に変更されました。

enter image description here

  1. 手順3、4を繰り返しますが、緑色と単語「3」を使用します

enter image description here

  1. そして最後に、別のttyではなく、キーボードから直接エスケープシーケンスを送信しようとしています-^[[0;37mtty2と入力します。私はすべて同じようにしています- Esc ((Ctrlv readlineがスリープしているため、必要ありません)、次に[0;37mですが、これを取得します。

enter image description here

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


編集

質問はここで答えられました: エコーされたエスケープシーケンスはLinux ttyでは解釈されません

3
MiniMax

echoを実行すると、outputが端末に送信されます。端末は、送信される出力の色を変更するようなエスケープシーケンスを解釈します。これらのエスケープシーケンスはアプリケーションによって送信されることを意図しているため、ターミナルで実行されているアプリケーションからの出力で認識されます。通常、ターミナルで実行されているアプリケーションは、ターミナルエミュレーター(シェル)によって開始されたアプリケーションであり、これによって順番に開始されますが、echo … >/dev/tty2を実行すると、echoは事実上「ターミナル」(出力がターミナルに送られるという意味で、ここで重要です)。

を押すと Esc[ など、inputを端末に送信しています。端末は、受信した入力の色を変更するようなエスケープシーケンスを解釈しません。端末は入力のエスケープシーケンスを解釈しますが、目的はまったく異なります。これは、ファンクションキーの押下をエンコードする方法です。

キーボード入力とテキスト出力はどのように機能しますか? いくつかの関連する背景があります。

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

stty -echoctl
sleep <a bit>

次に、「デッド」ターミナルで、Escapeを直接押してから

[32m

次に押すキーはすでに緑色です。 ctrl-Cでスリープを解除すると、プロンプトはクリーンなままになります...

enter image description here

質問は非常に特殊なケースです。readline/ bashが昏睡状態にあるときに、キーボードから画面にエスケープシーケンスを忍び込む方法です。

通常のechoctl/ctlechoでは、sleepの後、シェルはキーを押すとエコーします(入力)が、画面に^[として直接エスケープキーをエコーし​​ます(出力)。 '制御シーケンスイントロデューサ(CSI)としての特別な意味が失われます。

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


ここでは、「line」の「l」にカーソルを置いてctrl-Cを押すと、中止して行の編集を続行しないことにしたかのようになります。

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

これは、このsttyechoctlオプションの主な効果のようです。

Escapeプレスはcontrol-[別名^[の略であることに気づきました。したがって、ttyが^ [charをすぐにエコーし、シーケンスを待たないのは論理的です。通常のechoctlがオンのsleepの後、Homeキーは^[[Hを生成します。 echoctlがない場合、つまりstty -echoctlの後に、ホームキーが...カーソルをxterm画面の左上に置きます!

(bashが起動している場合、ホームキーは機能します:行の先頭。)

これらの2つのbind -p行は組み込み/ terminfoxtermです。

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