私は、あるttyから別のttyへの書き込み、設定の変更tty1
などのさまざまなトリックを実行して、端末がどのように機能するかを理解しようとしています。tty2
また、キーボードから直接エスケープシーケンスを送信して色を変更してみました。つまり、echo -e '\e[0;31m'
コマンドを通すのではなく、直接キーボード入力を介することです。これはうまくいきません。
私は次の手順を実行します。
tty1
開いてtty2
- スリープモードに入って
tty2
いるときにを押します。 「一つ」という単語を入力してください。bash
sleep 10m
- 行って
tty1
みてくださいecho -n ^[[0;31m > /dev/tty2
。最初の文字^[
はこのように入力されますCtrl+v Esc - 戻って
tty2
「two」という単語を入力してください。はい - 他のttyのコマンドで色が赤に変わりました。
- 手順3、4を繰り返しますが、緑色と「3」という単語を使用してください。
- 最後に、別の文字列を介してエスケープシーケンスを送信せずに
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オプションの主な目的のようです。
Escape
Pressがakaの略であることに気づきました。したがって、ttyがシーケンスを待たずにすぐに^ [文字をECHOすることは論理的です。通常のechoctlが開かれると、echoctlなしでHomeキーが生成されます。つまり、その後、Homeキーがカーソルを配置します。control-[
^[
sleep
^[[H
stty -echoctl
左上私のxterm画面!
(Bashが目を覚ますと、Homeキーが機能します。行を始めます。)
これらの2bind -p
行は組み込み/terminfo xtermです:
"\eOH": beginning-of-line
"\e[H": beginning-of-line