OSC 9 ; 4 — ConEmu 进度指示器(Windows Terminal / Ghostty)
把实时进度百分比 / 暂停 / 错误状态推送到任务栏或标签图标 —— ConEmu 协议,被 Windows Terminal 1.18+ 标准化。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\x1b]9;4;<state>;<percent>\x07\033]9;4;<state>;<percent>\007\e]9;4;<state>;<percent>\aESC ] 9 ; 4 ; STATE ; N BEL1b 5d 39 3b 34 3b ... 3b ... 07说明
ConEmu 把 OSC 9 重用为进度条 —— 与 iTerm2 的 OSC 9 ; <消息> 通知(slug osc-notification)不同;第二个 token ;4 是消歧符。终端将进度状态转发给所在的环境 UI:Windows Terminal 更新任务栏图标(Windows 11 统一进度 UX);Ghostty / WezTerm 给标签指示器上色;ConEmu 在标题栏画一条水平进度条。四种状态(;4; 后第一个数字):
- 0 —— 移除 / 清除进度(显式复位)。
- 1 —— 正常进度,<percent> 0–100 —— 默认线性进度条。
- 2 —— 错误状态,<percent> 0–100 —— 进度条转红,用于带进度的构建失败。
- 3 —— 不确定 —— <percent> 忽略;渲染不定形旋转 / 流条。
- 4 —— 警告 / 暂停,<percent> 0–100 —— 黄色。
用法:长时间 CLI 命令(docker pull、cargo build、ffmpeg 转码、apt 类安装器)在每个有意义步骤后发 OSC 9 ; 4 ; 1 ; <pct>,成功时发 OSC 9 ; 4 ; 0。失败时:OSC 9 ; 4 ; 2 ; <最后 pct>,用户确认后可选再发 0。不支持的终端静默丢弃 —— 可无条件发送。关键细节:\x1b]9; 前缀与 iTerm2 通知 OSC 9 撞名;几乎所有同时实现两者的模拟器以是否带 ;4 作判别,所以完整发送 \x1b]9;4;<state>;<pct>\x07,不要缩写。
规范出处: ConEmu OSC 9;4 / Windows Terminal 1.18+ / Ghostty
参数
| state | 0 移除、1 正常、2 错误、3 不确定、4 警告 / 暂停。 |
| percent | 0–100 整数(state=3 不确定时忽略;1/2/4 必需)。 |
示例
# Build-progress wrapper:\nfor pct in 10 30 60 90; do\n make step-$pct\n printf '\033]9;4;1;%d\007' "$pct"\ndone\nprintf '\033]9;4;0\007' # clear on successimport sys, time\nfor pct in range(0, 101, 5):\n sys.stdout.write(f'\x1b]9;4;1;{pct}\x07'); sys.stdout.flush()\n time.sleep(0.05)\nsys.stdout.write('\x1b]9;4;0\x07')// Indeterminate while waiting on the network:\nfmt.Print("\x1b]9;4;3\x07")\ndoSlowFetch()\nfmt.Print("\x1b]9;4;0\x07")// Error red-bar at 50%:\nprocess.stdout.write('\x1b]9;4;2;50\x07')/* Warning / paused state at 75%: */\nprintf("\x1b]9;4;4;75\x07"); fflush(stdout);在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- winget install发 `\x1b]9;4;1;<percent>\x07` 让 Windows Terminal 在任务栏图标上画绿色进度段 —— 无需聚焦即可从任务栏一眼看到安装进度
- PowerShell Write-Progress现代 PSReadLine 把 `Write-Progress` 桥接到 OSC 9;4 —— pwsh 脚本里的进度条在 Windows Terminal 上自动作为任务栏进度显示
- npm, pnpm, yarn install progressNode 终端库(`npmlog`、`gauge`)在 `COLORTERM` 提示 Windows Terminal 时可选发出 OSC 9;4 —— 长时间安装在任务栏进度旁同时绘制
- robocopy /tee, MSBuild publishrobocopy 的 `/tee` 管道与 MSBuild 发布目标在新版 Win11 上都用 OSC 9;4 包装进度 —— 复制或构建完成即使提示符被切到后台也会在任务栏显示
- ConEmu, Cmder (origin of OSC 9;4)ConEmu 首创 `\x1b]9;4;<state>;<value>\x07` 家族 —— 微软为 Windows Terminal 兼容性原封不动地采纳,所以为 ConEmu 进度 API 写的任何工具在 WT 中无需修改即可运行
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 哪些终端真正显示
OSC 9;4进度?长什么样? - Windows Terminal(1.20+)、ConEmu、较新的 WezTerm 会把 OSC 9;4 渲染为任务栏 / 标签进度指示器 —— Windows 在任务栏按钮上画进度条,WezTerm 在标签标题里画。iTerm2 有独立的私有形式(
OSC 1337;)。Linux 终端(gnome-terminal、konsole、xterm)和 macOS Terminal.app 完全忽略 OSC 9;4。不存在可移植的进度序列 —— 通过\x1b]9;4;0;0\x07(清除状态)配合 XTVERSION 等已知查询做特性探测后再决定是否发送,或退回 TTY 级进度条。 OSC 9;4;state;percent里 state 值 0–4 各自代表什么?- 0 = 清除 / 无进度(隐藏指示器);1 = 普通进度(使用
percent);2 = 错误(红色进度条,按percent);3 = 不确定 / 转圈(无百分比);4 = 警告 / 暂停(黄色进度条,按percent)。Windows Terminal 全支持;ConEmu 把 4 当 1。任务结束时必须再发 state 0 —— 进程退出后任务栏还卡在 100% 是常见 UX 缺陷。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 不支持 | 不支持 | 不支持 | 不支持 | 支持 | 不支持 | 部分 | 不支持 | 支持 | 支持 | 不支持 | 不支持 | 部分 | 不支持 |