更改终端的文本和背景颜色?


Answers:


50

在某些XTerm / ANSI兼容终端(如xtermgnome-terminal)上,可以使用比默认8/16色调色板更大的调色板(例如,使用88色,256色或16777216色(RGB)调色板)设置颜色。 ; xterm和都gnome-terminal支持256色和16777216色(RGB)调色板);请注意,shell可能会覆盖此设置(例如对于就是这种情况zsh)。

这是一个脚本,用于列出256色调色板中的颜色以及在支持256色调色板的XTerm / ANSI兼容终端中的ANSI颜色代码:

#!/bin/bash
for((i=16; i<256; i++)); do
    printf "\e[48;5;${i}m%03d" $i;
    printf '\e[0m';
    [ ! $((($i - 15) % 6)) -eq 0 ] && printf ' ' || printf '\n'
done

屏幕截图1

屏幕截图

根据您要将颜色应用于前景还是背景,请在以下命令中分别使用或<fg_bg>值:3848

printf '\e[<fg_bg>;5;<ANSI_color_code>m'

例如,要将前景色(<fg_bg>= 38)设置为红色(<ANSI_color_code>= 196),将背景色(<fg_bg>= 48)设置为黑色(<ANSI_color_code>= 0):

printf '\e[38;5;196m Foreground color: red\n'
printf '\e[48;5;0m Background color: black\n'

屏幕截图3

有必要重新绘制提示printf '\e[K',以使背景色适用于整行,并使前景色适用于光标:

屏幕截图4

在兼容的终端中使用RGB值代替ANSI颜色代码可以完成相同的操作;根据是要将颜色应用于前景还是背景,请在以下命令中分别使用或<fg_bg>值:3848

printf '\e[<fg_bg>;2;<R>;<G>;<B>m'

例如,要将前景色(<fg_bg>= 38)设置为红色(<R>= 255<G>= 0<B>= 0),将背景色(<fg_bg>= 48)设置为黑色(<R>= 0<G>= 0<B>= 0):

printf '\e[38;2;255;0;0m Foreground color: red\n'
printf '\e[48;2;0;0;0m Background color: black\n'

屏幕截图5

同样,有必要使用重绘提示printf '\e[K',以使背景色应用于整行,并使前景色应用于光标:

屏幕截图6

使用这两种方法,都可以printf '\e[0m'用来重置所有属性:

屏幕截图7


