我想从命令行更改xterm的颜色(背景,字体,前景)。我听说这可以使用ANSI转义序列来完成。
如果可能的话:
- 怎么做?
- 我可以使用颜色名称还是必须使用其RGB代码?
我想从命令行更改xterm的颜色(背景,字体,前景)。我听说这可以使用ANSI转义序列来完成。
如果可能的话:
Answers:
ANSI转义序列由一个以Escape字符27开头的字符序列组成。下一个字符通常(尽管不总是)是一个方括号:[
如果您指定-e
并\e
用于转义,echo命令可以发送转义字符。
ANSI标准定义了8种颜色,加上明亮模式,总共有16种可能性。顺序为:
\e[<number>m
其中<number>
之一是:
前景:
背景:
47白色
0全部重置
因此,使前景变为红色,背景变为黄色:
$ 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
您希望的是命令提示符。它会发出有关未知命令的提示,但是您将能够再次看到正在执行的操作。
echo -ne '\e[31;43m'
而不是上面的echo -e "\e[31m\e[43m"
)。
请注意,现代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”具有不同的转义序列,或者可能根本不实现颜色更改。
是。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索引)。有关更多信息,请参见Wikipedia文章。
注意:要测试这些,请使用echo -e
或printf
。
还要检查一个项目ScriptEchoColor,
它完全是用bash脚本制作的,在这里
它具有ubuntu的软件包,
但是如果您知道怎么做的话,这些脚本可以安装在任何发行版上(最新的git也可以从其git下载)。
您可以使用缩短或扩展的颜色名称,例如:
echoc "@rRedFg@{/blue}BlueFg@{/GREEN}GreenBg"
一个样品:
另外,请确保查看xtermcontrol,以对xterm本身(不仅是字符)进行更广泛的控制。
在许多ANSI CSI代码中,有一种称为SGR,即“选择图形呈现”。这是ESC,[
参数,,m
其中参数是ASCII格式的一个或多个整数,以分号分隔。上面的Wikipedia页面上列出了许多不同的SGR参数(尽管并未全面介绍所有参数)。
某些参数(例如1
(粗体或增加的强度)和31
(红色文本))是独立的,可以单独使用或组合使用,如分别用于ESC[31m
或ESC[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,这意味着将关闭所有属性,将文本重置为该终端的默认值。
ESC[38
... m
和ESC[38
... m
可以/应该(取决于您的信息来源- 我相信itu.int/rec/T-REC-T.416-199303-I最终的理由)应该使用,否则保留该字符:
(以分隔参数元素),以便;
仅在完整的参数字符串之间使用,即ESC[38;2;150;100;50m
应将其写入ESC[38:2::150:100:50m
...
2
和150
-因为没有人,我是知道的,曾经定义在那里空默认是使用应该去什么样的价值-但它常常被漏诊关闭仅;
作为分隔符使用,就不可能可靠地根据规范处理信息。