ANSI 测试图样 —— 交互式浏览器预览 + curl 管道 shell 脚本
同一字节序列的两种并行渲染。下方浏览器预览展示每一节在终端解释后的视觉效果;页首的 `curl … | sh` 命令把同一份字节流入你的真实终端,便于你定位终端模拟器到底支持哪些特性(24 位真彩色平滑度、SGR 斜体、OSC 8 超链接)。两栏的差异即可隔离出缺失的能力。
在你的终端中运行
直接管道给 `sh` 一次性运行,或者先把文件保存下来再执行。脚本是纯 POSIX sh —— 无 bash 专属语法、无 sudo、除首次 fetch 外无网络调用 —— 因此在 macOS bsd-sh、Debian dash、busybox ash 以及 bash 3.2 以后的所有版本上行为一致。
curl -fsSL https://ansicode.eversources.app/test.sh | shcurl -fsSL https://ansicode.eversources.app/test.sh -o test.sh && less -R test.sh习惯检查:`curl | sh` 很方便但意味着信任宿主返回的任意字节。先保存形式允许你用 `less -R test.sh` 在执行前阅读脚本 —— 即便对信任的网站,初次抓取也推荐这样做。脚本源码也通过页脚的仓库链接发布在 GitHub。
测试图样分节
16 个基础前景色 · SGR 30–37 / 90–97
两行 —— ECMA-48 八色集(30–37)与 xterm bright 变体(90–97)。每个现代终端都渲染两者;在传统调色板上,bright 行可能与「粗体 + 普通色」表现一致。
\x1b[30mBlack \x1b[0m\x1b[31mRed \x1b[0m\x1b[32mGreen \x1b[0m\x1b[33mYellow \x1b[0m\x1b[34mBlue \x1b[0m\x1b[35mMagenta \x1b[0m\x1b[36mCyan \x1b[0m\x1b[37mWhite \x1b[0m
\x1b[90mBlack \x1b[0m\x1b[91mRed \x1b[0m\x1b[92mGreen \x1b[0m\x1b[93mYellow \x1b[0m\x1b[94mBlue \x1b[0m\x1b[95mMagenta \x1b[0m\x1b[96mCyan \x1b[0m\x1b[97mWhite \x1b[0m16 个基础背景色 · SGR 40–47 / 100–107
同样八色作为背景,每格上叠对比前景以让颜色可见。bright 行(100–107)是高亮背景扩展 —— 支持广泛但 ECMA-48 从未标准化。
\x1b[37;40m Black \x1b[0m\x1b[30;41m Red \x1b[0m\x1b[30;42m Green \x1b[0m\x1b[30;43m Yellow \x1b[0m\x1b[30;44m Blue \x1b[0m\x1b[30;45m Magenta\x1b[0m\x1b[30;46m Cyan \x1b[0m\x1b[30;47m White \x1b[0m
\x1b[37;100m Black \x1b[0m\x1b[30;101m Red \x1b[0m\x1b[30;102m Green \x1b[0m\x1b[30;103m Yellow \x1b[0m\x1b[30;104m Blue \x1b[0m\x1b[30;105m Magenta\x1b[0m\x1b[30;106m Cyan \x1b[0m\x1b[30;107m White \x1b[0m256 色调色板 · SGR 48;5;n
全部 256 个索引色,按每行 32 × 8 行排布。索引 0–15 映射上方基础 + bright 集;16–231 是 6×6×6 RGB 立方;232–255 是 24 阶灰度梯度。
\x1b[48;5;0m \x1b[0m\x1b[48;5;1m \x1b[0m\x1b[48;5;2m \x1b[0m\x1b[48;5;3m \x1b[0m\x1b[48;5;4m \x1b[0m\x1b[48;5;5m \x1b[0m\x1b[48;5;6m \x1b[0m\x1b[48;5;7m \x1b[0m\x1b[48;5;8m \x1b[0m\x1b[48;5;9m \x1b[0m\x1b[48;5;10m \x1b[0m\x1b[48;5;11m \x1b[0m\x1b[48;5;12m \x1b[0m\x1b[48;5;13m \x1b[0m\x1b[48;5;14m \x1b[0m\x1b[48;5;15m \x1b[0m\x1b[48;5;16m \x1b[0m\x1b[48;5;17m \x1b[0m\x1b[48;5;18m \x1b[0m\x1b[48;5;19m \x1b[0m\x1b[48;5;20m \x1b[0m\x1b[48;5;21m \x1b[0m\x1b[48;5;22m \x1b[0m\x1b[48;5;23m \x1b[0m\x1b[48;5;24m \x1b[0m\x1b[48;5;25m \x1b[0m\x1b[48;5;26m \x1b[0m\x1b[48;5;27m \x1b[0m\x1b[48;5;28m \x1b[0m\x1b[48;5;29m \x1b[0m\x1b[48;5;30m \x1b[0m\x1b[48;5;31m \x1b[0m
\x1b[48;5;32m \x1b[0m\x1b[48;5;33m \x1b[0m\x1b[48;5;34m \x1b[0m\x1b[48;5;35m \x1b[0m\x1b[48;5;36m \x1b[0m\x1b[48;5;37m \x1b[0m\x1b[48;5;38m \x1b[0m\x1b[48;5;39m \x1b[0m\x1b[48;5;40m \x1b[0m\x1b[48;5;41m \x1b[0m\x1b[48;5;42m \x1b[0m\x1b[48;5;43m \x1b[0m\x1b[48;5;44m \x1b[0m\x1b[48;5;45m \x1b[0m\x1b[48;5;46m \x1b[0m\x1b[48;5;47m \x1b[0m\x1b[48;5;48m \x1b[0m\x1b[48;5;49m \x1b[0m\x1b[48;5;50m \x1b[0m\x1b[48;5;51m \x1b[0m\x1b[48;5;52m \x1b[0m\x1b[48;5;53m \x1b[0m\x1b[48;5;54m \x1b[0m\x1b[48;5;55m \x1b[0m\x1b[48;5;56m \x1b[0m\x1b[48;5;57m \x1b[0m\x1b[48;5;58m \x1b[0m\x1b[48;5;59m \x1b[0m\x1b[48;5;60m \x1b[0m\x1b[48;5;61m \x1b[0m\x1b[48;5;62m \x1b[0m\x1b[48;5;63m \x1b[0m
\x1b[48;5;64m \x1b[0m\x1b[48;5;65m \x1b[0m\x1b[48;5;66m \x1b[0m\x1b[48;5;67m \x1b[0m\x1b[48;5;68m \x1b[0m\x1b[48;5;69m \x1b[0m\x1b[48;5;70m \x1b[0m\x1b[48;5;71m \x1b[0m\x1b[48;5;72m \x1b[0m\x1b[48;5;73m \x1b[0m\x1b[48;5;74m \x1b[0m\x1b[48;5;75m \x1b[0m\x1b[48;5;76m \x1b[0m\x1b[48;5;77m \x1b[0m\x1b[48;5;78m \x1b[0m\x1b[48;5;79m \x1b[0m\x1b[48;5;80m \x1b[0m\x1b[48;5;81m \x1b[0m\x1b[48;5;82m \x1b[0m\x1b[48;5;83m \x1b[0m\x1b[48;5;84m \x1b[0m\x1b[48;5;85m \x1b[0m\x1b[48;5;86m \x1b[0m\x1b[48;5;87m \x1b[0m\x1b[48;5;88m \x1b[0m\x1b[48;5;89m \x1b[0m\x1b[48;5;90m \x1b[0m\x1b[48;5;91m \x1b[0m\x1b[48;5;92m \x1b[0m\x1b[48;5;93m \x1b[0m\x1b[48;5;94m \x1b[0m\x1b[48;5;95m \x1b[0m
\x1b[48;5;96m \x1b[0m\x1b[48;5;97m \x1b[0m\x1b[48;5;98m \x1b[0m\x1b[48;5;99m \x1b[0m\x1b[48;5;100m \x1b[0m\x1b[48;5;101m \x1b[0m\x1b[48;5;102m \x1b[0m\x1b[48;5;103m \x1b[0m\x1b[48;5;104m \x1b[0m\x1b[48;5;105m \x1b[0m\x1b[48;5;106m \x1b[0m\x1b[48;5;107m \x1b[0m\x1b[48;5;108m \x1b[0m\x1b[48;5;109m \x1b[0m\x1b[48;5;110m \x1b[0m\x1b[48;5;111m \x1b[0m\x1b[48;5;112m \x1b[0m\x1b[48;5;113m \x1b[0m\x1b[48;5;114m \x1b[0m\x1b[48;5;115m \x1b[0m\x1b[48;5;116m \x1b[0m\x1b[48;5;117m \x1b[0m\x1b[48;5;118m \x1b[0m\x1b[48;5;119m \x1b[0m\x1b[48;5;120m \x1b[0m\x1b[48;5;121m \x1b[0m\x1b[48;5;122m \x1b[0m\x1b[48;5;123m \x1b[0m\x1b[48;5;124m \x1b[0m\x1b[48;5;125m \x1b[0m\x1b[48;5;126m \x1b[0m\x1b[48;5;127m \x1b[0m
\x1b[48;5;128m \x1b[0m\x1b[48;5;129m \x1b[0m\x1b[48;5;130m \x1b[0m\x1b[48;5;131m \x1b[0m\x1b[48;5;132m \x1b[0m\x1b[48;5;133m \x1b[0m\x1b[48;5;134m \x1b[0m\x1b[48;5;135m \x1b[0m\x1b[48;5;136m \x1b[0m\x1b[48;5;137m \x1b[0m\x1b[48;5;138m \x1b[0m\x1b[48;5;139m \x1b[0m\x1b[48;5;140m \x1b[0m\x1b[48;5;141m \x1b[0m\x1b[48;5;142m \x1b[0m\x1b[48;5;143m \x1b[0m\x1b[48;5;144m \x1b[0m\x1b[48;5;145m \x1b[0m\x1b[48;5;146m \x1b[0m\x1b[48;5;147m \x1b[0m\x1b[48;5;148m \x1b[0m\x1b[48;5;149m \x1b[0m\x1b[48;5;150m \x1b[0m\x1b[48;5;151m \x1b[0m\x1b[48;5;152m \x1b[0m\x1b[48;5;153m \x1b[0m\x1b[48;5;154m \x1b[0m\x1b[48;5;155m \x1b[0m\x1b[48;5;156m \x1b[0m\x1b[48;5;157m \x1b[0m\x1b[48;5;158m \x1b[0m\x1b[48;5;159m \x1b[0m
\x1b[48;5;160m \x1b[0m\x1b[48;5;161m \x1b[0m\x1b[48;5;162m \x1b[0m\x1b[48;5;163m \x1b[0m\x1b[48;5;164m \x1b[0m\x1b[48;5;165m \x1b[0m\x1b[48;5;166m \x1b[0m\x1b[48;5;167m \x1b[0m\x1b[48;5;168m \x1b[0m\x1b[48;5;169m \x1b[0m\x1b[48;5;170m \x1b[0m\x1b[48;5;171m \x1b[0m\x1b[48;5;172m \x1b[0m\x1b[48;5;173m \x1b[0m\x1b[48;5;174m \x1b[0m\x1b[48;5;175m \x1b[0m\x1b[48;5;176m \x1b[0m\x1b[48;5;177m \x1b[0m\x1b[48;5;178m \x1b[0m\x1b[48;5;179m \x1b[0m\x1b[48;5;180m \x1b[0m\x1b[48;5;181m \x1b[0m\x1b[48;5;182m \x1b[0m\x1b[48;5;183m \x1b[0m\x1b[48;5;184m \x1b[0m\x1b[48;5;185m \x1b[0m\x1b[48;5;186m \x1b[0m\x1b[48;5;187m \x1b[0m\x1b[48;5;188m \x1b[0m\x1b[48;5;189m \x1b[0m\x1b[48;5;190m \x1b[0m\x1b[48;5;191m \x1b[0m
\x1b[48;5;192m \x1b[0m\x1b[48;5;193m \x1b[0m\x1b[48;5;194m \x1b[0m\x1b[48;5;195m \x1b[0m\x1b[48;5;196m \x1b[0m\x1b[48;5;197m \x1b[0m\x1b[48;5;198m \x1b[0m\x1b[48;5;199m \x1b[0m\x1b[48;5;200m \x1b[0m\x1b[48;5;201m \x1b[0m\x1b[48;5;202m \x1b[0m\x1b[48;5;203m \x1b[0m\x1b[48;5;204m \x1b[0m\x1b[48;5;205m \x1b[0m\x1b[48;5;206m \x1b[0m\x1b[48;5;207m \x1b[0m\x1b[48;5;208m \x1b[0m\x1b[48;5;209m \x1b[0m\x1b[48;5;210m \x1b[0m\x1b[48;5;211m \x1b[0m\x1b[48;5;212m \x1b[0m\x1b[48;5;213m \x1b[0m\x1b[48;5;214m \x1b[0m\x1b[48;5;215m \x1b[0m\x1b[48;5;216m \x1b[0m\x1b[48;5;217m \x1b[0m\x1b[48;5;218m \x1b[0m\x1b[48;5;219m \x1b[0m\x1b[48;5;220m \x1b[0m\x1b[48;5;221m \x1b[0m\x1b[48;5;222m \x1b[0m\x1b[48;5;223m \x1b[0m
\x1b[48;5;224m \x1b[0m\x1b[48;5;225m \x1b[0m\x1b[48;5;226m \x1b[0m\x1b[48;5;227m \x1b[0m\x1b[48;5;228m \x1b[0m\x1b[48;5;229m \x1b[0m\x1b[48;5;230m \x1b[0m\x1b[48;5;231m \x1b[0m\x1b[48;5;232m \x1b[0m\x1b[48;5;233m \x1b[0m\x1b[48;5;234m \x1b[0m\x1b[48;5;235m \x1b[0m\x1b[48;5;236m \x1b[0m\x1b[48;5;237m \x1b[0m\x1b[48;5;238m \x1b[0m\x1b[48;5;239m \x1b[0m\x1b[48;5;240m \x1b[0m\x1b[48;5;241m \x1b[0m\x1b[48;5;242m \x1b[0m\x1b[48;5;243m \x1b[0m\x1b[48;5;244m \x1b[0m\x1b[48;5;245m \x1b[0m\x1b[48;5;246m \x1b[0m\x1b[48;5;247m \x1b[0m\x1b[48;5;248m \x1b[0m\x1b[48;5;249m \x1b[0m\x1b[48;5;250m \x1b[0m\x1b[48;5;251m \x1b[0m\x1b[48;5;252m \x1b[0m\x1b[48;5;253m \x1b[0m\x1b[48;5;254m \x1b[0m\x1b[48;5;255m \x1b[0m24 位真彩色 · SGR 48;2;R;G;B
全饱和、全亮度下色相 0° → 360° 扫描,加 32 阶通过逐通道 RGB(非 232–255 立方)的灰度梯度。此处梯度平滑意味终端支持像素级 24 位色;若出现色带则被降采样到 256 调色板。
\x1b[48;2;255;0;0m \x1b[0m\x1b[48;2;255;25;0m \x1b[0m\x1b[48;2;255;51;0m \x1b[0m\x1b[48;2;255;77;0m \x1b[0m\x1b[48;2;255;102;0m \x1b[0m\x1b[48;2;255;128;0m \x1b[0m\x1b[48;2;255;153;0m \x1b[0m\x1b[48;2;255;179;0m \x1b[0m\x1b[48;2;255;204;0m \x1b[0m\x1b[48;2;255;230;0m \x1b[0m\x1b[48;2;255;255;0m \x1b[0m\x1b[48;2;229;255;0m \x1b[0m\x1b[48;2;204;255;0m \x1b[0m\x1b[48;2;179;255;0m \x1b[0m\x1b[48;2;153;255;0m \x1b[0m\x1b[48;2;128;255;0m \x1b[0m\x1b[48;2;102;255;0m \x1b[0m\x1b[48;2;77;255;0m \x1b[0m\x1b[48;2;51;255;0m \x1b[0m\x1b[48;2;26;255;0m \x1b[0m\x1b[48;2;0;255;0m \x1b[0m\x1b[48;2;0;255;25m \x1b[0m\x1b[48;2;0;255;51m \x1b[0m\x1b[48;2;0;255;76m \x1b[0m\x1b[48;2;0;255;102m \x1b[0m\x1b[48;2;0;255;128m \x1b[0m\x1b[48;2;0;255;153m \x1b[0m\x1b[48;2;0;255;179m \x1b[0m\x1b[48;2;0;255;204m \x1b[0m\x1b[48;2;0;255;229m \x1b[0m\x1b[48;2;0;255;255m \x1b[0m\x1b[48;2;0;229;255m \x1b[0m\x1b[48;2;0;204;255m \x1b[0m\x1b[48;2;0;178;255m \x1b[0m\x1b[48;2;0;153;255m \x1b[0m\x1b[48;2;0;128;255m \x1b[0m\x1b[48;2;0;102;255m \x1b[0m\x1b[48;2;0;76;255m \x1b[0m\x1b[48;2;0;51;255m \x1b[0m\x1b[48;2;0;26;255m \x1b[0m\x1b[48;2;0;0;255m \x1b[0m\x1b[48;2;25;0;255m \x1b[0m\x1b[48;2;51;0;255m \x1b[0m\x1b[48;2;76;0;255m \x1b[0m\x1b[48;2;102;0;255m \x1b[0m\x1b[48;2;128;0;255m \x1b[0m\x1b[48;2;153;0;255m \x1b[0m\x1b[48;2;179;0;255m \x1b[0m\x1b[48;2;204;0;255m \x1b[0m\x1b[48;2;230;0;255m \x1b[0m\x1b[48;2;255;0;255m \x1b[0m\x1b[48;2;255;0;230m \x1b[0m\x1b[48;2;255;0;204m \x1b[0m\x1b[48;2;255;0;179m \x1b[0m\x1b[48;2;255;0;153m \x1b[0m\x1b[48;2;255;0;128m \x1b[0m\x1b[48;2;255;0;102m \x1b[0m\x1b[48;2;255;0;76m \x1b[0m\x1b[48;2;255;0;51m \x1b[0m\x1b[48;2;255;0;25m \x1b[0m
\x1b[48;2;0;0;0m \x1b[0m\x1b[48;2;8;8;8m \x1b[0m\x1b[48;2;16;16;16m \x1b[0m\x1b[48;2;25;25;25m \x1b[0m\x1b[48;2;33;33;33m \x1b[0m\x1b[48;2;41;41;41m \x1b[0m\x1b[48;2;49;49;49m \x1b[0m\x1b[48;2;58;58;58m \x1b[0m\x1b[48;2;66;66;66m \x1b[0m\x1b[48;2;74;74;74m \x1b[0m\x1b[48;2;82;82;82m \x1b[0m\x1b[48;2;90;90;90m \x1b[0m\x1b[48;2;99;99;99m \x1b[0m\x1b[48;2;107;107;107m \x1b[0m\x1b[48;2;115;115;115m \x1b[0m\x1b[48;2;123;123;123m \x1b[0m\x1b[48;2;132;132;132m \x1b[0m\x1b[48;2;140;140;140m \x1b[0m\x1b[48;2;148;148;148m \x1b[0m\x1b[48;2;156;156;156m \x1b[0m\x1b[48;2;165;165;165m \x1b[0m\x1b[48;2;173;173;173m \x1b[0m\x1b[48;2;181;181;181m \x1b[0m\x1b[48;2;189;189;189m \x1b[0m\x1b[48;2;197;197;197m \x1b[0m\x1b[48;2;206;206;206m \x1b[0m\x1b[48;2;214;214;214m \x1b[0m\x1b[48;2;222;222;222m \x1b[0m\x1b[48;2;230;230;230m \x1b[0m\x1b[48;2;239;239;239m \x1b[0m\x1b[48;2;247;247;247m \x1b[0m\x1b[48;2;255;255;255m \x1b[0mSGR 文本属性 · 1 / 2 / 3 / 4 / 5 / 7 / 9
粗体(1)、暗(2)、斜体(3)、下划线(4)、闪烁(5)、反色(7)、删除线(9)。斜体与删除线是 ECMA-48 从未标准化的 xterm 扩展 —— 大多数现代终端(kitty、alacritty、iTerm2、WezTerm、GNOME 终端)两者皆支持;传统 BSD 控制台与 Windows conhost 忽略它们。
\x1b[1mBold\x1b[0m \x1b[2mDim\x1b[0m \x1b[3mItalic\x1b[0m \x1b[4mUnderline\x1b[0m
\x1b[5mBlink\x1b[0m \x1b[7mReverse\x1b[0m \x1b[9mStrikethrough\x1b[0m
\x1b[1;4;31mbold + underline + red\x1b[0m \x1b[3;7;33mitalic + reverse + yellow\x1b[0mOSC 8 超链接 · ESC ]8;;URL ST 文本 ESC ]8;; ST
现代终端(iTerm2 3.1+、kitty、WezTerm、Alacritty 0.11+、GNOME 终端、foot)尊重 OSC 8 超链接封装,让下方文本在分页器中表现得像 HTML 锚点。传统终端(Windows conhost 2023 之前、Terminal.app、xterm)显示惰性字节,无任何链接装饰。
before \x1b]8;;https://ansicode.eversources.app\x1b\\ansicode.eversources.app\x1b]8;;\x1b\\ afterOSC 0 窗口标题 · ESC ]0;标题 ST
设置终端模拟器的窗口 / 标签页标题。页面正文无可见效果 —— 运行 curl 管道脚本后请查看终端的标题栏。xterm 将 OSC 0(图标名 + 窗口标题)与 OSC 1(仅图标名)和 OSC 2(仅窗口标题)分离;现代终端将三者合并为单一标题。
副作用作用于宿主终端(窗口标题、光标位置、屏幕缓冲),无法在浏览器预览中展现。运行 curl 管道脚本以观察。
\x1b]0;ansicode test pattern\x1b\\交互序列 · 脚本不自动执行(会打断脚本输出)
光标保存 / 恢复、备用屏幕切换、光标隐 / 显有合法用途(TUI 应用、分页器、提示符)但在 curl 管道脚本中触发它们要么空转(同一行保存 + 恢复)要么扰乱终端(进入备用屏幕后立即退出)。用 `printf` 手动尝试以观察效果。
副作用作用于宿主终端(窗口标题、光标位置、屏幕缓冲),无法在浏览器预览中展现。运行 curl 管道脚本以观察。
DECSC / DECRC (save + restore cursor): printf '\\033[s' ; printf 'AAA' ; printf '\\033[u'
Alt-screen on / off (DEC mode 1049): printf '\\033[?1049h' ; sleep 2 ; printf '\\033[?1049l'
Hide / show cursor (DEC mode 25): printf '\\033[?25l' ; sleep 2 ; printf '\\033[?25h'
Bracketed-paste mode (DEC mode 2004): printf '\\033[?2004h' ; cat ; printf '\\033[?2004l'相关参考
本站对测试图样涉及的每个子系统做更深入论述的相邻页面。