通过printf设置Linux终端输出的颜色和显示方式
前言
在Linux终端下调试程序时,有时需要输出大量信息。若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。
终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。
本文简要介绍C语言中通过printf改变终端输出的颜色和显示方式。文中涉及的代码运行环境如下:
正文
转义序列以控制字符'ESC'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以'ESC'和左括号'['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。
通过转义序列设置终端显示属性时,可采用以下格式:
\033[ Param {;Param;...}m 或 \e[ Param {;Param;...}m |
其中,'\033['或'\e['引导转义序列,'m'表示设置属性并结束转义序列。Param为属性值,{...}表示可选(多个参数之间用分号隔开,与顺序无关)。例如,在Linux Shell中执行下述命令:
即设置输出为红色字体(31),白色背景(47)。选项'-e'为echo命令激活特殊字符的解析器。
注意,转义序列可被控制字符'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 |
其中 ,'\033[0m'用于恢复默认的终端输出属性,否则会影响后续的输出。
此外,还有一些ANSI控制码,如:nA (光标上移n行 )、nB(光标下移n行 )、nC(光标右移n行 )、nD (光标左移n行 )、2J(清屏)、K(清除从光标到行尾的内容)、s(保存光标位置)、u(恢复光标位置)、?25l(隐藏光标)、?25l(显示光标)。
基于常用参数,可定义如下单一控制宏,用于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终端下可正常显示彩色字符。但若通过SecureCRT等Windows工具SSH登录Linux主机,则需对工具做些设置。
以SecureCRT 6.6为例,在Options->Session Options->Terminal->Emulation页的Terminal类型中选择ANSI或Linux或Xterm,并勾选ANSI Color。
然后,在Appearance页中选择颜色方案为Windows或Traditional。为突出测试代码中的输出颜色,此处选择Windows方案(需要在Emulation页勾选Use color scheme):
通过printf设置Linux终端输出的颜色和显示方式相关推荐
- linux 屏幕输出 高亮_通过printf设置Linux终端输出的颜色和显示方式
转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html 在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出 ...
- 花里胡哨,如何在Linux终端输出带有颜色的字体,将带颜色的字体赋值给变量...
背景 在日常操作Linux的情况下,总会遇到一些需求,比如说,把输出的内容用不同颜色标注出来,以达到醒目.提示的目的,那么如何在Linux终端输出带有颜色的字体呢? Linux终端输出字符颜色 ...
- linux终端用什么颜色好,linux 终端输出颜色
在Linux终端下调试程序时,有时需要输出大量信息.若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据. 终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式 ...
- linux终端输出c语言程序,Linux终端程序用c语言实现改变输出的字的颜色
颜色代码: 格式: echo "\033[字背景颜色;字体颜色m字符串\033[0m" 例如: echo "\033[41;36m something here \033 ...
- 修改linux终端命令行颜色+PS1设置
默认的linux终端命令行风格就是黑白,不容易区分输出内容,很容易看花眼.学习修改linux终端命令行颜色的方法,自己对那些方法进行了验证,最终找到了有效的修改linux终端命令行颜色的方法. 1.P ...
- ANSI最全介绍linux终端字体改变颜色等
ANSI最全介绍linux终端字体改变颜色等 ANSI转义序列 维基百科,自由的百科全书 由于国内不能访问wiki而且国内关于ANSI的介绍都是简短的不能达到,不够完整所以转wiki到此博客,方便国内 ...
- 修改linux终端命令行颜色
最近一直在使用 linux操作系统(Ubuntu16)学习 Docker,在使用过程中发现命令的输入输出均是白色,很容易看花眼,而且不容易区分输入与输出内容.于是下定决心,修改 linux 终端命令行 ...
- 设定printf在终端输出的颜色
转载: https://www.cnblogs.com/yirenyang/p/4653661.html https://blog.csdn.net/yangguihao/article/detail ...
- Linux终端中各种颜色的含义
在初学Linux终端命令ll或ls时,我们会得到所要查询目录下的文件信息,如下图查看/dev/目录下的文件信息: 我们从上图可以看到/dev/下的文件或文件夹都有各自的颜色,其实在这里不同颜色代表不同 ...
最新文章
- “分布式哈希”和“一致性哈希”的概念与算法实现
- 微软在C# 8中引入预览版可空引用类型
- oracle常用sql命令
- ThreadPoolExecutor里面4种拒绝策略--CallerRunsPolicy
- di容器_DI容器是代码污染者
- opengl学习笔记 (一)
- C++安全方向(三)3.3 openssl的MD5接口调用演示
- 超声波的四个特性_超声波传感器,超声波的特性
- Perl语言的常用符号
- Python 操作 DB2 库_亲测可用
- dell 7040m 黑苹果_618晒单如何打造一台万元级10代酷睿黑苹果
- ctf 实验吧 围在栅栏中的爱 (最近一直在好奇一个问题,QWE到底等不等于ABC? )
- android SharePreference缓存存储List<Bean>
- 三、JavaSE_集合(Set)
- 高中计算机 数制 教案,1.2.2 二进制与数制转换
- python 计算离散点的微分和积分(超详细)
- 华大HC32F460系列填坑之USART
- (一)、写一个怪物的类,类中有属性姓名(name),攻击力(attack),有打人的方法(fight)。(方法的重写)...
- 使用canvas制作绘图板
- 内存对齐的规则以及作用 verygood!的一篇文章!