私はこれを持っています:
下矢印キーを読みました。
abc@abc-ubuntu:~/bashpratice$ read -n 3 key
^[[Babc@abc-ubuntu:~/bashpratice$
私はそれを見つけることができた
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\['
[B
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\[B'
[B
しかし、エコキーは空白だけを印刷します。
abc@abc-ubuntu:~/bashpratice$ echo $key
abc@abc-ubuntu:~/bashpratice$
キーストロークをエコーすると、スペースだけが提供されるのはなぜですか?
答え1
端末にdownarrowと入力するとどうなりますか?
報告によると、+を入力するとxxd -p
次のようになります。↓return
xxd -p
^[[B
1b5b420a
下矢印キーを押すと、3つの文字シーケンスが生成されます。
- 最初は
\x1b
(別名エスケープ、参照man ascii
)ターミナルに次のようにエコーされます^[
。 - 2番目は
\x5b
、つまり[
、 - 3番目は
\x42
、つまりB
。
最後の文字は\x0a
改行文字だけです。
したがって、下向き矢印は端末にエコーされます^[[B
。実際、これは1b5b42
実際に読み取りプロセスに送信される16進数シーケンスに対応します。
実験情報
変数には16進数のシーケンスがkey
含まれています。1b5b42
確認する
echo -n "$key" | xxd -p
1b5b42
もちろん、16進数シーケンス(例えば)をgrep
キャプチャすることも可能です。5b42
[B
ただし、端末に何かを送信すると、エスケープ文字は\x1b
特殊なエスケープシーケンスの始まりとして解釈されます。例えば、\x1b[31m
ほとんどの端末で認識されるシーケンスは、「赤の前景色の使用」を意味する。自分で確認してください:
echo -e 'hello \x1b[31myou'
このシーケンスは現在の色を変更しますが、何も印刷しません。以下の内容も確認できます。
echo -e 'hello \x1b[Byou'
\x1b[B
端末が特殊シーケンスを「カーソルを1つ下に移動」と解釈するのがわかります。
そのため、echo $key
一部の空行を除いて、端末に直接何も表示されません。
— 1. なぜ印刷されるのか
分からない。設定結果が一部異なります。grep
[B
答え2
端末がキーコードに応答しません。これは通常、アプリケーションによって表示され解釈されます。アプリケーションはシーケンスを送信しcup
たり(カーソルを上にしたり)下げることができます(通常はncursesライブラリを使用)。