cat が表示しない特定の特殊なエスケープ コードについて、端末が送信しているエスケープ コードを調べるにはどうすればよいですか?

cat が表示しない特定の特殊なエスケープ コードについて、端末が送信しているエスケープ コードを調べるにはどうすればよいですか?

Ctrl+Backspace と Alt+Backspace に対してターミナルが何を送信しているかを知りたいのですが、これを行う標準的な方法はcatターミナルで実行し、何かを入力すると通常は機能しますが、このような特定の出力では結果がわかりにくいです。

\x1b\x7fAlt+Backspaceで (つまり、エスケープ バックスペースが)送信されていると推測していますが、Ctrl+V と Alt+Backspace、または Alt+Backspace だけを入力して実行した場合、エスケープが「入力」されてからすぐにバックスペースとともに削除されるため、何も起こっていないように見えます。コンピューターがエスケープが存在するcat1 つのフレームをレンダリングしたのを見て、このことに気付いたのは 1 度だけです。^[

今のところ、Ctrl+Backspace が何を送信しているのか、よくわかりません。どちらも bash プロンプトで単語を削除しますが、catCtrl+W ではありません。Ctrl+W で単語が削除されている間、その下では何も行われていないからです。

答え1

次のコマンドを使用するだけです:

showkey -a

答え2

ではzsh、次のようになります:

$ STTY='raw -echo min 0 time 40' cat -vte
^[^?

または、以下を使用しますbash:

$ s=$(stty -g); stty raw -echo min 0 time 40; cat -vte; stty "$s"
^[^?

端末入力は送信時にそのまま表示され、 によってレンダリングされますcat -vte。停止するには、4 秒間 (40 デシ秒) 何も入力しないでください。

たとえば、各バイト値を 10 進数、16 進数、8 進数、または文字として表示するには、を(GNUまたは互換)cat -vteに置き換えることができます。od -An -w1 -tu1 -tx1 -to1 -taod

  27
  1b
 033
 esc
 127
  7f
 177
 del

答え3

私は、 を使用して bash で 1 つの文字を表示するトリックを別の場所で見つけましたread -rsn1 key && echo "$key" | xxd。 これは 90% の道のりでしたが、0x1b (Escape) が返されるだけで、全体像がわからなかったため、しばらくこの作業に行き詰まりました。

その後、これをread -rsn2 key && echo "$key" | xxd次のように変更しました。エスケープシーケンスに何文字あるかに応じて、少し実験してみるとうまくいきます。私の端末では、両方Ctrl+ および Alt+Backspace は、以前は利便性のために 0x1b、0x7f (いわゆるメタバックスペース) にマップされていました。私がこの道を進むことになったのは、新しいターミナル エミュレーターを設定して、両方の組み合わせで単語を削除できるようにしたいのですが、そのうちの 1 つしか機能しないからです。bashread -rsnの は、 よりも低レベルの出力デバッグを行うのに適したツールですcat

関連情報