我有这个:
我读向下箭头键
abc@abc-ubuntu:~/bashpratice$ read -n 3 key
^[[Babc@abc-ubuntu:~/bashpratice$
我能够找到它
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\['
[B
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\[B'
[B
但回显键只会打印空格
abc@abc-ubuntu:~/bashpratice$ echo $key
abc@abc-ubuntu:~/bashpratice$
为什么回显按键只会给出空格?
答案1
在终端中输入 downarrow 时会发生什么
据报道xxd -p
,当输入↓+时return:
xxd -p
^[[B
1b5b420a
向下箭头键会导致 3 个字符的序列:
- 第一个是
\x1b
(又名转义,请参阅man ascii
),在终端上回显为^[
, - 第二个是
\x5b
,也就是说[
, - 第三是
\x42
,就是B
。
最后一个字符\x0a
只是换行符。
因此,downarrow 在终端上回显为^[[B
。实际上,这对应于1b5b42
十六进制序列,它是实际发送到读取进程的序列。
关于你的实验
您的key
变量包含1b5b42
十六进制序列。检查一下
echo -n "$key" | xxd -p
1b5b42
当然,grep
将能够捕获5b42
十六进制序列(即[B
)。
但是,当您向终端发送某些内容时,转义字符\x1b
将被解释为某些特殊转义序列的开头。例如,\x1b[31m
大多数终端都能识别的序列,表示“使用红色前景色”。自己检查一下:
echo -e 'hello \x1b[31myou'
该序列将更改当前颜色,但不会打印任何内容。您还可以检查一下:
echo -e 'hello \x1b[Byou'
您将看到\x1b[B
终端将特殊序列解释为“将光标向下移动一位”。
这就是为什么echo $key
除了一些空行之外,您不会在终端上显示直接可见的内容。
—
1.我不确定为什么grep
会打印出来[B
,我的设置有一些不同的结果。
答案2
终端不响应按键代码。这些通常由应用程序看到和解释。他们的应用程序可以发送cup
(光标向上)或向下序列(通常使用 ncurses 库)。