terminal.integrated.env.* 是正解,因其在终端启动时直接注入环境变量,优先级高于系统配置且不依赖 shell 初始化流程,支持跨平台分设、JSON 类型(含 null 清除)、${env:VAR} 继承语法,并避免 shellArgs 弃用与 .zshrc 执行不确定性问题。

VSCode 的集成终端默认不继承系统环境变量(尤其是 macOS/Linux 的 shell 配置文件或 Windows 的用户变量),直接在 settings.json 里写 "env" 是最可靠、最可控的方式。
为什么 terminal.integrated.env.* 设置项才是正解
VSCode 提供了专门的终端环境变量配置入口:terminal.integrated.env.linux、terminal.integrated.env.osx、terminal.integrated.env.windows。它们会在终端启动时注入,且优先级高于系统默认值,不会被 shell 初始化脚本覆盖。
- 不依赖 shell 启动流程(比如
~/.zshrc是否被 sourced) - 对所有集成终端实例生效(包括新建的 tab、分屏)
- 支持 JSON 值类型:字符串、
null(用于清除某变量) - Windows 上注意路径分隔符用
\或正斜杠/,避免反斜杠转义问题
怎么在 settings.json 中正确添加自定义变量
打开 VSCode 设置(Cmd+, / Ctrl+,),点击右上角「打开设置 (JSON)」图标,直接编辑 settings.json:
{
"terminal.integrated.env.osx": {
"PATH": "/usr/local/bin:/opt/homebrew/bin:${env:PATH}",
"RUSTUP_HOME": "/Users/you/.rustup",
"MY_API_KEY": "dev-key-123"
},
"terminal.integrated.env.linux": {
"PATH": "/home/user/bin:${env:PATH}"
},
"terminal.integrated.env.windows": {
"NODE_ENV": "development",
"JAVA_HOME": "C:/Program Files/Java/jdk-17"
}
}
-
${env:PATH}是关键语法:读取当前 VSCode 进程已有的PATH,再拼接新路径,避免覆盖 - 变量名区分大小写,Windows 下也建议全大写以保持一致性
- 如果想清空某个变量(比如禁用
http_proxy),设为"http_proxy": null
为什么改 shellArgs 或靠 ~/.zshrc 不推荐
有人尝试用 terminal.integrated.shellArgs.osx 加 -i 强制交互模式,或指望 .zshrc 自动 export 变量——这在 VSCode 里往往失效。
- VSCode 启动时可能以非登录、非交互方式调用 shell,
.zshrc不一定执行 -
shellArgs在新版 VSCode 中已被弃用(v1.89+ 报 warning),且无法控制变量注入时机 - 某些变量(如
LD_LIBRARY_PATH)若在 shell 启动后才 set,动态链接器可能已错过加载时机 - 团队协作时,硬编码在 shell 配置里不如集中管理在
settings.json或工作区.vscode/settings.json里清晰
工作区级变量 vs 用户级变量的区别
环境变量最好按作用域拆分:全局工具链放用户设置,项目专用变量(如 REACT_APP_API_URL)放进工作区 .vscode/settings.json。
- 工作区设置会随项目 Git 提交(可加
.gitignore过滤敏感值),便于统一开发环境 - 用户级设置里的
env对所有项目生效,适合PATH、EDITOR等通用变量 - 两者叠加时,工作区设置会覆盖用户设置中同名变量
- 敏感值(如 API key)别硬编码进 JSON,应结合
dotenv插件或本地密钥管理器
真正麻烦的不是加变量,而是搞清它什么时候、以什么顺序、被哪个进程读到——terminal.integrated.env.* 绕过了 shell 初始化的不确定性,是唯一能稳稳命中集成终端启动瞬间的钩子。











