linux 终端输出颜色
Posted lpfuture
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 终端输出颜色相关的知识,希望对你有一定的参考价值。
在Linux终端下调试程序时,有时需要输出大量信息。若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。
终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。
转义序列以控制字符\'ESC\'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以\'ESC\'和左括号\'[\'开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由\'\\033[\'或\'\\e[\'代替。
通过转义序列设置终端显示属性时,可采用以下格式:
\\033[ Param {;Param;...}m 或 \\e[ Param {;Param;...}m
其中,\'\\033[\'或\'\\e[\'引导转义序列,\'m\'表示设置属性并结束转义序列。Param为属性值,{...}表示可选(多个参数之间用分号隔开,与顺序无关)。
注意,转义序列可被控制字符\'CAN\'(Cancel )和\'SUB\'(Substitute)中断。
转义序列相关的常用参数如下(通过man console_codes命令可查看更多的参数描述):
显示:0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)
颜色:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)
前景色为30+颜色值,如31表示前景色为红色;背景色为40+颜色值,如41表示背景色为红色。
调色效果如下图所示:
因此,通过转义序列设置终端显示属性时,常见格式为:
\\033[显示方式;前景色;背景色m输出字符串\\033[0m 或 \\e[显示方式;前景色;背景色m输出字符串\\033[0m
此外,还有一些ANSI控制码,如:nA (光标上移n行 )、nB(光标下移n行 )、nC(光标右移n行 )、nD (光标左移n行 )、2J(清屏)、K(清除从光标到行尾的内容)、s(保存光标位置)、u(恢复光标位置)、?25l(隐藏光标)、?25l(显示光标)。 其中 ,\'\\033[0m\'用于恢复默认的终端输出属性,否则会影响后续的输出。
基于常用参数,可定义如下单一控制宏,用于printf系列语句:
1 #define NONE "\\e[0m" 2 #define BLACK "\\e[0;30m" 3 #define L_BLACK "\\e[1;30m" 4 #define RED "\\e[0;31m" 5 #define L_RED "\\e[1;31m" 6 #define GREEN "\\e[0;32m" 7 #define L_GREEN "\\e[1;32m" 8 #define BROWN "\\e[0;33m" 9 #define YELLOW "\\e[1;33m" 10 #define BLUE "\\e[0;34m" 11 #define L_BLUE "\\e[1;34m" 12 #define PURPLE "\\e[0;35m" 13 #define L_PURPLE "\\e[1;35m" 14 #define CYAN "\\e[0;36m" 15 #define L_CYAN "\\e[1;36m" 16 #define GRAY "\\e[0;37m" 17 #define WHITE "\\e[1;37m" 18 19 #define BOLD "\\e[1m" 20 #define UNDERLINE "\\e[4m" 21 #define BLINK "\\e[5m" 22 #define REVERSE "\\e[7m" 23 #define HIDE "\\e[8m" 24 #define CLEAR "\\e[2J"
25 #define CLRLINE "\\r\\e[K" //or "\\e[1K\\r"
编写测试代码验证转义序列控制的效果:
1 int main(void) 2 { 3 printf("This is a character control test!\\n" ); 4 sleep(3); 5 printf("[%2u]" CLEAR "CLEAR\\n" NONE, __LINE__); 6 7 printf("[%2u]" BLACK "BLACK " L_BLACK "L_BLACK\\n" NONE, __LINE__); 8 printf("[%2u]" RED "RED " L_RED "L_RED\\n" NONE, __LINE__); 9 printf("[%2u]" GREEN "GREEN " L_GREEN "L_GREEN\\n" NONE, __LINE__); 10 printf("[%2u]" BROWN "BROWN " YELLOW "YELLOW\\n" NONE, __LINE__); 11 printf("[%2u]" BLUE "BLUE " L_BLUE "L_BLUE\\n" NONE, __LINE__); 12 printf("[%2u]" PURPLE "PURPLE " L_PURPLE "L_PURPLE\\n" NONE, __LINE__); 13 printf("[%2u]" CYAN "CYAN " L_CYAN "L_CYAN\\n" NONE, __LINE__); 14 printf("[%2u]" GRAY "GRAY " WHITE "WHITE\\n" NONE, __LINE__); 15 16 printf("[%2u]\\e[1;31;40m Red \\e[0m\\n", __LINE__); 17 18 printf("[%2u]" BOLD "BOLD\\n" NONE, __LINE__); 19 printf("[%2u]" UNDERLINE "UNDERLINE\\n" NONE, __LINE__); 20 printf("[%2u]" BLINK "BLINK\\n" NONE, __LINE__); 21 printf("[%2u]" REVERSE "REVERSE\\n" NONE, __LINE__); 22 printf("[%2u]" HIDE "HIDE\\n" NONE, __LINE__); 23 24 printf("Cursor test begins!\\n" ); 25 printf("=======!\\n" ); 26 sleep(10); 27 printf("[%2u]" "\\e[2ACursor up 2 lines\\n" NONE, __LINE__); 28 sleep(10); 29 printf("[%2u]" "\\e[2BCursor down 2 lines\\n" NONE, __LINE__); 30 sleep(5); 31 printf("[%2u]" "\\e[?25lCursor hide\\n" NONE, __LINE__); 32 sleep(5); 33 printf("[%2u]" "\\e[?25hCursor display\\n" NONE, __LINE__); 34 sleep(5); 35 36 printf("Test ends!\\n" ); 37 sleep(3); 38 printf("[%2u]" "\\e[2ACursor up 2 lines\\n" NONE, __LINE__); 39 sleep(5); 40 printf("[%2u]" "\\e[KClear from cursor downward\\n" NONE, __LINE__); 41 42 return 0 ; 43 }
执行结果截图如下:
以上是关于linux 终端输出颜色的主要内容,如果未能解决你的问题,请参考以下文章