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

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

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

答案1

字符串实际上是\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

它们是终端的控制命令。

终端最初相当愚蠢的设备连接到串行端口,而不是我们现在拥有的那些带有菜单的花哨的多选项卡 GUI 软件。由于它们只接收字符流(字节),因此数据(在屏幕上打印什么)和命令(如何打印)之间没有明确的区分。相反,命令用特殊的控制字符表示。

明显的控制字符是诸如换行符(换行符)、退格符和铃声之类的东西,但更具体的命令是以字符序列的形式给出的,以字符开头ESC(十进制代码 27、十六进制代码 0x1b 或八进制代码 033)。它通常表示为^[,或\033如您的示例中所示。

该序列ESC [称为 CSI,即控制序列引入器,它以可选的数字参数启动命令,通常以定义主命令的字母结尾。大多数常见的转义序列都属于此类。

转义码列表可以在以下位置找到:console_codes(4)手册页,以及维基百科页面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(和其他字母)在某些终端上设置国家字符集,潜在的搞笑效果

答案3

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

它位于ECMA-48,您可以在XTerm 控制序列例如,用于更改终端窗口的标题。

转义序列可以以不同的字符开头。C1(8 位)控制字符XTerm 控制序列中的部分提到了其中几个:(CSI您看到的是,,,,escape[。第二个字符不同的原因是因为该对(转义和)与用于不同APCDCSPM]类型转义序列。

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

答案4

其他答案中描述的“转义序列”取决于您拥有的终端类型(通常是“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”)。

相关内容