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
,我的设置有一些不同的结果。