尝试打印向上向下箭头键

Ank*_*wal 4 terminal escape-characters

我有这个:

我阅读向下箭头键

abc@abc-ubuntu:~/bashpratice$ read -n 3 key
^[[Babc@abc-ubuntu:~/bashpratice$ 
Run Code Online (Sandbox Code Playgroud)

我可以为它grep

abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\['
[B
abc@abc-ubuntu:~/bashpratice$ echo $key | grep '\[B'
[B
Run Code Online (Sandbox Code Playgroud)

但是回显键只是打印空格

abc@abc-ubuntu:~/bashpratice$ echo $key

abc@abc-ubuntu:~/bashpratice$ 
Run Code Online (Sandbox Code Playgroud)

为什么回显键只是给空格?

Sté*_*nez 5

在终端中输入向下箭头时会发生什么

据报道xxd -p,当输入?+ 时return

xxd -p
^[[B
1b5b420a
Run Code Online (Sandbox Code Playgroud)

向下键导致 3 个字符的序列:

  • 第一个是\x1b(又名转义,见man ascii),在终端上回响为^[
  • 第二个是\x5b,也就是说[
  • 第三个就是\x42,就是B

最后一个字符,\x0a只是换行符。

因此,向下箭头在终端上显示为^[[B。实际上,这对应于1b5b42十六进制序列,它是实际发送到读取过程的序列。

关于你的实验

您的key变量包含1b5b42十六进制序列。检查它

echo -n "$key" | xxd -p
1b5b42
Run Code Online (Sandbox Code Playgroud)

当然,grep将能够捕获5b42十六进制序列(即[B)¹。

但是,当您向终端发送某些内容时,转义字符\x1b被解释为某些特殊转义序列的开始。例如\x1b[31m是大多数终端都能识别的序列,意思是“使用红色前景色”。自己检查一下:

echo -e 'hello \x1b[31myou'
Run Code Online (Sandbox Code Playgroud)

该序列将更改当前颜色,但不会打印任何内容。你也可以检查这个:

echo -e 'hello \x1b[Byou'
Run Code Online (Sandbox Code Playgroud)

您会看到\x1b[B终端将特殊序列解释为“将光标向下移动一个”。

这就是为什么你echo $key不会在终端上显示直接可见的东西,除了一些空行。


1. 我不知道为什么grep只是打印[B,我的设置有一些不同的结果。