1
二者xtermgnome-terminal识别\ E [38/48; 2; R; G;家蚕真彩转义序列; 但是,xterm将实际颜色四舍五入到其256色调色板中的最近值。gnome-terminal显示转义序列中给出的确切真实颜色。
egmont

2
\ e [K很危险;在某些仿真器中(例如xterm),如果光标恰好位于最右边(可视地显示在最右边的列中,但由于已经在最右边的列中打印了一个字符,从逻辑上讲已经超出了该范围),则最后一个字母将被剥离。参见例如bugzilla.gnome.org/show_bug.cgi?id=740789savannah.gnu.org/bugs/?36831
egmont

纠正自己:如果您在行的开头(在提示符的开头而不是结尾处)发出\ e [K,则当然是安全的。(虽然不能与多行提示或命令一起使用。)
例如,monte

@egmont感谢您提供有用的信息,我发现在GNOME Bugzilla上被标记为固定的,是这种情况吗?我目前无法对此进行测试,因此我稍后将进行检查以检查是否仍然存在(除非您先回复),然后将该信息包括在答案中。
kos

Yup最新版本的gnome-terminal不会删除该字符。这是否是正确的行为值得怀疑。毕竟,图形终端仿真器正在仿真一些古老的设备。我们应该模仿他们的错误设计决策(就像xterm在这里所做的那样),还是应该重写(就像在gnome-terminal中所做的那样)?没有一个正确的答案,这是一个难题。
egmont

33

此页面上找到的信息,不包括预览列:

序列由转义字符(通常由“ ^[”或“ <Esc>”表示)以及其他一些字符组成:“ ^[FCm”(FC以下项目符号列表中的数字之一)。

在中bashEsc代码可以是以下之一:

  1. \e
  2. \033 (八进制)
  3. \x1B (十六进制)

注意1:\e[0m”序列删除所有属性(格式和颜色)。在每个彩色文本的末尾添加它可能是一个好主意。

注意2:前景色和背景色可能会有所不同,具体取决于终端的配置,并非所有颜色都受支持

设置/重置

  • 0:重置/删除所有修改器,前景和背景属性: echo -e "\e[0mNormal Text"
  • 1:粗体/明亮: echo -e "Normal \e[1mBold"
  • 2:昏暗: echo -e "Normal \e[2mDim"
  • 4:下划线: echo -e "Normal \e[4mUnderlined"
  • 5:闪烁(除了XTerm以外,在大多数终端中不起作用): echo -e "Normal \e[5mBlink"
  • 7:反转/反转: echo -e "Normal \e[7minverted"
  • 8:隐藏(对敏感信息有用): echo -e "Normal \e[8mHidden Input"
  • 21:重置/删除粗体/明亮: echo -e "Normal \e[1mBold \e[21mNormal"
  • 22:重置/删除暗淡: echo -e "Normal \e[2mDim \e[22mNormal"
  • 24:重置/删除下划线: echo -e "Normal \e[4mUnderlined \e[24mNormal"
  • 25:重置/删除闪烁: echo -e "Normal \e[5mBlink \e[25mNormal"
  • 27:重置/删除反向/反转: echo -e "Normal \e[7minverted \e[27mNormal"
  • 28:重置/删除隐藏的内容: echo -e "Normal \e[8mHidden \e[28mNormal"

前景

  • 39:默认值(通常是绿色,白色或浅灰色): echo -e "Default \e[39mDefault"
  • 30:黑色:echo -e "Default \e[30mBlack"(最好具有背景颜色组合: echo -e "Default \e[30;107mBlack on white"
  • 31:红色(请勿与绿色背景一起使用)
  • 32: 绿色
  • 33: 黄色
  • 34: 蓝色
  • 35:洋红色/紫色
  • 36:青色
  • 37: 浅灰
  • 90: 深灰色
  • 91: 红灯
  • 92:浅绿色
  • 93:浅黄色
  • 94: 浅蓝
  • 95:浅洋红色/粉红色
  • 96:浅青色
  • 97:白色

背景

  • 49:默认背景色(通常为黑色或蓝色)
  • 40: 黑色
  • 41:红色
  • 42: 绿色
  • 43: 黄色
  • 44: 蓝色
  • 45:洋红色/紫色
  • 46:青色
  • 47:浅灰色(请勿与白色前景一起使用)
  • 100:深灰色(请勿与黑色前景一起使用)
  • 101: 红灯
  • 102:浅绿色(请勿与白色前景一起使用)
  • 103:浅黄色(请勿与白色前景一起使用)
  • 104:浅蓝色(请勿与浅黄色前景一起使用)
  • 105:浅洋红色/粉红色(请勿与浅色前景一起使用)
  • 106:浅青色(请勿与白色前景一起使用)
  • 107:白色(请勿与浅色前景一起使用)

要同时设置前景色和背景色,请使用the form echo -e "\e[S;FG;BGm"。例如:(echo -e "\e[1;97;41m"红色背景上的加粗白色前景)

有关256种颜色的选择,请参见源页面。


30

偶尔更改颜色

如果要偶然更改颜色

您可以使用setterm命令:

setterm -term linux -back <background_colour> -fore <text_color> -clear

从颜色中,您可以选择(前后和背景):

black|blue|green|cyan|red|magenta|yellow|white|default

更多选项:

setterm -help

更改您的个人资料(颜色)设置

在14.04中,我没有找到dconf用于设置颜色或终端的选项。但是,您可以使用gconftool

  • 您首先需要获取您的个人资料名称:

    gconftool-2 --get /apps/gnome-terminal/global/profile_list
    
  • 然后,设置个人资料的文本颜色:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/foreground_color" --type string "#FFFFFF"
    

    例如将文本颜色设置为白色

    与背景色相同:

    gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string "#000000"
    

    例如将背景色设置为黑色

或者,要设置颜色的名称,您可以简单地在与setterm命令相同的调色板中使用whitegreen,例如:

gconftool-2 --set "/apps/gnome-terminal/profiles/<profile_name>/background_color" --type string black

1
在初始setterm命令中,这些应为双破折号。
user1770201 2015年

在14.04上工作,但在16.04上工作(测试版;不确定是不是这个原因)...仍然可以解决问题dconf write /org/gnome/terminal/legacy/profiles:/:<profile_id>/background-color "'rgb(0,0,0)'"
Janaka Bandara

无法在ubuntu 1704上运行,它看起来很糟糕
Wax Cage

1
gconftool-2(为Ubuntu 14.04,也许如下几个版本),或dconfgsettings对Ubuntu的变化GNOME终端的设置新的版本,并采取立即生效的所有的标签和相同的配置文件的窗口。我不认为OP正在寻找这种行为。
egmont

5

用于获得彩色输出的各种颜色代码也可以用于获取彩色背景

40  black
41  red
42  green
43  yellow
44  blue
45  magenta
46  cyan
47  white

因此,以下命令将背景变为红色:

$ echo -e '\e[0;41m'

根据外壳,终端仿真器等的不同,您可能不需要-e


3

有关将前景或背景切换为调色板的特定颜色,或在某些终端中甚至切换为直接RGB颜色的信息,请参见kos的答案。这样的序列效果一直持续到选择了其他颜色(或将其恢复为默认颜色)为止。

某些终端仿真器支持的另一种方法是使用OSC 10/11转义序列重新定义终端的默认前景色和背景色的确切RGB值:

echo -ne '\e]10;#123456\e\\'  # set default foreground to #123456
echo -ne '\e]11;#abcdef\e\\'  # set default background to #abcdef

这可能会持续更长的时间(直到被另一个OSC 10/11覆盖或通过OSC 110/111重置),但是与dconf方法不同,这仍然仅影响当前终端。

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.