跳到主要内容
ansicode

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 | sh
先保存再检视
curl -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 行可能与「粗体 + 普通色」表现一致。

渲染(浏览器)
Black Red Green Yellow Blue Magenta Cyan White
Black Red Green Yellow Blue Magenta Cyan White
原始字节(\x1b 字面形式)
\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[0m

16 个基础背景色 · SGR 40–47 / 100–107

同样八色作为背景,每格上叠对比前景以让颜色可见。bright 行(100–107)是高亮背景扩展 —— 支持广泛但 ECMA-48 从未标准化。

渲染(浏览器)
Black Red Green Yellow Blue Magenta Cyan White
Black Red Green Yellow Blue Magenta Cyan White
原始字节(\x1b 字面形式)
\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[0m

256 色调色板 · SGR 48;5;n

全部 256 个索引色,按每行 32 × 8 行排布。索引 0–15 映射上方基础 + bright 集;16–231 是 6×6×6 RGB 立方;232–255 是 24 阶灰度梯度。

渲染(浏览器)
原始字节(\x1b 字面形式)
\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[0m

24 位真彩色 · SGR 48;2;R;G;B

全饱和、全亮度下色相 0° → 360° 扫描,加 32 阶通过逐通道 RGB(非 232–255 立方)的灰度梯度。此处梯度平滑意味终端支持像素级 24 位色;若出现色带则被降采样到 256 调色板。

渲染(浏览器)
原始字节(\x1b 字面形式)
\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[0m

SGR 文本属性 · 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 忽略它们。

渲染(浏览器)
Bold Dim Italic Underline
Blink Reverse Strikethrough
bold + underline + red italic + reverse + yellow
原始字节(\x1b 字面形式)
\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[0m

OSC 0 窗口标题 · ESC ]0;标题 ST

设置终端模拟器的窗口 / 标签页标题。页面正文无可见效果 —— 运行 curl 管道脚本后请查看终端的标题栏。xterm 将 OSC 0(图标名 + 窗口标题)与 OSC 1(仅图标名)和 OSC 2(仅窗口标题)分离;现代终端将三者合并为单一标题。

副作用作用于宿主终端(窗口标题、光标位置、屏幕缓冲),无法在浏览器预览中展现。运行 curl 管道脚本以观察。

原始字节(\x1b 字面形式)
\x1b]0;ansicode test pattern\x1b\\

交互序列 · 脚本不自动执行(会打断脚本输出)

光标保存 / 恢复、备用屏幕切换、光标隐 / 显有合法用途(TUI 应用、分页器、提示符)但在 curl 管道脚本中触发它们要么空转(同一行保存 + 恢复)要么扰乱终端(进入备用屏幕后立即退出)。用 `printf` 手动尝试以观察效果。

副作用作用于宿主终端(窗口标题、光标位置、屏幕缓冲),无法在浏览器预览中展现。运行 curl 管道脚本以观察。

原始字节(\x1b 字面形式)
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'

本站对测试图样涉及的每个子系统做更深入论述的相邻页面。