跳到主要内容
ansicode

SGR 40–47 — 背景色(8 种基础色)

将背景色设置为 黑/红/绿/黄/蓝/品红/青/白 中的一种。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b[41m (red bg, 40–47)
\\033[\033[41m
\\e[\e[41m
ESC [ESC [ 4 1 m
hex1b 5b 34 31 6d

实时预览

在浏览器中通过与解码器相同的分词器渲染 —— 无需打开终端。

40–47

说明

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)

示例

bash
for c in 40 41 42 43 44 45 46 47; do printf "\033[${c}m  \033[0m"; done; echo
python
for c in range(40, 48): print(f'\x1b[{c}m  \x1b[0m', end='')
go
for c := 40; c <= 47; c++ { fmt.Printf("\x1b[%dm  \x1b[0m", c) }
javascript
for (let c = 40; c <= 47; c++) process.stdout.write(`\x1b[${c}m  \x1b[0m`)
c
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
支持

相关序列

在家族食谱中

SGR 食谱 · 2. 基础 16 色 —— `\x1b[31m` 那一票