SGR 40–47 — 背景色(8 种基础色)
将背景色设置为 黑/红/绿/黄/蓝/品红/青/白 中的一种。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b[41m (red bg, 40–47)\033[41m\e[41mESC [ 4 1 m1b 5b 34 31 6d实时预览
在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。
说明
8 种基础背景色镜像 30–37,位于参数 40–47:40 黑、41 红、42 绿、43 黄、44 蓝、45 品红、46 青、47 白。SGR 49 将背景色重置为终端默认值 —— 是整体 \x1b[0m 重置的精准补集。ECMA-48 §8.3.117 规定了范围;上面支持矩阵中的每个终端都完整支持,包括 Linux console(8 色模式)与 ConPTY。和前景色一样,实际 RGB 完全取决于终端配色方案 —— 不存在标准的「ANSI 红背景」—— 用户主题可以任意重映射 8 个色槽。亮背景变体在 SGR 100–107(aixterm 扩展,见 sgr-bg-bright);索引型 256 色背景用 \x1b[48;5;Nm,24 位 RGB 用 \x1b[48;2;R;G;Bm。把基础背景和基础前景在同一序列里链起来:\x1b[31;47m 是「白底红字」(分号是分隔符,不是序列结束符)。
背景色特有的两个陷阱比前景更常见。(1)背景色会填充单元:在发换行前不重置背景,背景填充会在多数终端上一直延续到行尾 —— 你的「红色标签」就会变成一条延伸到文本之后的红色长条。换行前永远先发 \x1b[49m(关背景)或 \x1b[0m。(2)加了颜色后,朴素的宽度算术会破坏对齐:printf '%-20s' 和 len(string) 会把 4–7 个不可打印的 SGR 字节计入宽度,结果是彩色单元看起来比非彩色单元短。修法是先剥离 ANSI 再单独度量可见宽度 —— TUI 库(rich、blessed、lipgloss、ratatui)会代你处理,但裸 printf 不会。和所有彩色输出一样:发送前用 isatty(stdout) 守门,并尊重 NO_COLOR=1;否则在开发机上看起来正常的脚本会把 SGR 字节漏到日志文件和 CI 抓取里(见 no-color)。Linux console / fbcon 上只渲染基础 16 背景色 —— \x1b[48;5;Nm 与 \x1b[48;2;R;G;Bm 会被静默量化到最近邻。
精准关闭背景用 \x1b[49m —— 不动前景与其他属性。规范关闭对是 \x1b[41m…\x1b[49m;用 \x1b[0m 会抹掉你不打算抹的东西。需要超出 8 色槽的精细控制:sgr-bg-256(256 色调色板)或 sgr-bg-truecolor(24 位 RGB)—— 二者同样要遵守「换行前必重置」的规则。对应的前景一侧见 sgr-fg-basic;aixterm 风格终端额外暴露的亮背景变体见 sgr-bg-bright。如果你想用一条「连同同一段内所有 SGR 属性一并清空」的文本重置,sgr-reset(\x1b[0m)就是那个广义关闭。
规范出处: ECMA-48 §8.3.117 (SGR parameters 40–47, 49)
示例
for c in 40 41 42 43 44 45 46 47; do printf "\033[${c}m \033[0m"; done; echofor c in range(40, 48): print(f'\x1b[{c}m \x1b[0m', end='')for c := 40; c <= 47; c++ { fmt.Printf("\x1b[%dm \x1b[0m", c) }for (let c = 40; c <= 47; c++) process.stdout.write(`\x1b[${c}m \x1b[0m`)for (int c = 40; c <= 47; c++) printf("\x1b[%dm \x1b[0m", c);在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- man设置 LESS_TERMCAP_so 后,部分分页器对 NAME / SYNOPSIS 等节标题加背景
- less--status-column 状态栏的背景
- vim, neovimStatusLine、SignColumn、Search 高亮组
- git diff --color-moved (alt-bg on moved blocks)
- htop, btop column header rows
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 为什么 macOS Terminal 默认配置下
\x1b[41m看起来不是红色? - SGR 40–47 不携带 RGB —— 它们是调色板索引 0–7,槽位实际显示什么颜色由终端配置决定。macOS Terminal 的默认 Basic 配置把槽位 1(红色)映射成偏暗的栗红(约
#990000)以便在白底上易读;iTerm2 Solarized 和xterm默认把槽位 1 画得明显更亮。若要跨用户配置保持稳定色相,请改用真彩色 ——\x1b[48;2;255;0;0m,见sgr-bg-truecolor。永远不要假设 40–47 对应某个具体 RGB。 \x1b[49m只重置背景,还是清空整个 SGR 状态?- 只重置背景。SGR 49 把背景设回终端默认值;前景、加粗、斜体、下划线等不受影响 —— 见
sgr-default-bg。要彻底清空所有属性请用 SGR 0(\x1b[0m);要更窄的关闭则组合写(\x1b[39;49m清两色但保留字重和下划线)。把 49 当作背景通道的 try/finally 关闭码,与开启它的那条配对使用。
终端支持
- xterm
- 支持
- Linux console (fbcon)
- 支持
- macOS Terminal.app
- 支持
- iTerm2
- 支持
- Windows Terminal
- 支持
- cmd.exe / ConPTY
- 支持
- kitty
- 支持
- alacritty
- 支持
- WezTerm
- 支持
- Ghostty
- 支持
- GNOME Terminal
- 支持
- Konsole
- 支持
- tmux
- 支持
- GNU screen
- 支持
| xterm | Linux console (fbcon) | macOS Terminal.app | iTerm2 | Windows Terminal | cmd.exe / ConPTY | kitty | alacritty | WezTerm | Ghostty | GNOME Terminal | Konsole | tmux | GNU screen |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 | 支持 |