我发现 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
请注意,最后两个可能不适用于您使用的终端仿真器。显然,只有xterm
和nxterm
使用这两个序列。
例如,使用以下转义序列之一:假设我想将光标定位在第 3 行、第 9 列(字符)。为此,我将使用
\[033\[3;9H]
(我假设第 0 列是第一个位置,所以那将是第 8 个字符)。
来源:http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html(另请参阅 6.2)
答案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[
。第二个字符不同的原因是因为该对(转义和)与用于不同APC
DCS
PM
]
类型转义序列。
如果您通读规范,您会注意到CSI
用于带有数字参数的控件,而OSC
允许使用字符串。除了语法之外,制定此标准的委员会还考虑了APC
和的用法,它们与和PM
不同。DCS
OSC
答案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”)。