首页 > linux终端里为什么不能直接输入转义序列?

linux终端里为什么不能直接输入转义序列?

书上说

当konsole在其显示的文本流中看到一个ESC字符时,它会非常仔细地查看后面几个字符.如果后面的前三个字符是[2j,该序列命令konsole执行清屏操作.

我有疑问的是为什么不能直接在konsole中按下ESC+[2j这4个字符.我现在知道需要通过另外某些途径才行.比如在一个C文件中,或者是按键绑定中,或者是linux的某些配置文件中.甚至不一定是ESC,连\r这种转义序列也是.
但这些我都说不清为什么.谁能具体解释下?


很久很久以前……

很久很久以前,电脑操作员只能通过键盘,在黑漆漆的终端中输入命令,跟那些隐藏在屏幕之后的神灵,哦不,计算机,对话。
他们很快发现,有些字符不能打出来,比如换行,怎么在字符串表示一个换行呢?换行符打不了呀,毕竟键盘那么小,如果给换行符一个键,那么同样也得给回车符、制表符或者什么鬼符留一个键。这么下来键盘就只有章鱼能用啦。
另外这些换行符在终端界面上怎么显示出来呢?当时的终端屏幕也就能支持ASCII字符,很难拿出一个稀奇古怪的符号来表示换行。

还好聪明的操作员们发明了一种机制,就是用\作为转义字符。这么一来,键盘上的键就可以跟\组合起来用了,比如\t\r。妈妈再也不用担心我没字符用了!操作员们给这种字符起了个好听的名字,叫转义字符

顺便说下,转义字符的英文是escape character,现在知道为什么会有ESC键吧。

维基百科-转义字符

当然,转义字符也带来了许多问题(哼,都怪你们这些耍小聪明的操作员们!)。比如,你怎么区分\n到底是一个转义字符,还是两个字符?这个问题,待会我们再来谈谈。

操作员们快乐了一段时间……

过了一段无忧无虑的日子之后,操作员发现,他们需要对终端进行更多的操作,比如按一下键就能清空终端的游戏界面,这样就不会被老板抓现行了。

当然这个问题可不能求助于造键盘的厂商……这样的需求一定会被嘲笑的,何况那时键盘厂商造的键盘,有些连Ctrl都没有……于是当时的操作员用起了老办法。嗯,就是使用更多的转义字符。他们制定了更多转义字符,其中有一个系列叫做ECMA-48 CSI sequences。那本书所说的ESC[2J,就是定义在这个系列中。

现在,man console_codes, /ECMA-48 CSI sequences搜索这个系列的字符,你就能看到这个用于清屏的转义字符了。
顺便说下,你的书的记载有误,j应该是大写的J才对。

怎么区分转义字符和非转义字符?

这个要看具体的上下文。
在一般情况下,终端会把接收到的字符作为非转义字符处理,比如输入\n,终端会认为你输入的是两个字符,而不是一个回车。这样在输入正常的内容时,就不用经常挂念着要进行反转义什么的。

不过还是有特殊的情况的。

怎么在终端中输入转义字符串?

一种常用的方法是,用echo来输出转义字符。

对于你的问题中,因为\e表示ESC,那么可以通过echo -e '\e[2J'来输出转义字符ESC[2J。试试看会发生什么事……

想直接在终端中输入?关键是要让终端把ESC当做一个普通的字符,而不是特殊的控制字符。还好有一个Ctrl+v能把它紧邻的字符作为普通字符输入。
先Ctrl+v,再ESC,接着[2J,最后按下换行,看看效果~

【热门文章】
【热门文章】