OSC 7 — 当前工作目录提示
把当前 shell 所在目录告知终端 —— 用于标签名、「在此目录新开标签」、远程感知的分屏工作流。
字节形式
涵盖所有常见的字符串字面量写法,方便正反查找。
\\x1b[
\x1b]7;file://HOST/PATH\x07\\033[
\033]7;file://HOST/PATH\007\\e[
\e]7;file://HOST/PATH\aESC [
ESC ] 7 ; URL BELhex
1b 5d 37 3b ... 07说明
把 shell 当前工作目录以 file://HOST/PATH URL 形式告知终端。iTerm2、Windows Terminal、kitty、wezterm、ghostty、Konsole 与 VTE 系(gnome-terminal、foot)均已采纳。终端用途:(a) 标签/窗格名显示目录的 basename,(b) Cmd-T/「在此处新开标签」在同一 cwd 启动新 shell,(c) tmux resurrect、wezterm mux 恢复会话时把分屏窗格还原到正确目录。shell 在每次提示符前发送 —— bash 通过 PROMPT_COMMAND、zsh 通过 precmd 或 chpwd、fish 内置 __fish_cwd_osc。SSH 场景下 hostname 字段决定终端是否能在远程主机重开标签(因为重新 ssh)。
规范出处: iTerm2 Proprietary Escape Codes (OSC 7) / VTE / kitty
示例
# Emit on every prompt — bash 5+\nPROMPT_COMMAND='printf "\033]7;file://%s%s\007" "$HOSTNAME" "$PWD"'import os, socket, sys; sys.stdout.write(f'\x1b]7;file://{socket.gethostname()}{os.getcwd()}\x07')host, _ := os.Hostname(); wd, _ := os.Getwd(); fmt.Printf("\x1b]7;file://%s%s\x07", host, wd)import os from 'node:os'; process.stdout.write(`\x1b]7;file://${os.hostname()}${process.cwd()}\x07`)char host[256]; gethostname(host, sizeof host); printf("\x1b]7;file://%s%s\x07", host, getcwd(NULL, 0));在哪里用到
实际会发出该序列的工具——把抽象字节锚定到你已经用过的命令上。
- zsh, fish, bash `__vte_prompt_command`shell 在 chpwd / PROMPT_COMMAND 钩子里发出 `\x1b]7;file://hostname/abs/path\x07` —— 让宿主终端按 shell 窗格记录 cwd,供新建标签 / 窗口操作继承
- tmux `update-environment`, new-window -ctmux 从活动窗格读取 OSC 7 载荷为 `new-window` / `split-window` 设置 cwd —— `tmux new-window` 在当前 shell 目录打开,而非 tmux 的启动目录
- iTerm2, Terminal.app new-tab inheritanceiTerm2 / macOS Terminal 按 Cmd-T 时,新标签在上一个标签最近一次报告的 OSC 7 cwd 打开 —— 关闭 shell_integration 后新标签回退到 `$HOME`
- GNOME Terminal, Konsole, WezTerm pane-split cwdGTK / KDE / WezTerm 终端都消费 OSC 7,让 `Split Right` / `Split Down` / `Duplicate Tab` 在源窗格目录打开 —— URI 必须是 `file://host/...`,裸路径会被静默拒收
- VS Code integrated terminal `Open in External Terminal`VS Code 从每个终端面板读取最新 OSC 7 —— `Terminal: Open in External Terminal` 命令以集成 shell 的 cwd 启动系统终端,而非工作区根目录
常见问题
针对这条序列,开发者真正会去搜索的问题的简短回答。
- 怎样让新标签页继承当前 shell 的工作目录?
- 让 shell 在每次
chpwd/PROMPT_COMMAND时发\x1b]7;file://hostname/绝对路径\x07。iTerm2、gnome-terminal、Konsole、kitty、ghostty、wezterm、Windows Terminal 都读取 OSC 7 并作为新标签 / 分屏的 cwd 使用。Zsh 的vcs_info样式和 starship 自动发送;bash 需要PROMPT_COMMAND='printf "\033]7;file://%s%s\007" "$HOSTNAME" "$PWD"'。Fish 自 3.0 起原生支持。 - 为什么路径必须 URL 编码并带
file://,而不是裸路径? - OSC 7 由 GNOME / freedesktop 规定承载 URI 而非裸路径 —— 这样才能标识*主机*(SSH / 复用场景下终端与 shell 不在同机),并对非 ASCII / 空格做无损双向转换。发送
file://$HOSTNAME$PWD,其中$PWD做百分号编码。终端剥去 URI 前缀;若主机名与本机一致就本地解析$PWD,否则退回用户家目录。
终端支持
- 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 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 不支持 | 不支持 | 部分 | 支持 | 支持 | 不支持 | 支持 | 部分 | 支持 | 支持 | 支持 | 支持 | 部分 | 不支持 |
相关序列
在家族食谱中
OSC 食谱 · 5. Shell 提示符标记 —— `OSC 133`(FinalTerm A / B / C / D)