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)
为什么回显键只是给空格?
据报道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,我的设置有一些不同的结果。