在使用putty、secureCRT、XShell等終端仿真器連接linux系統時,ls、vim等工具的輸出都含有各種顏色,這些顏色的輸出大大地增強了文本的可讀性。
通常我們可以使用echo命令加-e選項輸出各種顏色的文本,例如:echo -e "\033[31mRed Text\033[0m",可以輸出紅色的字體“Red Text”。其中:"\033[31m"和"\033[0m"是ANSI轉義序列(ANSI escape code/sequence),它控制文本輸出的格式、顏色等,大多數的類unix終端仿真器都能夠解釋ANSI轉義序列。
1. ANSI顏色序列格式
通用的控制文本顏色的轉義序列格式如下:
CSI n1 [;n2 [;…]] m
其中CSI全稱為“控制序列引導器”(Control Sequence Introducer/Initiator),也就是上述示例中的"\033["(其中\033是你鍵盤左上角Esc鍵對應的ascii碼(八進制));n1、n2等表示SGR參數(下面會列出一些常用的SGR參數),用於控制顏色、粗體、斜體、閃爍等文本輸出格式;m表示轉義序列結束。
注:\033是鍵盤左上角Esc鍵對應的ASCII碼(8進制),\033、\x1b和\e效果一樣, 例如:echo -e "\x1b[31mRed Text\e[0m"也輸出紅色字體“Red Text”。
常用的SRG參數列表如下:
編碼 |
說明 |
0 |
關閉所有格式,還原為初始狀態 |
1 |
粗體/高亮顯示 |
2 |
模糊(※) |
3 |
斜體(※) |
4 |
下划線(單線) |
5 |
閃爍(慢) |
6 |
閃爍(快)(※) |
7 |
交換背景色與前景色 |
8 |
隱藏(伸手不見五指,啥也看不見)(※) |
30-37 |
前景色,即30+x,x表示不同的顏色(參見下面的“顏色表”) |
40-47 |
背景色,即40+x,x表示不同的顏色(參見下面的“顏色表”) |
注:(1)其中含有(※)標注的編碼表示不是所有的終端仿真器都支持,只有少數仿真器支持。
(2)多個SGR參數可以組合使用,例如:echo -e "\x1b[31;4mRed Underline Text\e[0m"輸出紅色下划線字體“Red Underline Text”。
(3)更多參數信息請參考“ANSI escape code”。
顏色表:
顏色值x |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
顏色 |
黑 |
紅 |
綠 |
黃 |
藍 |
紫 |
青 |
白 |
2. 各種語言輸出顏色文本示例
除了shell命令可輸出顏色,其它語言中也可以使用上述ANSI轉義序列輸出顏色(前提是你使用的終端仿真器能夠解析ANSI轉義序列),以下給出幾種主要語言中輸出顏色文本的示例。
注:以下程序僅針對類unix終端有效,win32控制台不支持ANSI轉義序列,因而無效。
2.1 C程序輸出顏色示例
1 // hello.c 2 #include <stdio.h> 3 int main() { 4 printf("\033[31;4mRed Underline Text\033[0m\n"); 5 }
編譯:gcc hello.c
運行:./a.out
輸出:Red Underline Text
2.2 C++程序中輸出顏色示例
1 // hello.cpp 2 #include <iostream> 3 int main() { 4 std::cout << "\033[31;4mRed Underline Text\033[0m" << std::endl; 5 }
編譯:g++ hello.cpp
運行:./a.out
輸出:Red Underline Text
2.3 Java程序中輸出顏色示例
1 // hello.java 2 class hello { 3 public static void main(String[] args) { 4 System.out.println("\033[31;4mRed Underline Text\033[0m"); 5 } 6 }
注:Java中不能識別\e和\0x1b,僅可使用\033。
編譯:javac hello.java
運行:java hello
輸出:Red Underline Text
2.4 Python程序中輸出顏色示例
1 # hello.py 2 print "\033[31;4mRed Underline Text\033[0m"
注:python(v2.6.5)中不能識別\e,可以使用\033和\x1b。
運行:python hello.py
輸出:Red Underline Text
3. win32控制台程序輸出顏色
由於win32控制台不支持ANSI轉義序列,因此要讓win32控制台輸出顏色文本相對復雜一些。
3.1 C/C++ windows程序控制台輸出顏色
借助SetConsoleTextAttribute和GetStdHandle兩個win32 API函數輸出顏色,示例如下:
1 #include <stdio.h> 2 #include <windows.h> 3 4 int main() { 5 HANDLE hdl = GetStdHandle(STD_OUTPUT_HANDLE); 6 SetConsoleTextAttribute(hdl, FOREGROUND_RED | FOREGROUND_INTENSITY); 7 printf("Hello "); 8 SetConsoleTextAttribute(hdl, FOREGROUND_GREEN | FOREGROUND_INTENSITY); 9 printf("world!\n"); 10 11 getchar(); 12 }
其中用到的兩個API原型如下:
1 HANDLE GetStdHandle(DWORD nStdHandle); 2 BOOL SetConsoleTextAttribute(HANDLE hConsoleOutput, WORD wAttributes);
其中,GetStdHandle用於獲取屏幕緩沖區句柄(示例中獲取的是標准輸出的句柄),SetConsoleTextAttribute用於設置控制台文本屬性(第一次調用時設置前景色為紅色高亮,第二次調用時設置為綠色高亮),因此輸出結果為“Hello world!”。
GetStdHandle接口參數nStdHandle與接口返回值的含義如下:
值(nStdHandle) |
含義 |
STD_INPUT_HANDLE |
返回標准輸入的句柄 |
STD_OUTPUT_HANDLE |
返回標准輸出的句柄 |
STD_ERROR_HANDLE |
返回標准錯誤的句柄 |
注:更多信息請參考“GetStdHandle”。
SetConsoleTextAttribute()第一個參數hConsoleOutput為屏幕緩沖區句柄(可通過GetStdHandle()獲取),第二個參數wAttributes為顏色屬性。常用顏色屬性值如下(可組合使用):
屬性(wAttributes) |
說明 |
FOREGROUND_BLUE |
前景色(藍色) |
FOREGROUND_GREEN |
前景色(綠色) |
FOREGROUND_RED |
前景色(紅色) |
FOREGROUND_INTENSITY |
前景色高亮 |
BACKGROUND_BLUE |
背景色(藍色) |
BACKGROUND_GREEN |
背景色(綠色) |
BACKGROUND_RED |
背景色(紅色) |
BACKGROUND_INTENSITY |
背景色高亮 |
注:更多信息請參考“Console Screen Buffers”。
3.2 命令提示符下調整整屏顏色
命令提示符(CMD)下調整整屏顏色輸出可使用color命令,格式如下:
color BF
其中B和F表示顏色屬性(B背景色,F前景色),屬性值為一個十六進制數字(0-F)。各屬性值與顏色對應的關系如下:
屬性值 |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
顏色 |
黑 |
藍 |
綠 |
水綠 |
紅 |
紫 |
黃 |
白 |
屬性值 |
8 |
9 |
A |
B |
C |
D |
E |
F |
顏色 |
灰 |
淡藍 |
淡綠 |
淡水綠 |
淡紅 |
淡紫 |
淡黃 |
亮白 |
例如,要設置命令提示符窗口“背景色為綠色,前景色為藍色”可執行“color 21”。
3.3 PowerShell下輸出字符顏色
可參考:PowerShell輸出字符顏色
3.4 Python綁定windows接口輸出顯色
可參考:Python實現修改Windows CMD命令行輸出顏色(完全解析)