Answers:
实际上\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)
[2K
会删除光标前后的整行。更好的资料来源是Wikipedia文章,或者您可以直接转到ECMA-48的 8.3.117 SGR部分-选择图形渲染。
0;
不需要先进行颜色顺序设置。这只是使背景颜色成为设置前景之前的默认颜色。您也可以使用设置背景4x
。
它们是终端的控制命令。
终端最初是连接到串行端口的笨拙设备,而不是那些带有菜单的精美多标签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
(和其他字母)在某些终端上设置了国家字符集,从而产生了滑稽的效果。
转义符后跟右方括号escape]
用于引入操作系统命令(OSC
)。
它在ECMA-48中,您可以阅读Xterm控制序列中 xterm使用的控制序列的摘要,例如,用于更改终端窗口的标题。
转义序列可以以不同的字符开头。的C1(8位)控制字符中的XTerm控制序列部分提到几个那些:CSI
(你如见escape[
,APC
,DCS
,PM
。其原因不同的(第二)字符是因为对(逸出并]
)与相关联的单字节控制字符,用于不同类型的转义序列。
如果通读规范,您会注意到它CSI
用于带有数字参数的控件,而OSC
允许使用字符串。除了语法外,创建此标准的委员会还考虑了for的用途,APC
并且PM
不同于DCS
和OSC
。
这些被称为ANSI转义码,它们在console_codes的手册页中列出。它们不是特定于Bash的,而是可以在任何控制台应用程序中使用,只要终端支持它们即可(大多数终端仿真器都支持)。
其他答案中描述的“转义序列”取决于您拥有的终端类型(最常见的是“ 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”)。