日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2025/3/15 linux 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 通过printf设置Linux终端输出的颜色和显示方式 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

? ? ?在Linux終端下調(diào)試程序時(shí),有時(shí)需要輸出大量信息。若能控制字體的顏色和顯示方式,可使輸出信息對(duì)比鮮明,便于調(diào)試時(shí)觀察數(shù)據(jù)。

? ? ?終端的字符顏色由轉(zhuǎn)義序列(Escape Sequence)控制,是文本模式下的系統(tǒng)顯示功能,與具體語(yǔ)言無關(guān)。

? ? ?本文簡(jiǎn)要介紹C語(yǔ)言中通過printf改變終端輸出的顏色和顯示方式。文中涉及的代碼運(yùn)行環(huán)境如下:

?

?

正文

? ? ?轉(zhuǎn)義序列以控制字符'ESC'開頭。該字符的ASCII碼十進(jìn)制表示為27,十六進(jìn)制表示為0x1B,八進(jìn)制表示為033。多數(shù)轉(zhuǎn)義序列超過兩個(gè)字符,故通常以'ESC'和左括號(hào)'['開頭。該起始序列稱為控制序列引導(dǎo)符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。

? ? ?通過轉(zhuǎn)義序列設(shè)置終端顯示屬性時(shí),可采用以下格式:

\033[?Param?{;Param;...}m

\e[?Param?{;Param;...}m

? ? ?其中,'\033['或'\e['引導(dǎo)轉(zhuǎn)義序列,'m'表示設(shè)置屬性并結(jié)束轉(zhuǎn)義序列。Param為屬性值,{...}表示可選(多個(gè)參數(shù)之間用分號(hào)隔開,與順序無關(guān))。例如,在Linux Shell中執(zhí)行下述命令:

? ? ?即設(shè)置輸出為紅色字體(31),白色背景(47)。選項(xiàng)'-e'為echo命令激活特殊字符的解析器。

? ? ?注意,轉(zhuǎn)義序列可被控制字符'CAN'(Cancel?)和'SUB'(Substitute)中斷。

? ? ?轉(zhuǎn)義序列相關(guān)的常用參數(shù)如下(通過man console_codes命令可查看更多的參數(shù)描述):

  • 顯示:0(默認(rèn))、1(粗體/高亮)、22(非粗體)、4(單條下劃線)、24(無下劃線)、5(閃爍)、25(無閃爍)、7(反顯、翻轉(zhuǎn)前景色和背景色)、27(無反顯)
  • 顏色:0(黑)、1(紅)、2(綠)、?3(黃)、4(藍(lán))、5(洋紅)、6(青)、7(白)

? ? ?前景色為30+顏色值,如31表示前景色為紅色;背景色為40+顏色值,如41表示背景色為紅色。

? ? 調(diào)色效果如下圖所示:

? ? ?因此,通過轉(zhuǎn)義序列設(shè)置終端顯示屬性時(shí),常見格式為:

\033[顯示方式;前景色;背景色m輸出字符串\033[0m

\e[顯示方式;前景色;背景色m輸出字符串\033[0m

? ? ?其中?,'\033[0m'用于恢復(fù)默認(rèn)的終端輸出屬性,否則會(huì)影響后續(xù)的輸出。

? ? ?此外,還有一些ANSI控制碼,如:nA?(光標(biāo)上移n行?)、nB(光標(biāo)下移n行?)、nC(光標(biāo)右移n行?)、nD?(光標(biāo)左移n行?)、2J(清屏)、K(清除從光標(biāo)到行尾的內(nèi)容)、s(保存光標(biāo)位置)、u(恢復(fù)光標(biāo)位置)、?25l(隱藏光標(biāo))、?25l(顯示光標(biāo))。

? ? ?基于常用參數(shù),可定義如下單一控制宏,用于printf系列語(yǔ)句:

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"

? ? ?編寫測(cè)試代碼驗(yàn)證轉(zhuǎn)義序列控制的效果:

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 }

? ? ?執(zhí)行結(jié)果截圖如下:

?

? ? ?因截圖所限,未能展示閃爍和光標(biāo)移動(dòng)等效果。

? ? ?注意,Linux終端下可正常顯示彩色字符。但若通過SecureCRT等Windows工具SSH登錄Linux主機(jī),則需對(duì)工具做些設(shè)置。

? ? ?以SecureCRT 6.6為例,在Options->Session Options->Terminal->Emulation頁(yè)的Terminal類型中選擇ANSI或Linux或Xterm,并勾選ANSI Color。

? ? ?然后,在Appearance頁(yè)中選擇顏色方案為Windows或Traditional。為突出測(cè)試代碼中的輸出顏色,此處選擇Windows方案(需要在Emulation頁(yè)勾選Use color scheme):

?

與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的通过printf设置Linux终端输出的颜色和显示方式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。