vscode集成终端默认以非登录、非交互模式启动,不加载~/.zshrc等shell配置文件,必须通过terminal.integrated.env.*显式注入环境变量(如path、openai_api_key),否则命令找不到或变量不可见;调试器需在launch.json中单独配置env字段,且修改后须关闭所有终端标签页才能生效。

VSCode 的集成终端默认不继承你 shell 配置里的环境变量,直接改 ~/.zshrc 或 ~/.bash_profile 对它无效——必须用 terminal.integrated.env.* 显式注入,否则 OPENAI_API_KEY、NODE_ENV、自定义 PATH 全都“看不见”。
为什么 export 写在 ~/.zshrc 里,VSCode 终端却读不到
VSCode 启动终端时默认走非登录、非交互模式(zsh -c),跳过所有 shell 初始化文件。哪怕你 source ~/.zshrc 手动执行成功,新打开的 VSCode 终端也不会自动触发它。
- macOS GUI 应用(包括 VSCode)通常只读
~/.zprofile,~/.zshrc是交互式 shell 用的,不被加载 - Linux 桌面环境下可能偶然继承部分环境,但不可靠;Windows 完全不走 shell 配置文件逻辑
- 验证方法:在 VSCode 终端运行
echo $0看是否为-zsh(登录态),再跑sh -ic "echo $PATH"对比系统终端输出
terminal.integrated.env.* 怎么写才不踩坑
这是唯一跨平台、启动即生效、且优先级高于系统变量的方式。但容易因平台键错配、JSON 格式错误或路径拼接逻辑误解而失效。
- 必须按平台选键:
terminal.integrated.env.osx(不是mac或darwin)、terminal.integrated.env.linux、terminal.integrated.env.windows -
PATH不是覆盖,而是追加——漏掉${env:PATH}就只剩你写的那几段,git、python全挂掉 - macOS 示例(Homebrew 用户):
"PATH": "/opt/homebrew/bin:${env:PATH}";Windows 示例:"PATH": "C:\Program Files\nodejs;${env:PATH}"(双反斜杠或正斜杠均可) - 想清空某个变量?设为
null:"PYTHONPATH": null
调试器和终端用的不是同一套环境变量
你在终端里 export OPENAI_API_KEY=sk-xxx,F5 调试 Python/Node.js 服务时照样报 API key not found——因为调试器启动的是全新进程,完全不继承终端环境。
- 调试必须单独配:
.vscode/launch.json里每个configuration下加"env"字段,例如:"env": {"OPENAI_API_KEY": "${env:OPENAI_API_KEY}"} -
${env:VAR}只能引用已存在的变量(比如从terminal.integrated.env.osx注入的),不能执行命令或动态计算 - 别写成
environment(旧字段,已弃用);也别把env放在configurations外层,它只对当前配置生效
项目级隔离:不同测试数据该用哪一层
如果要让 A 项目用 OPENAI_API_KEY=sk-a,B 项目用 sk-b,不能靠全局 settings.json——得下沉到工作区或文件级。
- 工作区级:在
.vscode/settings.json(项目根目录下)写terminal.integrated.env.osx,仅对该文件夹生效 - 调试级:在
.vscode/launch.json里为每个configuration单独指定env,支持插值和硬编码混用 -
.env文件本身对终端无效;Node.js/Python 运行时需自己加载(如dotenv),VSCode 不介入
最常被忽略的一点:所有 terminal.integrated.env.* 修改后,必须关闭全部终端 tab 再新建,热重载不生效;而 launch.json 修改后,下次 F5 就立即生效。别在旧终端里反复 echo 验证,它已经“冻住”了。











