\e 和 ^[ 的区别

For*_*ker 17 shell escape-characters key-mapping

吉尔斯写道

字符 27 = 033 = 0x1b = ^[=\e

德米泽写道

^[ 只是 ESCAPE 的表示,而 \e 被解释为实际的 ESCAPE 字符

然后我还从TechRepublic 文章中找到了这一行

确保将键序列写为 \e[24~ 而不是 ^[[24~。这是因为 ^[ 序列等价于 [Esc] 键,在 shell 中用 \e 表示。因此,例如,如果键序列是 ^[[OP,则要使用的结果绑定代码将是 \e[OP。

但我一直在使用使用 ^[ 而不是 \e 的映射。

那么它们可以互换吗?我什么时候需要使用一个而不是另一个?

Dra*_*oan 21

如果您查看ANSI ASCII 标准,字符集的下半部分(前 32 个)是保留的“控制字符”(有时称为“转义序列”)。这些是 NUL 字符、Life Feed、回车符、Tab、Bell 等。绝大多数可以通过按下该Ctrl键与另一个键的组合来模拟。

第 27 个(十进制)或\033八进制序列,或0x1b十六进制序列转义序列。它们都是相同控制序列的表示。不同的 shell、语言和工具以不同的方式引用这个序列。它的Ctrl序列是Ctrl- [,因此有时被表示为^[^是 的简写Ctrl

您可以通过在命令行上输入控制字符序列作为原始序列Ctrl- vCtrl-v对于大多数 shell 和程序,会停止对以下键序列的解释,而是以其原始形式插入。如果您使用Escape键或Ctrl-执行此操作,v它将在大多数外壳上显示为^[. 然而,虽然这个序列会被解释,但它不会轻易剪切和粘贴,并且在遇到某些协议或程序时可能会被简化为非控制字符序列。

为了解决这个问题以使其更易于使用,某些实用程序使用\033(八进制引用)、十六进制引用\x1b或特殊字符引用来表示“原始”序列\e。这与\t解释为Tab- 的方式大致相同,顺便说一下,也可以通过Ctrl-输入i,或者\n作为换行符或Enter键,也可以通过Ctrl-输入m

所以当吉尔斯说:

27 = 033 = 0x1b = ^[ = \e

他说的是十进制 ASCII 27、八进制 33、十六进制 1b,Ctrl-[并且\e都是相等的,他的意思是它们都指的是同一件事(语义上)。

当德米西说

^[ 只是 ESCAPE 的表示,而 \e 被解释为实际的 ESCAPE 字符

他的意思是语义,但如果按Ctrl- v Ctrl-[这是完全一样的\e,原始的插入顺序将最有可能的处理方式相同,但这并不总是有保证的,因此它建议使用编程方式更便携\e0x1b\033视关于正在使用的语言/外壳/实用程序。