以“ \ 033]开头的转义序列是什么类型的序列


19

我在Bash中发现了许多以开头的转义序列\033],但是这些序列是什么,为什么以它们开头\033]

Answers:


25

实际上\033[,字符串不是全部。

在该右括号之后是一系列数字和符号。该字符串称为转义序列,用于控制控制台的光标和文本颜色等。

非打印转义序列必须包含在其中 \[\033[ and \]

如果转义序列控制文本颜色,则其后将跟一个m

这是颜色顺序表:

Black       0;30     Dark Gray     1;30  
Blue        0;34     Light Blue    1;34  
Green       0;32     Light Green   1;32  
Cyan        0;36     Light Cyan    1;36  
Red         0;31     Light Red     1;31  
Purple      0;35     Light Purple  1;35  
Brown       0;33     Yellow        1;33  
Light Gray  0;37     White         1;37   

因此,如果您希望控制台提示符为蓝色,则可以使用以下转义序列(在我忘记的文件名中):

\[\033[34m\]

(注意m

但是,此转义序列不仅控制颜色。它还可以控制光标的移动。这是带有运动代码及其工作方式的表格/列表:

  • 定位光标:

    \033[<L>;<C>H

    要么

    \033[<L>;<C>f

    将光标置于L行和C列。

  • 将光标向上移动N行:

    \033[<N>A
  • 将光标向下移动N行:

    \033[<N>B
  • 将光标向前移N列:

    \033[<N>C
  • 向后移动光标N列:

    \033[<N>D
  • 清除屏幕,移至(0,0):

    \033[2J
  • 擦除到行尾:

    \033[K
  • 保存光标位置:

    \033[s
  • 恢复光标位置:

    \033[u

请注意,最后两个可能无法在您使用的终端仿真器中工作。显然,只有xtermnxterm使用这两个序列。

并举例说明使用这些转义序列之一:假设我要将光标定位在第3行第9列(字符)。为此,我将使用

\[033\[3;9H]

(我假设第0列是第一个位置,所以它将是第8个字符)。

来源:http//www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html(另请参阅6.2)

更一般的阅读:http : //ascii-table.com/ansi-escape-sequences.php

维基百科:https//en.wikipedia.org/wiki/ANSI_escape_code



2
请注意,'\ 033'是八进制的ESCAPE字符,因此可以十进制(27)或十六进制(0x1B)给出。有写ESCAPE的其他常见的方式,例如, '^ ['在bindkey shell脚本, “\ E”,等等
jamesqf

1
请注意,该表中的许多条目是误导性的或不正确的:粗体,模糊,下划线等可以独立于颜色进行设置和重置,也可以与颜色一起重置为0;后台有一套完整的代码(40–49),而7交换了前台和后台的代码;ESC [2K会删除光标前后的整行。更好的资料来源是Wikipedia文章,或者您可以直接转到ECMA-48的 8.3.117 SGR部分-选择图形渲染
deltab '16

cplusplus.com帖子上的短语“以下各句末尾的'm'字符用作终止符”也有点令人困惑,因为下面的表显然包含不以“ m”。实际上,当出现在顶部时,这似乎更具误导性。
ilkkachu '16

1
从技术上讲,0;不需要先进行颜色顺序设置。这只是使背景颜色成为设置前景之前的默认颜色。您也可以使用设置背景4x
基金莫妮卡的诉讼

17

它们是终端的控制命令。

终端最初连接到串行端口的笨拙设备,而不是那些带有菜单的精美多标签GUI软件。由于它们仅接收字符流(字节),因此数据(在屏幕上打印的内容)和命令(如何打印)之间没有明确的分隔。而是用特殊的控制字符表示命令。

明显的控制字符是换行符(换行符),退格键和铃声,但更具体的命令以字符序列形式给出,从字符开始ESC(十进制代码27,十六进制0x1b或八进制033)。通常以^[\033在您的示例中表示。

该序列ESC [称为CSI或控制序列介绍程序,它以可选的数字参数开始一个命令,通常以定义主命令的字母结尾。大多数常见的转义序列都属于此类。

可以在例如console_codes(4)手册页和Wikipedia页面上找到转义码列表,以获取ANSI转义码

一些例子:

ESC [ 4 A             move cursor 4 lines up (4 can be any number)
ESC [ 5 B             move cursor 5 lines down
ESC [ 2 K             erase current line 
ESC [ 30;46 m         set black text (30) on cyan background (46)
ESC [ 0 m             reset color and attributes

您可以使用例如Bash测试命令。-e内置echo命令使用该标志接受字符\033的表示ESC

例如,这将在屏幕中间以彩色方式显示问候语,而通常在原始光标位置以另一种方式显示问候语:

echo -e '\033[s\033[12;30f\033[30;46m  Hello!  \033[0m\033[uhello'

ESC ]您提到的顺序是OSC或操作系统命令,该命令主要用于命令中设置窗口标题xterm等,例如:

echo -e '\033]0;new window title\a'

然后,还有ESC ( A(和其他字母)在某些终端上设置了国家字符集,从而产生了滑稽的效果


8

转义符后跟右方括号escape]用于引入操作系统命令OSC)。

它在ECMA-48中,您可以阅读Xterm控制序列中 xterm使用的控制序列的摘要,例如,用于更改终端窗口的标题。

转义序列可以以不同的字符开头。的C1(8位)控制字符中的XTerm控制序列部分提到几个那些:CSI(你如见escape[APCDCSPM。其原因不同的(第二)字符是因为对(逸出并])与相关联的单字节控制字符,用于不同类型的转义序列。

如果通读规范,您会注意到它CSI用于带有数字参数的控件,而OSC允许使用字符串。除了语法外,创建此标准的委员会还考虑了for的用途,APC并且PM不同于DCSOSC



1

其他答案中描述的“转义序列”取决于您拥有的终端类型(最常见的是“ ANSI”或派生/相似的终端类型)。

$ echo $TERM  
xterm

如果您希望编写的脚本(在某种程度上是独立的),但是仍然使用例如颜色和其他特殊功能,那么请看一下的内容man terminfo

例如

$ echo -n ".";tput setb 6;tput setf 4;echo -n "test";tput sgr0;echo "."

将会.test.test淡黄色的背景色和红色的前景色进行打印,这将适用于实际上能够以相同方式使用颜色的任何终端。

要查看实际打印的内容,请将其od -t x1z按以下方式放入

$ tput sgr0 | od -t x1z  
0000000 1b 28 42 1b 5b 6d                                >.(B.[m<  
0000006

...值以十六进制显示(由于“ x”)。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.