あるttyから別のttyに書き込む、設定をtty1
からtty2
に変更するなど、さまざまなトリックを実行して端末がどのように機能するかを理解しようとしています。また、エスケープシーケンスを送信して色を変更しようとしています。キーボードから直接。つまり、echo -e '\e[0;31m'
コマンドではなく、キーボードからの直接入力によるものです。動作しません。
私はこのステップを実行します:
tty1
とtty2
を開きますtty2
で、sleep 10m
によってbash
をスリープモードにします。 Word'one 'と入力します。tty1
に移動し、echo -n ^[[0;31m > /dev/tty2
を実行します。最初の文字^[
はこの方法で入力されます Ctrl + vEsctty2
に戻り、Word'two 'と入力します。はい-別のttyからのコマンドにより、色が赤に変更されました。tty
ではなく、キーボードから直接エスケープシーケンスを送信しようとしています-^[[0;37m
にtty2
と入力します。私はすべて同じようにしています- Esc ((Ctrl + v readlineがスリープしているため、必要ありません)、次に[0;37m
ですが、これを取得します。質問:なぜこのように機能するのですか?すべての文字が同じで、端末の状態は同じですが、ある場合には端末はエスケープシーケンスを取得し、別の場合には取得しません。
編集
質問はここで答えられました: エコーされたエスケープシーケンスはLinux ttyでは解釈されません 。
echo
を実行すると、outputが端末に送信されます。端末は、送信される出力の色を変更するようなエスケープシーケンスを解釈します。これらのエスケープシーケンスはアプリケーションによって送信されることを意図しているため、ターミナルで実行されているアプリケーションからの出力で認識されます。通常、ターミナルで実行されているアプリケーションは、ターミナルエミュレーター(シェル)によって開始されたアプリケーションであり、これによって順番に開始されますが、echo … >/dev/tty2
を実行すると、echo
は事実上「ターミナル」(出力がターミナルに送られるという意味で、ここで重要です)。
を押すと Esc[ など、inputを端末に送信しています。端末は、受信した入力の色を変更するようなエスケープシーケンスを解釈しません。端末は入力のエスケープシーケンスを解釈しますが、目的はまったく異なります。これは、ファンクションキーの押下をエンコードする方法です。
キーボード入力とテキスト出力はどのように機能しますか? いくつかの関連する背景があります。
これは、xorgのxtermでも機能します。
stty -echoctl
sleep <a bit>
次に、「デッド」ターミナルで、Escape
を直接押してから
[32m
次に押すキーはすでに緑色です。 ctrl-Cでスリープを解除すると、プロンプトはクリーンなままになります...
質問は非常に特殊なケースです。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