上下の矢印キーを印刷してみてください。

上下の矢印キーを印刷してみてください。

私はこれを持っています:

下矢印キーを読みました。

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ライブラリを使用)。

関連情報