Linux 終端支持 ANSI 轉義序列實現彩色文本輸出。本文介紹基本原理、常用顏色代碼、C 語言封裝函數與實用工具代碼。
格式:\033[<參數>m 或 \x1b[<參數>m
\033 / \x1b:ESC 字符(八進制/十六進制)[:控制序列引導符 (CSI)參數:顏色/屬性代碼,多參數用 ; 分隔m:設置圖形模式 (SGR)| 類別 | 代碼 | 效果 |
|---|---|---|
| 前景色 | 30-37 | 標準顏色:黑紅綠黃藍洋紅青白 |
| 90-97 | 高亮顏色(亮色版) | |
| 背景色 | 40-47 | 標準背景色 |
| 100-107 | 高亮背景色 | |
| 屬性 | 0 | 重置所有屬性(關鍵!) |
| 屬性 | 1 | 粗體/高亮 |
| 屬性 | 4 | 下劃線 |
| 屬性 | 7 | 反轉前景/背景 |
前景色 背景色 顏色
30 / 90 40 / 100 黑 / 亮黑(灰)
31 / 91 41 / 101 紅 / 亮紅
32 / 92 42 / 102 綠 / 亮綠
33 / 93 43 / 103 黃 / 亮黃
34 / 94 44 / 104 藍 / 亮藍
35 / 95 45 / 105 洋紅 / 亮洋紅
36 / 96 46 / 106 青 / 亮青
37 / 97 47 / 107 白 / 亮白
#include
// 設置前景色
void set_fg(int color) { // 30-37, 90-97
printf("\033[%dm", color);
}
// 設置背景色
void set_bg(int color) { // 40-47, 100-107
printf("\033[%dm", color);
}
// 設置屬性
void set_attr(int attr) { // 0,1,4,7
printf("\033[%dm", attr);
}
// 組合設置
void set_color(int fg, int bg, int attr) {
printf("\033[%d;%d;%dm", attr, fg, bg);
}
// 重置
void reset_color() {
printf("\033[0m");
}
// 便捷宏
#define RED() printf("\033[31m")
#define GREEN() printf("\033[32m")
#define YELLOW() printf("\033[33m")
#define BLUE() printf("\033[34m")
#define RESET() printf("\033[0m")
// 使用示例
int main() {
RED(); printf("錯誤:"); RESET(); printf("文件未找到\n");
GREEN(); printf("成功:"); RESET(); printf("操作完成\n");
YELLOW(); printf("警告:"); RESET(); printf("磁盤空間不足\n");
BLUE(); printf("信息:"); RESET(); printf("版本 1.0.0\n");
// 組合樣式
set_color(97, 41, 1); // 亮白字、紅背景、粗體
printf(" 關鍵錯誤 ");
reset_color();
printf("\n");
return 0;
}
#include
#include
#include
#include
int main(int argc, char **argv) {
if (argc < 2) {
fprintf(stderr, "Usage: %s [string2] ...\n", argv[0]);
return 1;
}
srand(time(NULL));
for (int i = 1; i < argc; i++) {
int len = strlen(argv[i]);
for (int j = 0; j < len; j++) {
// 30-37: 標準前景色;1: 粗體
int color = 30 + rand() % 8;
int attr = rand() % 2; // 0或1
printf("\033[%d;%dm%c", attr, color, argv[i][j]);
}
printf(" "); // 參數間空格
}
printf("\033[0m\n"); // 統一重置
return 0;
}
編譯運行:
$ gcc color_print.c -o color_print
$ ./color_print Hello World
# 每字符隨機顏色輸出
現代終端(GNOME Terminal, iTerm2, Windows Terminal 等)支持:
// 256 色模式
printf("\033[38;5;%dm", color_id); // 前景 0-255
printf("\033[48;5;%dm", color_id); // 背景 0-255
// 真彩色 (RGB)
printf("\033[38;2;%d;%d;%dm", r, g, b); // 前景 RGB
printf("\033[48;2;%d;%d;%dm", r, g, b); // 背景 RGB
檢測支持:檢查環境變量 COLORTERM=truecolor 或 TERM=xterm-256color。
SetConsoleMode(ENABLE_VIRTUAL_TERMINAL_PROCESSING)isatty(fileno(stdout)))// logger.h
typedef enum { LOG_DEBUG, LOG_INFO, LOG_WARN, LOG_ERROR } LogLevel;
void log_print(LogLevel level, const char* fmt, ...);
// logger.c
void log_print(LogLevel level, const char* fmt, ...) {
static const char* colors[] = { "\033[36m", "\033[32m", "\033[33m", "\033[31m" };
static const char* tags[] = { "[DEBUG]", "[INFO]", "[WARN]", "[ERROR]" };
if (!isatty(fileno(stdout))) { // 非終端不輸出顏色
colors[0] = colors[1] = colors[2] = colors[3] = "";
}
va_list args;
va_start(args, fmt);
printf("%s%s\033[0m ", colors[level], tags[level]);
vprintf(fmt, args);
printf("\n");
va_end(args);
}
ANSI 轉義序列是終端彩色輸出的標準方式。核心記住:\033[0m 必須成對使用重置,否則後續輸出將繼承顏色屬性。封裝為日誌庫或工具函數,配合 isatty 檢測,即可獲得專業級的終端輸出體驗。