terminal color - 终端颜色控制
如果您每天使用terminal,肯定使用过一些跟颜色相关的命令, 比如ls , grep, git 等等这些命令, 颜色可以帮我们更好的识别出关心的信息。
这篇文章总结我所知道的有关终端颜色的知识。
1.常用代码
下面这些代码都是开箱即用的, 如果来不及细品,拿去用就对了
-
shell 中常用的颜色代码
color-sh.sh
#!/usr/bin/env sh
COLOR_NORMAL="\033[0m"
COLOR_GREEN="\033[1;32m"
COLOR_YELLOW="\033[1;33m"
COLOR_RED="\033[1;33m"
COLOR_GREY="\033[1;30m"
echo "${COLOR_GREEN} 绿色 ${COLOR_NORMAL}"
echo "${COLOR_RED} 红色 ${COLOR_NORMAL}"
mac 中, bash 解释的脚本, echo需要使用 -e 表示反斜线转义打开
color-bash.sh
#!/usr/bin/env bash
COLOR_NORMAL="\033[0m"
COLOR_GREEN="\033[1;32m"
COLOR_YELLOW="\033[1;33m"
COLOR_RED="\033[1;33m"
COLOR_GREY="\033[1;30m"
echo -e "${COLOR_GREEN} 绿色 ${COLOR_NORMAL}"
echo -e "${COLOR_RED} 红色 ${COLOR_NORMAL}"
在shell中还有一种兼容性更好的方式, 即使用printf
#!/usr/bin/env bash
_out_green(){
printf '\33[1;32m%b\33[0m' "$1"
}
_out_red(){
printf '\33[1;31m%b\33[0m' "$1"
}
## 黄色
_out_yellow(){
printf '\33[1;33m%b\33[0m' "$1"
}
## 蓝
_out_blue(){
printf '\33[1;34m%b\33[0m' "$1"
}
## 粉红
_out_red_little(){
printf '\33[1;35m%b\33[0m' "$1"
}
## 青
_out_green_little(){
printf '\33[1;36m%b\33[0m' "$1"
}
## 白色
_out_white(){
printf '\33[1;37m%b\33[0m' "$1"
}
_out_red "这是红色"
- python 颜色代码
def _wrap_with(code):
def inner(text, bold=False):
c = code
if bold:
c = "1;%s" % c
return "\033[%sm%s\033[0m" % (c, text)
return inner
red = _wrap_with('31')
green = _wrap_with('32')
yellow = _wrap_with('33')
blue = _wrap_with('34')
magenta = _wrap_with('35')
cyan = _wrap_with('36')
white = _wrap_with('37')
# Use example
red('Error', bold=True)
- Makefile 中使用颜色输出
## color output
NO_COLOR=\x1b[0m
OK_COLOR=\x1b[32;01m
ERROR_COLOR=\x1b[31;01m
WARN_COLOR=\x1b[33;01m
WHITE_COLOR=\x1b[1;37m
GRAY_COLOR=\x1b[0;37m
color:
@echo "${OK_COLOR} ok ${NO_COLOR}"
@echo "${ERROR_COLOR} error ${NO_COLOR}"
@echo "${WARN_COLOR} warn ${NO_COLOR}"
// make color 即可输出不同的颜色
2. 颜色控制原理
- ANSI
先来了解一个概念 -- ANSI。
最初,几乎每个终端制造商都各自添加了特定的转义序列用于执行一些特殊操作,比如把光标置于屏幕上的某个位置。举例来说,VT52终端允许通过发送ESC
字符、y
字符,后面跟上两个等于x,y位置的数值加上32的字符(这是为了从ASCII空格字符开始,并避开控制字符),将光标置于屏幕上的x,y位置。
由于这些序列对于不同的终端结果并不一样,因此人们不得不开发了一些复杂的库(比如termcap和实用程序(比如tput,以便程序可以使用同一套API应对各种终端。另外,在很多终端中需要借助字符的二进制值发送数字(如行和列)。对于某些编程语言,以及内部不使用ASCII的系统来说,把数字转换为正确的字符常常是有困难的,甚至完全做不到。
ANSI是就是这样一种控制特殊用法的公共标准。它规定了一种所有终端共享的指令集,并要求用ASCII的数字字符传递所有数值信息,用于控制linux终端上的光标位置、颜色和其他选项。在文本中嵌入确定的字节序列,大部分以ESC转义字符和"["字符开始,终端会把这些字节序列解释为相应的指令,而不是普通的字符编码。
终端颜色就是ANSI转义序的一种应用。
1.ANSI控制序列的组成
ANSI 控制序列 三部分构成:前置引导, CSI 控制序列,结束符号
ANSI组成结构图- 前置引导
前置引导器就是由ESC的ASCII码值:ESC (OCT \033 HEX \x1b) 。前置引导的作用是告诉终端,这是个控制命令,终端就不会把这个引导符号后面的文本当字符串来解释。
ESC 的转义符号有下面3个
\033 // 推荐 八进制 ASCII
\0x1B // 推荐 十六进制 ASCII
\e // 有些shell下可以使用
- CSI 控制序列
这个CSI序列主要是控制输出样式的,比如颜色, 光标等......
CSI序列由ESC [、若干个(包括0个)“参数字节”、若干个“中间字节”,以及一个“最终字节”组成。各部分的字符范围如下:
这个控制命令是个CSI序列, 通常由 “;” 分割的指令, 通常指令格式如下:
[<PREFIX>];[<COLOR>];[<TEXT DECORATION>]
// 如: [31;4
// 表示 “没有前缀;红色;下划线”
PREFIX: 使用的 256的颜色模式,后面将介绍。
COLOR: 输出颜色,前景色,背景色等
TEXT DECORATION: 文字装饰器,比如下划线等
常用的 text decoration
说明 | 代码 |
---|---|
加粗 | 1 |
下划线 | 4 |
背景色 | 3 |
- 最终符号m
最后,m指示控制序列的结尾。如 [0m,没有任何特殊参数的csi序列, 用语告诉终端, 一切恢复正常了
2.颜色代码
在过去,终端机是不同的。它们中的一些只能显示16种颜色,而有些甚至可以显示256种颜色。现在,您可能需要使用运行在可以显示超过1600万种颜色的计算机上的终端模拟器。但是,由于终端应用程序模仿较旧的终端,因此它们通常支持的颜色要少得多。例如,可以将终端应用程序设置为支持16色或256色。这些颜色的确切值取决于终端的设置。
- 要列出16色模式下的所有可用颜色,请运行:
for code in {30..37}; do \
echo -en "\x1b[${code}m"'\\x1b['"$code"'m'"\x1b[0m"; \
echo -en "\x1b[$code;1m"'\\x1b['"$code"';1m'"\x1b[0m"; \
echo -en "\x1b[$code;3m"'\\x1b['"$code"';3m'"\x1b[0m"; \
echo -en "\x1b[$code;4m"'\\x1b['"$code"';4m'"\x1b[0m"; \
echo -e "\x1b[$((code+60))m"'\\x1b['"$((code+60))"'m'"\x1b[0m"; \
done
- 常用颜色 参考
颜色 | 值 |
---|---|
Black | 0;30 |
Blue | 0;34 |
Green | 0;32 |
Cyan | 0;36 |
Red | 0;31 |
Purple | 0;35 |
Brown | 0;33 |
Blue | 0;34 |
Green | 0;32 |
Cyan | 0;36 |
Red | 0;31 |
Purple | 0;35 |
Brown | 0;33 |
参考文档- https://zh.wikipedia.org/wiki/ANSI%E8%BD%AC%E4%B9%89%E5%BA%8F%E5%88%97
https://misc.flogisoft.com/bash/tip_colors_and_formatting