如何使用Ansi转义序列更改xterm的颜色?


25

我想从命令行更改xterm的颜色(背景,字体,前景)。我听说这可以使用ANSI转义序列来完成。

如果可能的话:

  • 怎么做?
  • 我可以使用颜色名称还是必须使用其RGB代码?

Answers:


27

ANSI转义序列由一个以Escape字符27开头的字符序列组成。下一个字符通常(尽管不总是)是一个方括号:[

如果您指定-e\e用于转义,echo命令可以发送转义字符。

ANSI标准定义了8种颜色,加上明亮模式,总共有16种可能性。顺序为:

\e[<number>m

其中<number>之一是:

前景:

  • 30黑色
  • 31红色
  • 32绿色
  • 33黄色
  • 34蓝色
  • 35洋红色
  • 36青色
  • 37白色

背景:

  • 40黑色
  • 41红色
  • 42绿色
  • 43黄色
  • 44蓝色
  • 45洋红色
  • 46青色
  • 47白色

  • 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"

这将改变颜色,清除屏幕,然后将光标放在左上角。好吧,几乎是左上方。回声将回车放回去,因此它向下移动了一行。-n如果您很忙,可以添加回显以防止这种情况。

如果您将所有内容弄乱了,但看不到您输入的内容,则可以通过按以下键将终端颜​​色重置为正常颜色:

Ctrl+v [ 0 m Return

您希望的是命令提示符。它会发出有关未知命令的提示,但是您将能够再次看到正在执行的操作。


可以使用颜色名称代替颜色代码吗?
内森·费尔曼

1
不可以,但是您可以将颜色代码分配给变量。FGRED = 31;echo -e“ \ e [$ {FGRED} m”
Majenko

3
但是,应注意,多个颜色代码编号可以用“;”分隔。因此,要使前景变为红色,背景变为黄色,您也可以使用较短的:(echo -ne '\e[31;43m'而不是上面的echo -e "\e[31m\e[43m")。
Andreas Spindler

如何将光标的颜色更改为34蓝色?
trusktr 2014年

28

请注意,现代Xterms支持32位颜色!

简单的例子。要设置值为#53186f的漂亮的深紫色背景(嘿,每个都有自己的颜色),请执行以下操作:

echo -ne "\033]11;#53186f\007"

请注意,这会立即更改整个窗口的颜色,而不仅仅是随后的文本。这对于将窗口ssh'到服务器后使窗口明显不同特别有用(例如)。将上面的“ echo”放入您的.bashrc中,并且您的终端在登录到该服务器时会自动更改颜色(但是在按Ctrl-D退出时不会变回)

您可以在网上花HOURS来寻找-大多数文档只谈论原始的16种ANSI颜色。

来源:http : //www.steike.com/code/xterm-colors/http://rtfm.etla.org/xterm/ctlseq.html(在“操作系统控件”下查找)

请注意:上面的转义序列对于XTerms有效,并且可能不适用于“看起来”像XTerm的“类似于XTerm”的窗口终端仿真器的其他实现。例如,“ gnome-terminal”或“ konsole”具有不同的转义序列,或者可能根本不实现颜色更改。


1
这对我不起作用,它回显了空白行,并且终端中没有可观察到的变化。
理查德

1
这对我有用,而其他人则没有-非常有帮助,谢谢
-vol7ron

1
+1更改窗口背景,并允许使用颜色名称-例如“绿色”而不是“#00ff00”。
罗伯一世

1
#53186f 32位颜色怎么样。我数了24位...
jiggunjer

有谁知道如何用gnome-terminal完成同一件事?
wjandrea

3

是。ANSI终端支持ANSI转义码。每个Control Sequence IntroducerCSI)代码采用以下格式:

ESC[<<<CODE>>>

ASCII字符27ESC字符)或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))都相关。

要删除所有样式(返回默认/正常模式),请使用SGR0。

CSI代码也不全是图形的。例如,ESC[2J将清除您的终端。ESC[<y>;<x>H设置光标位置(1索引)。有关更多信息,请参见Wikipedia文章。

注意:要测试这些,请使用echo -eprintf


2

注意:“ ^ [”是转义字符,并插入CTRL-V,CTRL- [,而^ G是响铃字符,插入CTRL-V,CTRL-G

以下代码块位于我的.bash_profile中,即使在登录可能已更改了我颜色的另一个系统后,也确保该系统上的xterm始终为黑底白字。

perl -e '$e=chr(27);print "${e}[37m ${e}[40m ${e}[2J ${e}[1;1H";'
export PS1='^[[37m^[]0;${HOST}: ${PWD}^G^[[40m${USER}@${HOST}:${PWD}
--> '

0

还要检查一个项目ScriptEchoColor,
它完全是用bash脚本制作的,在这里
它具有ubuntu的软件包, 但是如果您知道怎么做的话,这些脚本可以安装在任何发行版上(最新的git也可以从其git下载)。

您可以使用缩短或扩展的颜色名称,例如:

echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"

一个样品: 在此处输入图片说明

另外,请确保查看xtermcontrol,以对xterm本身(不仅是字符)进行更广泛的控制。


0

在许多ANSI CSI代码中,有一种称为SGR,即“选择图形呈现”。这是ESC,[参数,,m其中参数是ASCII格式的一个或多个整数,以分号分隔。上面的Wikipedia页面上列出了许多不同的SGR参数(尽管并未全面介绍所有参数)。

某些参数(例如1(粗体或增加的强度)和31(红色文本))是独立的,可以单独使用或组合使用,如分别用于ESC[31mESC[1;31m提供标准红色和粗体红色前景文本。

其他参数本身带有参数,这些参数在代码之后以分号分隔的数字形式提供。因此,例如,ESC[38;5;219m将以扩展色号219显示前景文本,并ESC[38;2;150;100;50m以RGB值150、100、50的颜色显示前景文本。在这种情况下,38“扩展设置的前景色”命令始终由子命令。子命令2具有三个参数,红色,绿色和蓝色分量的值。不同的是,子命令5只需要再加上一个值,即0到255之间的一个数字,用于指定配置终端所用表中的颜色。

下面的shell函数可以方便地使用这些代码:

sgr() {
    local codes=${1:-0}; shift
    for c in "$@"; do codes="$codes;$c"; done
    echo -n -e "\e[${codes}m"
}

您可以像这样使用它:

normal=$(sgr 0)
red=$(sgr 31)
echo "Text can be $(sgr 1)made boldface$(sgr 0)" \
     " or ${red}colored red${normal}" \
     " or $(sgr 31 1)even both at the same time$(sgr)."

请注意,如果不提供任何参数,sgr()则默认值为SGR代码0,这意味着将关闭所有属性,将文本重置为该终端的默认值。


1
从技术上讲,ESC[38... mESC[38... m可以/应该(取决于您的信息来源- 相信itu.int/rec/T-REC-T.416-199303-I最终的理由)应该使用,否则保留该字符:(以分隔参数元素),以便;仅在完整的参数字符串之间使用,即ESC[38;2;150;100;50m应将其写入ESC[38:2::150:100:50m...
SlySven

...不幸的是实现经常忘记色彩空间ID之间2150-因为没有人,我是知道的,曾经定义在那里空默认是使用应该去什么样的价值-但它常常被漏诊关闭仅;作为分隔符使用,就不可能可靠地根据规范处理信息。
SlySven
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.