我想从命令行更改 xterm 的颜色(背景、字体、前景)。我听说这可以使用 ANSI 转义序列来实现。
如果可能的话:
- 如何完成?
- 我可以使用颜色名称吗?还是必须使用它们的 RGB 代码?
答案1
ANSI 转义序列由以转义字符(字符 27)开头的一系列字符组成。下一个字符通常(但不总是)是开方括号:[
-e
如果您指定并用于\e
转义,echo 命令可以发送转义字符。
ANSI 标准定义了 8 种颜色,加上一种明亮模式,总共有 16 种可能性。顺序如下:
\e[<number>m
其中之一在哪里<number>
:
前景:
- 三十 黑色
- 三十一 红色
- 三十二 绿色
- 三十三 黄色
- 三十四 蓝色
- 三十五 洋红色
- 三十六 青色
- 三十七 白色
背景:
- 四十 黑色
- 四十一 红色
- 四十二 绿色
- 43 黄色
- 四十四 蓝色
- 45 洋红色
- 四十六 青色
四十七 白色
0 全部重置
- 1 粗体
要使前景变为红色,背景变为黄色,请执行以下操作:
$ echo -e "\e[31m\e[43m"
并启用粗体:
$ echo -e "\e[1m"
当然,你可以将它们组合在一起:
$ echo -e "\e[31m\e[43m\e[1m"
还有许多其他的转义代码可以用于做其他事情。
例如 - 清除屏幕并将光标移动到左上角:
$ echo -e "\e[2J\e[1;1H"
改变颜色时这很有用:
$ echo -e "\e[31m\e[43m\e[1m\e[2J\e[1;1H"
这将改变颜色,清除屏幕,并将光标放在左上角。嗯,几乎是左上角。Echo 会输入回车符,因此它会向下移动一行。-n
如果您很挑剔,可以添加到 echo 中以防止这种情况发生。
如果你搞乱了一切,看不到你输入的内容,你可以按以下方法将终端颜色重置为正常:
Ctrl+v [ 0 m Return
您希望看到命令提示符。它会抱怨未知命令,但您将能够再次看到您正在做什么。
答案2
请注意,现代 Xterms 支持 32 位颜色!
简单的例子。要设置一个漂亮的深紫色背景(嘿,每个人都有自己的背景)值为 #53186f,你可以这样做:
echo -ne "\033]11;#53186f\007"
请注意,这会立即改变整个窗口的颜色,而不仅仅是后续文本的颜色。这对于在 ssh 连接到服务器后使窗口明显不同(例如)尤其有用。将上面的“echo”放入您的 .bashrc 中,当您登录该服务器时,您的终端会自动更改颜色(但当您按 Ctrl-D 退出时不会变回原样)
您可以花几个小时在网上寻找这个 - 大多数文档只讨论原始的 16 种 ANSI 颜色。
资料来源:http://www.steike.com/code/xterm-colors/ 和http://rtfm.etla.org/xterm/ctlseq.html(查看“操作系统控制”)
请注意:上述转义序列对 XTerms 有效,可能不适用于其他“类似 XTerm”的窗口终端仿真器实现,这些仿真器可能“看起来”像 XTerm。例如,“gnome-terminal”或“konsole”具有不同的转义序列,或者可能根本没有实现颜色变化。
答案3
是的。ANSI 终端支持ANSI 转义码. 每个Control Sequence Introducer
(CSI
)代码的格式如下:
ESC[<<<CODE>>>
Ascii 字符27
(ESC
字符)或1b
十六进制,后跟左方括号,然后是表示要使用的操作的字母。
;
请注意,可以在参数之前直接提供分隔参数的列表<<<CODE>>>
。
CSI
现在,颜色使用代码的子集,即Select Graphic Rendition
代码。这些代码的形式为:
ESC[<<<SGR>>>m
代码SGR
作为参数传递CSI
。与您的问题相关的是SGR
代码 30-49。代码 30-39 设置前景色。代码 40-49 设置背景色。
30 - Foreground Black
31 - Foreground Red
32 - Foreground Green
33 - Foreground Yellow
34 - Foreground Blue
35 - Foreground Magenta
36 - Foreground Cyan
37 - Foreground White
40 - Background Black
41 - Background Red
42 - Background Green
43 - Background Yellow
44 - Background Blue
45 - Background Magenta
46 - Background Cyan
47 - Background White
代码 38 和 48 是特殊代码。这些代码允许您使用 RGB 值。它们的格式为:
ESC[38;2;<r>;<g>;<b>m (Foreground)
ESC[48;2;<r>;<g>;<b>m (Background)
注意:其他用途包括\x1b[<3 or 4>8;5;<web safe color index>m
。这种用法有完全不同的颜色编码。有关更多信息,请参阅此答案顶部的链接。
代码 39 和 49 将前景色和背景色设置为其默认值,这些默认值是根据每个终端定义的。
实际上,30-37 和 40-47 的颜色与其标签所示的颜色略有不同。
0 - Black
1 - Darker Red
2 - Darker Green
3 - Dark/Yellow or Brown (varies between terminals)
4 - Dark Blue
5 - Dark Magenta
6 - Dark Cyan
7 - Light Grey
要获得浅色,可以使用 SGI 表示粗体1
。粗体是一个误导性的名称。它不会使字体变粗。它实际上增加了文本的亮度。应用粗体后,颜色变为:
0 - Dark Grey
1 - Bright Red
2 - Bright Green
3 - Bright Yellow
4 - Bright Blue
5 - Bright Magenta
6 - Bright Cyan
7 - White
注意:最后两个颜色块的数字与前景和背景都相关(<index> + (30 or 40)
)。
要删除所有样式(返回默认/正常模式),请使用SGR
0。
CSI
代码并非全部都是图形化的。例如,ESC[2J
将清除您的终端。ESC[<y>;<x>H
设置光标位置(1 索引)。有关更多信息,请参阅维基百科文章。
注意:要测试这些,请使用echo -e
或printf
。
答案4
还检查一个项目ScriptEchoColor
它完全由 bash 脚本编写,
有适用于 ubuntu 的软件包这里
但是如果您知道如何操作,这些脚本可以在任何发行版上安装(最新的也可以从其 git 下载)。
您可以使用缩短或扩展的颜色名称,例如:
echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"
一个样品:
另外,一定要看看终端控制,以便对 xterm 本身进行更广泛的控制(而不仅仅是字符)。