在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 终端输出颜色的更多相关文章

  1. 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量

    背景 ​ 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目.提示的目的,那么如何在Linux终端输出带有颜色的字体呢? Linux终端输出字符颜色 ​ ...

  2. php 扫描url死链接 \033[31m ANSI Linux终端输出带颜色

    * 从Packagist上搜索需要的包 https://packagist.org/ * 通过composer下载依赖包 composer require guzzlehttp/guzzlecompo ...

  3. 修改Linux终端提示符颜色

    修改Linux终端提示符颜色 作者:Eric 微信:loveoracle11g [root@linux-node2 ~]# tail -1 .bashrc PS1='[\[\033[1;31m\]\u ...

  4. 通过printf设置Linux终端输出的颜色和显示方式

    转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...

  5. Linux 终端下颜色的输出

    在命令行下也能产生五颜六色的字体和图案,只需要加上一些颜色代码,例如 echo -e "\033[41;36m 红底绿字\033[0m" 其中41的位置代表底色, 36的位置是代表 ...

  6. SecureCRT设置linux终端显示颜色

    在linux系统上,我们使用终端时,对于文件或目录会显示不同的颜色.而SecureCRT默认显示的颜色是单一的,我们该如何让其像linux一样显示个性化颜色呢. 使用SecureCRT登录 linux ...

  7. Linux终端提示符颜色设置

    将以下语句添加到用户目录下的 .bashrc 文件中,然后执行 source .bashrc 使其立即生效. PS1='${debian_chroot:+($debian_chroot)}\[\033 ...

  8. Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)

    齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...

  9. 设置Linux终端字体颜色

    系统启动后,环境变量加载的顺序为:/etc/profile → /etc/profile.d/*.sh → ~/.bash_profile → ~/.bashrc → /etc/bashrc 想要修改 ...

随机推荐

  1. HTML5 Canvas火焰效果 像火球发射一样

    Canvas是HTML5中非常重要而且有用的东西,我们可以在Canvas上绘制任意的元素,就像你制作Flash一样.今天我们就在Canvas上来制作一款火焰发射的效果.就像古代的火球炮一样,而且可以在 ...

  2. MATLAB出现:错误使用 xlsread (line 251)

    背景: matlab 2015b和Excel2003 方法: 改Excel的Com加载项 步骤: 1   2  3   4 

  3. Eclipse安装图形JFrame,Jswing编程界面

    打开eclipse,选择help--->install new software 来源http://www.cnblogs.com/xiaobo-Linux/p/7954274.html 打开网 ...

  4. 阿里云centos7安装桌面环境

    centos7. 1.安装X11.yum groupinstall "X Window System". 2.安装gnome. 全安装:yum groupinstall -y &q ...

  5. Libertarian

    Libertarians as the real god-son has the consistent faith of humanity freedom. The super libertarian ...

  6. scala实现相邻两个元素挑换位置的代码,哈哈

    import scala.math._ import breeze.plot._ import breeze.linalg._ import scala.collection.mutable.Arra ...

  7. 关于Struts2的文件上传

    要实现Struts2框架的文件上传,需要用到2个jar包 commons-fileupload-1.2.2.jar commons-io-2.0.1.jar 由于文件解析Struts2内部已经帮我们做 ...

  8. 移动端网页使用flexible.js加入百度联盟广告样式不一致问题解决

    flexible.js是淘宝推出的一款移动端手机自适应的库,源码内容很简洁,当网页使用了该库之后,页面会在head中加入对应的页面响应式的meta标签. 当使用flexible.js的时候,引入百度联 ...

  9. 远程执行命令和文件分发shell脚本

    deploy.conf node01,all,other,datanode,journalnode,zookeeper, node02,all,other,datanode,journalnode,z ...

  10. bashrc profile的区别

    bashrc与profile的区别 bashrc和profile的差异在于:1. bashrc是在系统启动后就会自动运行.2. profile是在用户登录后才会运行.3. 进行设置后,可运用sourc ...