终端里的 OSC 是什么?

OSC = Operating System Command,是终端控制序列的一类,用来让程序控制终端模拟器的某些状态。

目录

  1. OSC 是什么
  2. OSC 长什么样
  3. 和 shell 命令、CSI 有什么区别
  4. 常见用途
  5. 安全注意
  6. 一句话总结

1. OSC 是什么

在 terminal、terminal emulator、xterm、VT 控制序列的语境里,OSCOperating System Command

它不是你在 shell 里输入的普通命令,而是程序写到终端输出流的一段特殊字节。终端模拟器读到它以后,会把它解释成“修改终端自身状态”的指令,而不是显示成普通文字。

例如,命令行程序可以用 OSC 设置窗口标题、发送终端超链接、查询或修改颜色、向剪贴板写入文本,或者告诉终端当前工作目录。

2. OSC 长什么样

OSC 的常见 7-bit 写法是:

ESC ] 命令编号 ; 参数 BEL

其中:

一个设置标题的例子:

printf '\033]0;Demo Title\a'

这段输出不会打印出 ]0;Demo Title,而是让支持该序列的终端把窗口标题设置为 Demo Title

3. 和 shell 命令、CSI 有什么区别

概念典型形式谁解释它作用
shell 命令lscdgit statusshell 或可执行程序运行程序、读写文件、启动进程
CSI 控制序列ESC [ 31m终端模拟器移动光标、设置文字颜色、清屏等
OSC 控制序列ESC ] 0 ; title BEL终端模拟器设置标题、颜色表、超链接、剪贴板等字符串型状态

粗略记忆:CSI 更常见于“屏幕内的显示控制”,例如颜色、光标、清屏;OSC 更常见于“终端模拟器自身的状态或扩展功能”,例如标题、调色板、剪贴板、超链接。

4. 常见用途

OSC 0 / OSC 2:设置窗口标题

printf '\033]0;project: api-server\a'
printf '\033]2;project: api-server\a'

很多 shell prompt、SSH 工具或终端集成会用它动态显示当前主机、目录或任务名。

OSC 4:设置或查询调色板颜色

# 具体支持情况取决于终端模拟器
printf '\033]4;1;rgb:ff/00/00\a'

这类序列通常用于修改终端颜色表。不同终端支持范围不完全一致。

OSC 8:终端超链接

printf '\033]8;;https://example.com\aExample\033]8;;\a'

支持 OSC 8 的终端会把 Example 显示成可点击链接。

OSC 52:剪贴板

# SGVsbG8= 是 "Hello" 的 Base64
printf '\033]52;c;SGVsbG8=\a'

OSC 52 可用于把内容写入剪贴板。由于它影响用户剪贴板,很多终端会默认关闭、限制长度,或者要求用户显式启用。

5. 安全注意

OSC 的本质是“输出就可能触发终端行为”。因此,不可信文本如果被直接输出到终端,可能不只是显示文字。

6. 一句话总结

OSC 是终端控制序列里专门传递字符串型终端命令的一类序列:程序把 ESC ] ... BEL 写到终端,终端模拟器据此设置标题、链接、颜色、剪贴板等状态。

参考