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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 207,248评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,681评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,443评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,475评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,458评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,185评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,451评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,112评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,609评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,083评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,163评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,803评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,357评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,357评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,590评论 1 261
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,636评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,925评论 2 344

推荐阅读更多精彩内容