\e 和 ^[ 之间的区别

\e 和 ^[ 之间的区别

吉尔斯写道:

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

德米泽伊写道:

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

然后我还发现了这一行科技共和国文章

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

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

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

答案1

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

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

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

为了解决这个问题并使其更易于使用,某些实用程序使用\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取决于关于正在使用的语言/shell/实用程序。

答案2

所有这些都是某些软件或某些人使用的角色的表示。我列出了最常见的。如果您正在与人交谈,请使用他们能理解的任何内容。 (显然,我试图确保您至少理解其中之一,但结果适得其反。)如果您正在与软件交谈,请查阅文档以了解它所理解的内容。

在 bash 中,转义序列\e\033和作为、、 、 提示和键绑定中的\x1b参数。在键绑定中,有一种更通用的语法可以使用,因为字符 27 是通过键入+得到的(该语法是对 Emacs 键绑定的模仿)。作为 ; 的参数适用于所有 shell 。其他上下文和符号取决于 shell。printf$'…'\C-[Ctrl[\033printf

Screen 无法识别任何这些转义序列,但会识别^为控制前缀,因此^[表示字符 27。

相关内容