如何找出我的終端為 cat 不會顯示的某些特殊代碼發送的轉義碼?

如何找出我的終端為 cat 不會顯示的某些特殊代碼發送的轉義碼?

我想知道我的終端為 Ctrl+Backspace 和 Alt+Backspace 發送了什麼,執行此操作的標準方法是cat在終端機上運行並輸入內容通常可以工作,但是對於像這樣的某些輸出,結果很棘手。

我猜 Alt+Backspace 正在發送\x1b\x7f(即轉義退格鍵),但是如果我運行cat並鍵入 Ctrl+V 和 Alt+Backspace,或者只是 Alt+Backspace,會發生什麼情況,轉義符將被“鍵入”並且然後立即用退格鍵將其刪除,這樣看起來就好像什麼都沒發生一樣。我只有一次透過看到我的電腦渲染了逃脫的一幀^[而得到了線索。

到目前為止,我不確定如何計算 Ctrl+Backspace 發送的內容。即使兩者都在 bash 提示下刪除一個單詞,它也不是 Ctrl+W,因為在 bash 提示下cat什麼都不做,而 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 分秒)內不輸入任何內容即可停止。

例如,您可以替換cat -vteod -An -w1 -tu1 -tx1 -to1 -ta(假設 GNUod或相容)以十進制、十六進位、八進位或字元形式查看每個位元組值。

  27
  1b
 033
 esc
 127
  7f
 177
 del

答案3

我在其他地方發現了一個技巧,可以透過使用 來顯示 bash 中的單個字元read -rsn1 key && echo "$key" | xxd。這已經完成了 90%,但我在這個問題上停留了一段時間,因為我只會返回 0x1b(轉義),這並不是完整的情況。

然後我將其更改為,read -rsn2 key && echo "$key" | xxd並且可以擴展到轉義序列恰好有多少個字符,進行一點實驗就可以解決問題。所以在我的終端機上我有兩個都出於方便原因,Ctrl+ 和 Alt+Backspace 過去會對應到 0x1b、0x7f(元退格鍵,如果您願意的話)。我首先要走這條路,因為我想配置一個新的終端模擬器,讓我刪除兩個組合的單詞,但只有其中一個有效。 bash 中的bashread -rsn是一個很好的工具,可以進行比cat.

相關內容