在Bash脚本中检测按键

时间:2016-02-16 10:15:31

标签: bash keyboard

在以下代码INS=\x1b\x5b\x32\x7e中,十六进制值对应插入键 是否存在与按键相对应的任何十六进制值列表?

1 个答案:

答案 0 :(得分:0)

Bash使用ANSI-C quoting,因此首先注意\x不是密钥代码的一部分,但用来表示以下字符是十六进制的1/2位代码。

让我们以\x1b\x5b\x32\x7e为例:

  • \x1bASCII escape codeESC

  • \x5b指的是角色[。在转义代码之后使用(所以ESC[),它与控制序列介绍者(CSI)一起形成。 CSI告诉终端将下一个参数解释为序列的一部分
    这用于(不全面)的特殊情况:
    INS DEL 结束 PgUp PgDn F6 F12
    为什么我们需要在这些特殊键上使用CSI?因为这些键使用 4到6位十六进制代码 - 所以它不能用单个\x00参数解释,它必须是一个序列。

  • \x32\x7e一起是控制序列,基本上被转换为2~,它引用 INS 命令。在ANSI standard for ASCII terminals中,前面列出的键由十进制代码和~\x7e)字符组合标识。在CSI序列中,操作由最后一个字符定义 - 在本例中为~,对应于"特殊键操作"。

让我们举一个例子来证明这一点:17~表示 F6 ,并使用the ASCII table翻译为\x31\x37\x7e

HEX  Chr
---  ---
31   1
37   7
7E   ~

所以,看起来不错 - 我们在添加CSI时有\x1b\x5b\x31\x37\x7e,这是bash中 F6 的有效代码 - 请参阅列出大部分特殊内容的this gist密码。

但是如何知道 F6 应该翻译成17~?通过查看ANSI code table,您会发现以下内容:

  

176 7E ~ DECKEYS通过特殊功能键发送

     

[1~=FIND, [2~=INSERT, [3~=REMOVE, [4~=SELECT, [5~=PREV, [6~=NEXT [11~=F1… [17~=F6…[34~=F20 ([23~=ESC,[24~=BS,[25~=LF,[28~=HELP,[29~=DO)

这并不完美,但是从这里你可以建立下表( 这是理论 ,可能需要一些验证):

+-----+------+-------------+-----------+------------+-------------------+
| Key | Code |     Hex     |    Key    |    Code    |        Hex        |
+-----+------+-------------+-----------+------------+-------------------+
| F6  | [17~ | 5B 31 37 7E | END       | [4~ OR [OF | 5B 34 7E OR 4F 46 |
| F7  | [18~ | 5B 31 38 7E | Home (⇱)  | [1~ OR [OH | 5B 31 7E OR 4F 48 |
| F8  | [19~ | 5B 31 39 7E | Page down | [6~        | 5B 36 7E          |
| F9  | [20~ | 5B 32 30 7E | Page up   | [5~        | 5B 35 7E          |
| F10 | [21~ | 5B 32 31 7E | Up        | [!         | 5B 41             |
| F11 | [23~ | 5B 32 33 7E | Down      | ["         | 5B 42             |
| F12 | [24~ | 5B 32 34 7E | Right     | [#         | 5B 43             |
| INS | [2~  | 5B 32 7E    | Left      | [$         | 5B 44             |
| DEL | [3~  | 5B 33 7E    |           |            |                   |
+-----+------+-------------+-----------+------------+-------------------+

对于大多数用途来说,这应该足够了。

请注意,这个答案是为了解释bash中的密钥的ANSI引用,由于缺乏关于此的文档,它可能不准确。