Bash:检测按键:如何读取特殊的键十六进制序列(如Insert)以及为什么它是'\x1b\x5b\x32\x7e';(插入)?
在《高级Bash脚本指南》一书中。整个代码可在上查看。在这个示例中,有一些代码片段我不理解 第一段: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
# 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键时
\x1b\x4f\x48
序列,为Insert生成\x1b\x5b\x32\x7e
序列李>
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"
在上面的片段中,每次我按下一个键
读取-s-N2-t0.001
,为什么要指定-t
(超时)选项和-N2
(nchars)来读取2个字符而不是1个有几个问题要问 脚本希望转义序列通过特殊键发送。在典型的键盘上,这些键都有名称或图形符号(例如←, 用于左光标)。按照惯例(没有适用的标准),这些键发送以转义开头的字符序列,第二个字符通常是
[
。对于这两个字符,十六进制代码分别是0x1b
和0x5b
(请参阅).0x4f0x4f
是字母O
,将由终端的特殊按键发送
Home键和End键发送的特定序列使用的约定与其他一些特殊键稍有不同,这些特殊键指的是PC风格(请参阅xterm常见问题解答了解其背景)显然,该脚本的开发人员决定通过确保Home和End发送的序列变体都将转换为VT220样式的序列来解决与该常见问题相关的问题
最后一个问题是为什么需要进行单独的读取并使用单独的变量。这是因为通过特殊密钥发送的字符序列可能会通过网络传输,并且需要比那些读取操作允许的时间更长。因此,每次尝试时只能读取部分序列。scipt收集这些片段并将它们作为一个字符序列放在一起