vscode环境变量需分层配置:终端启动前确保系统变量就位,settings.json仅影响内置终端,launch.json/tasks.json须单独配置env字段,远程开发需修改~/.profile并显式source。

不能直接在 VSCode 启动命令行参数里注入全局环境变量——code 命令本身不接受 --env 或类似参数。真正起作用的,是「启动 VSCode 进程前,让系统环境变量就位」,或「在 VSCode 内部配置中显式覆盖」。
从终端启动时确保环境变量已加载
VSCode 继承的是它所运行的父进程的环境,不是你 shell 配置文件里“写了但没生效”的变量。
- 不要双击图标或 Spotlight 启动 VSCode:GUI 环境通常不加载
~/.zshrc、~/.bash_profile里的export - 必须在已正确初始化的终端中执行:
code .(macOS/Linux)或code(Windows Terminal 中) - 验证是否生效:在该终端中先运行
echo $ANTHROPIC_API_KEY或printenv PATH,有输出再启 VSCode - Windows 用户注意:PowerShell 的
$env:PATH不会自动被 CMD 子进程继承,建议统一用 Windows Terminal + PowerShell 启动
在 settings.json 中静态注入终端环境变量
适用于不想改系统级配置、或需为不同项目设不同值的场景。注意:这只影响 VSCode 内置终端,不影响调试器或任务进程。
- 打开设置(
Cmd+,或Ctrl+,),搜索terminal.integrated.env - 根据系统选择对应字段:
terminal.integrated.env.osx/.linux/.windows - 写法必须是对象格式,且要手动拼接原有值:
"ANTHROPIC_API_KEY": "sk-xxx", "PATH": "${env:PATH}:/opt/mytools/bin" - 修改后需关闭所有已打开的集成终端,新建一个才生效;仅重启窗口不够
launch.json 和 tasks.json 中必须单独配 env
调试器(F5)和构建任务(Ctrl+Shift+B)启动的是全新进程,完全不继承终端环境 —— 这是设计行为,不是 bug。
- 在
.vscode/launch.json的每个configurations项内加"env"字段,例如:"env": {"LOG_LEVEL": "debug", "DATABASE_URL": "sqlite:///dev.db"} - 在
.vscode/tasks.json的options.env下配置,如:"options": {"env": {"RUSTUP_HOME": "/Users/me/.rustup"}} - 别漏掉
${env:PATH}:硬编码"PATH": "/usr/local/bin"会丢掉系统原有路径,导致gcc、python找不到 - 字段名必须是
env,不是environment(后者是旧版已弃用)
远程开发(SSH / Dev Containers)要绕过非交互式 shell 陷阱
Remote-SSH 默认用非交互式 shell 启动,.zshrc 里的 export 不执行,.profile 才是可靠入口点。
- 在远程主机上编辑
~/.profile,把关键变量写进去:export ANTHROPIC_BASE_URL="https://api.your-proxy.com" - 确保
~/.profile显式 source.zshrc(如果依赖其中定义):if [ -f "$HOME/.zshrc" ]; then source "$HOME/.zshrc"; fi - VSCode Remote 连接后,先在集成终端里运行
source ~/.profile测试,再重载窗口 - 仍不生效?直接在
launch.json的env里写死,优先级最高,最可控
最容易被忽略的一点:环境变量的「作用域链」不是扁平的,而是分层叠加的 —— 系统级 > 用户 shell 配置 > VSCode settings.json > launch.json/tasks.json。你以为改了全局,其实只在某一层生效;而调试器永远只认最后一层显式声明的 env。











