Linux下終端控制台字體顏色
在使用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轉義序列。
通用的控制文本顏色的轉義序列格式如下:
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 |
顏色 | 黑 | 紅 | 綠 | 黃 | 藍 | 紫 | 青 | 白 |
演示代碼非常簡單,直接按照上面組合輸入就行:
fmt.Println("\033[31;4mRed Underline Text\033[0m\n")
下面有對這個功能的簡單封裝:
https://github.com/xcltapestry/xclpkg/blob/master/clcolor/clcolor.go
參考資料:
Linux終端輸出顏色控制
http://blog.chinaunix.net/uid-29555318-id-4479619.html
給終端來點彩色(c語言和Golang版)
http://studygolang.com/articles/2032
Linux終端輸出顏色控制
http://ju.outofmemory.cn/entry/26528
WIN下終端控制台字體顏色
win控制台不支持ANSI轉義序列,因此要讓win32控制台輸出顏色文本相對復雜一些。
這里我們借助SetConsoleTextAttribute和GetStdHandle兩個win32 API函數輸出顏色,示例如下:
WIN下控制台輸出帶顏色的文本:
代碼:
package main
import (
"fmt"
"syscall"
)
type (
HANDLE uintptr
WORD uint16
DWORD uint32
)
const (
STD_OUTPUT_HANDLE = 0xFFFFFFF5
FOREGROUND_BLUE = 0x01
FOREGROUND_GREEN = 0x02
FOREGROUND_RED = 0x04
FOREGROUND_INTENSITY = 0x08
BACKGROUND_BLUE = 0x10
BACKGROUND_GREEN = 0x20
BACKGROUND_RED = 0x40
BACKGROUND_INTENSITY = 0x80
)
var (
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
procGetStdHandle = modkernel32.NewProc("GetStdHandle")
procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
)
func GetStdHandle(nStdHandle DWORD) HANDLE {
ret, _, _ := procGetStdHandle.Call(uintptr(nStdHandle))
return HANDLE(ret)
}
func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes WORD) bool {
ret, _, _ := procSetConsoleTextAttribute.Call(
uintptr(hConsoleOutput),
uintptr(wAttributes))
return ret != 0
}
func main() {
for color := 0; color < 8; color++ {
textbackground(color)
fmt.Printf("This is color %d\n", color)
fmt.Printf("Press any key to continue\n")
fmt.Scanln()
}
}
func textbackground(color int) {
hOut := GetStdHandle(STD_OUTPUT_HANDLE)
SetConsoleTextAttribute(hOut, WORD(color))
}
執行效果截圖:
參考資料:
Python實現修改Windows CMD命令行輸出顏色(完全解析)
http://my.oschina.net/bluefly/blog/311209
Linux終端和win32控制台文本顏色輸出
http://www.cnblogs.com/crabxx/p/4046498.html
Golang如何在終端輸出帶顏色的字體?
http://www.epooll.com/archives/770/