跳到主要内容
ansicode

OSC 7 — 当前工作目录提示

把当前 shell 所在目录告知终端 —— 用于标签名、「在此目录新开标签」、远程感知的分屏工作流。

字节形式

涵盖所有常见的字符串字面量写法,方便正反查找。

\\x1b[\x1b]7;file://HOST/PATH\x07
\\033[\033]7;file://HOST/PATH\007
\\e[\e]7;file://HOST/PATH\a
ESC [ESC ] 7 ; URL BEL
hex1b 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 通过 precmdchpwd、fish 内置 __fish_cwd_osc。SSH 场景下 hostname 字段决定终端是否能在远程主机重开标签(因为重新 ssh)。

规范出处: iTerm2 Proprietary Escape Codes (OSC 7) / VTE / kitty

示例

bash
# Emit on every prompt — bash 5+\nPROMPT_COMMAND='printf "\033]7;file://%s%s\007" "$HOSTNAME" "$PWD"'
python
import os, socket, sys; sys.stdout.write(f'\x1b]7;file://{socket.gethostname()}{os.getcwd()}\x07')
go
host, _ := os.Hostname(); wd, _ := os.Getwd(); fmt.Printf("\x1b]7;file://%s%s\x07", host, wd)
javascript
import os from 'node:os'; process.stdout.write(`\x1b]7;file://${os.hostname()}${process.cwd()}\x07`)
c
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
不支持

相关序列

在家族食谱中

OSC 食谱 · 5. Shell 提示符标记 —— `OSC 133`(FinalTerm A / B / C / D)