如何修改PS1命令行提示符的颜色
Synopsis: 在Linux中要改变输出字符的颜色,可以使用ANSI转义码或者tput命令。ANSI转义码可以控制字符的显示效果如加粗、加下划线、闪烁等,也可以改变字体的显示颜色(前景色),或者改变背景显示颜色,这些显示控制代码是可以组合使用的,用分号隔开即可,与顺序无关。tput命令也有对应的子命令来达到这些效果。另外,如果要修改Linux命令提示符PS1的颜色,需要特别注意的是bash环境下还需要在ANSI转义码前后添加\[和\]这两个额外的转义字符,否则当在命令行中输入的字符长度过长要换行时会错乱
1. ANSI转义码
ANSI转义码可以将光标定位在显示器上的指定位置,擦除部分显示,以及控制显示的格式(本文将要讨论的内容)等
1.1 ANSI escape sequences - CSI
Control Sequence Introducer, CSI
是ANSI转义序列中最有用处的序列,用两字符序列ESC [
表示,这个序列是由控制字符ESC
(通常用^[
或<ESC>
表示),加上后面的左方括号字符[
组成,即^[[
。因为大多数文本编辑器将键盘上的ESC
键解释为其它功能,所以不能仅敲击ESC
键,比如在xterm
终端中要输出^[
这个字符,你需要先按Ctrl + v
,然后按ESC
键
在bash中,控制字符ESC
也支持\e
、\033
或\x1b
三种转义字符的写法,大写字母也行(console_codes)
1.2 设置显示属性 - SGR
建议阅读ANSI转义码中关于SGR
部分,和console_codes中关于ECMA-48 Set Graphics Rendition
部分。
要控制显示格式,必须使用Set Graphic Rendition, SGR
转义序列ESC [ parameters m
,其中m
表示这是SGR序列,parameters
是控制代码,可以有多个代码组合,中间用分号;
隔开,如果不指定代码ESC [ m
相当于ESC [ 0 m
(重置所有显示控制属性为默认设置)。
显示控制代码有3类:
- 效果控制代码
- 前景色控制代码(即字体颜色)
- 背景色控制代码
(1) 效果控制代码
代码 | 效果 | 备注 |
---|---|---|
0 | 重置所有显示属性为默认设置 | reset all attributes to their defaults |
1 | 字体加粗 | set bold |
4 | 字体加下划线 | set underscore |
5 | 字体闪烁 | set blink |
7 | 前景色与背景色调转 | set reverse video |
(2) 前景色与背景色控制代码
前景色控制代码和背景色控制代码都使用两位数表示,前景色使用3
开头,而背景色使用4
开头,第二位数字表示具体颜色:
前景色代码 | 背景色代码 | 颜色 |
---|---|---|
30 | 40 | 黑色 |
31 | 41 | 红色 |
32 | 42 | 绿色 |
33 | 43 | 黄色 |
34 | 44 | 蓝色 |
35 | 45 | 紫色 |
36 | 46 | 青色 |
37 | 47 | 白色 |
因此,要设置红色前景则发送代码ESC [ 31 m
,要设置黄色背景可以使用代码ESC [ 43 m
;也可以组合使用,比如要设置字体颜色为红色、背景为黄色、且字体加粗,则使用代码ESC [ 31;43;1 m
注意: 上述转义序列代码在实际使用时
中间不能有空格
,上面用空格隔开只是为了演示时可以看清各组成部分
2. bash修改字符颜色
想在bash命令行或脚本中使用带颜色的字符,可以使用echo
命令,像发送普通文本一样,将ANSI转义字符序列发送到终端会话:
1. 使用`^[`这个字符,你需要先按`Ctrl + v`,然后按`ESC`键(你不能直接复制我的哦~) # echo ^[[31m红色字体 2. 使用bash的ESC转义控制字符,注意echo要使用-e选项,且后面的字符要用引号包括起来,单引号或双引号都可以 # echo -e "\e[31m红色字体" # echo -e "\033[31m红色字体" # echo -e "\x1b[31m红色字体" # echo -e "\E[31m红色字体" # 大写字母 # echo -e "\x1B[31m红色字体"
上述代码都可以显示红色字体,但是你会注意到在shell打印出echo命令中的文本之后,新的提示符仍然使用该颜色效果,需要使用重置控制码0(即ESC [ 0 m
,中间不能有空格哦)将终端重置为正常显示:
# echo ^[[31m红色字体^[[0m # echo -e "\e[31m红色字体\e[0m" # echo -e "\033[31m红色字体\033[0m" # echo -e "\x1b[31m红色字体\x1b[0m"
同时设置多个控制代码,用;
隔开,顺序无关:
1 条评论
评论者的用户名
评论时间BahuangShanren
2022-06-03T04:34:10Z网站支付到账真慢哦,建议优化一下