OSC = Operating System Command,是终端控制序列的一类,用来让程序控制终端模拟器的某些状态。
在 terminal、terminal emulator、xterm、VT 控制序列的语境里,OSC 指 Operating System Command。
它不是你在 shell 里输入的普通命令,而是程序写到终端输出流的一段特殊字节。终端模拟器读到它以后,会把它解释成“修改终端自身状态”的指令,而不是显示成普通文字。
例如,命令行程序可以用 OSC 设置窗口标题、发送终端超链接、查询或修改颜色、向剪贴板写入文本,或者告诉终端当前工作目录。
OSC 的常见 7-bit 写法是:
ESC ] 命令编号 ; 参数 BEL
其中:
ESC 是转义字符,十六进制是 0x1b,shell 里常写成 \033、\x1b 或 \e。] 表示开始一个 OSC 序列。BEL 是结束符,十六进制是 0x07,shell 里常写成 \a。ST 结束,也就是 ESC \。一个设置标题的例子:
printf '\033]0;Demo Title\a'
这段输出不会打印出 ]0;Demo Title,而是让支持该序列的终端把窗口标题设置为 Demo Title。
| 概念 | 典型形式 | 谁解释它 | 作用 |
|---|---|---|---|
| shell 命令 | ls、cd、git status | shell 或可执行程序 | 运行程序、读写文件、启动进程 |
| CSI 控制序列 | ESC [ 31m | 终端模拟器 | 移动光标、设置文字颜色、清屏等 |
| OSC 控制序列 | ESC ] 0 ; title BEL | 终端模拟器 | 设置标题、颜色表、超链接、剪贴板等字符串型状态 |
粗略记忆:CSI 更常见于“屏幕内的显示控制”,例如颜色、光标、清屏;OSC 更常见于“终端模拟器自身的状态或扩展功能”,例如标题、调色板、剪贴板、超链接。
printf '\033]0;project: api-server\a'
printf '\033]2;project: api-server\a'
很多 shell prompt、SSH 工具或终端集成会用它动态显示当前主机、目录或任务名。
# 具体支持情况取决于终端模拟器
printf '\033]4;1;rgb:ff/00/00\a'
这类序列通常用于修改终端颜色表。不同终端支持范围不完全一致。
printf '\033]8;;https://example.com\aExample\033]8;;\a'
支持 OSC 8 的终端会把 Example 显示成可点击链接。
# SGVsbG8= 是 "Hello" 的 Base64
printf '\033]52;c;SGVsbG8=\a'
OSC 52 可用于把内容写入剪贴板。由于它影响用户剪贴板,很多终端会默认关闭、限制长度,或者要求用户显式启用。
OSC 的本质是“输出就可能触发终端行为”。因此,不可信文本如果被直接输出到终端,可能不只是显示文字。
cat 来源不明的二进制文件、日志文件或转义序列样本。ESC 和 C1 控制字符。OSC 是终端控制序列里专门传递字符串型终端命令的一类序列:程序把 ESC ] ... BEL 写到终端,终端模拟器据此设置标题、链接、颜色、剪贴板等状态。