Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash:检测按键:如何读取特殊的键十六进制序列(如Insert)以及为什么它是'\x1b\x5b\x32\x7e';(插入)?_Bash_Shell_Terminal_Keyboard_Xterm - Fatal编程技术网

Bash:检测按键:如何读取特殊的键十六进制序列(如Insert)以及为什么它是'\x1b\x5b\x32\x7e';(插入)?

Bash:检测按键:如何读取特殊的键十六进制序列(如Insert)以及为什么它是'\x1b\x5b\x32\x7e';(插入)?,bash,shell,terminal,keyboard,xterm,Bash,Shell,Terminal,Keyboard,Xterm,在《高级Bash脚本指南》一书中。整个代码可在上查看。在这个示例中,有一些代码片段我不理解 第一段: # Convert the separate home-key to home-key_num_7: if [ "$key" = $'\x1b\x4f\x48' ]; then key=$'\x1b\x5b\x31\x7e' # Quoted string-expansion construct. fi # Convert the separate end-key to e

在《高级Bash脚本指南》一书中。整个代码可在上查看。在这个示例中,有一些代码片段我不理解

第一段:

# Convert the separate home-key to home-key_num_7:
if [ "$key" = $'\x1b\x4f\x48' ]; then
    key=$'\x1b\x5b\x31\x7e'
    #   Quoted string-expansion construct.
fi

# Convert the separate end-key to end-key_num_1.
if [ "$key" = $'\x1b\x4f\x46' ]; then
    key=$'\x1b\x5b\x34\x7e'
fi

$'\x1b\x5b\x32\x7e')  # Insert
    echo Insert Key
    ;;
在上面的代码片段中,例如,当我按Home键和Insert键时

  • 为什么它会为Home生成
    \x1b\x4f\x48
    序列,为Insert生成
    \x1b\x5b\x32\x7e
    序列
  • 评论说“将单独的主密钥转换为主密钥_num_7”和“将单独的结束密钥转换为结束密钥_num_1”,转换、“密钥_num_7”和“密钥_num_1”是什么意思 第二段:

    unset K1 K2 K3
    read -s -N1 -p "Press a key: "
    K1="$REPLY"
    read -s -N2 -t 0.001
    K2="$REPLY"
    read -s -N1 -t 0.001
    K3="$REPLY"
    key="$K1$K2$K3"
    
    在上面的片段中,每次我按下一个键

  • 为什么它读取3个变量来构造一个键十六进制序列
  • 第二个
    读取-s-N2-t0.001
    ,为什么要指定
    -t
    (超时)选项和
    -N2
    (nchars)来读取2个字符而不是1个

  • 有几个问题要问

    脚本希望转义序列通过特殊键发送。在典型的键盘上,这些键都有名称或图形符号(例如←, 用于左光标)。按照惯例(没有适用的标准),这些键发送以转义开头的字符序列,第二个字符通常是
    [
    。对于这两个字符,十六进制代码分别是
    0x1b
    0x5b
    (请参阅).0x4f
    0x4f
    是字母
    O
    ,将由终端的特殊按键发送

    Home键和End键发送的特定序列使用的约定与其他一些特殊键稍有不同,这些特殊键指的是PC风格(请参阅xterm常见问题解答了解其背景)显然,该脚本的开发人员决定通过确保Home和End发送的序列变体都将转换为VT220样式的序列来解决与该常见问题相关的问题

    最后一个问题是为什么需要进行单独的读取并使用单独的变量。这是因为通过特殊密钥发送的字符序列可能会通过网络传输,并且需要比那些
    读取操作允许的时间更长。因此,每次尝试时只能读取部分序列。scipt收集这些片段并将它们作为一个字符序列放在一起