终端不自动激活虚拟环境是因为terminal.integrated.profiles仅定义shell启动命令,不会执行环境初始化脚本;需通过terminal.integrated.shellArgs配合wrapper脚本(如./.vscode/activate.sh)显式source或exec,并关闭inheritEnv以确保PATH正确。

终端不自动激活虚拟环境?检查工作区 settings.json 是否写了 terminal.integrated.profiles.*
VSCode 的终端 Profile(如 bash、zsh)本身只定义 shell 启动命令,**不会自动执行项目级环境初始化脚本**。很多人误以为只要在 settings.json 里配了 terminal.integrated.profiles.zsh 就能加载 .envrc 或 venv/bin/activate,其实不行——它只是换了个 shell,没跑任何激活逻辑。
真正起作用的是:terminal.integrated.env.* + 启动脚本组合。比如想让 Python 项目终端自动进 venv,得靠 terminal.integrated.shellArgs.zsh 加上自定义 wrapper 脚本,而不是指望 Profile 自己“聪明”。
-
terminal.integrated.profiles.zsh只控制用什么命令启动 shell,例如"command": "zsh" -
terminal.integrated.shellArgs.zsh才能传参,比如["-i", "-c", "source ./activate.sh && exec zsh"] - 但注意:
shellArgs在 Windows PowerShell 下行为不同,且不支持多行命令;推荐统一用 wrapper 脚本(如./.vscode/launch-terminal.sh)
为什么 nvm use 或 pyenv local 在 VSCode 终端里不生效
因为 VSCode 终端默认以非登录、非交互模式启动 shell(即不读 ~/.zshrc),而 nvm、pyenv、direnv 都依赖 shell profile 里的初始化代码。全局设置 terminal.integrated.env.* 也救不了——它只能注入变量,不能运行命令。
- 根本解法:在工作区
.vscode/settings.json中配置terminal.integrated.shellArgs,强制让它走登录模式(-l)或显式 source 配置文件 - 更可靠的做法:写一个项目级启动脚本(如
./.vscode/activate.sh),里面按顺序执行direnv allow、nvm use、source venv/bin/activate,再exec $SHELL - 别把逻辑塞进
~/.zshrc里判断当前路径——VSCode 终端的$PWD启动时可能还不是项目根目录,容易错判
工作区 settings.json 和 Profile 设置谁优先
Profile 级设置(比如你在 frontend-dev Profile 里设的 terminal.integrated.defaultProfile.linux)只决定「默认选哪个 shell」,而工作区 .vscode/settings.json 中的 terminal.integrated.* 配置会**完全覆盖** Profile 里的同名项。也就是说,项目级配置永远赢。
- 如果你想让某个项目固定用
zsh并自动激活环境,必须在该项目的.vscode/settings.json里写死terminal.integrated.defaultProfile.linux和terminal.integrated.shellArgs.zsh - Profile 适合管「我这个人习惯用什么字体、是否开 copilot、默认终端是 zsh 还是 fish」;项目环境必须下沉到工作区配置
- 如果同时用了
direnv,记得在.envrc里加export PATH和export NODE_OPTIONS等,否则 VSCode 终端即使进了 shell,node命令仍可能指向系统版本
终端启动后 PATH 还是错的?检查 terminal.integrated.inheritEnv
VSCode 默认继承父进程环境变量,但某些桌面环境(GNOME、KDE)下,从图标启动的 VSCode 可能没拿到完整的 shell 环境,导致 PATH 缺失 nvm 或 pyenv 路径。这时 inheritEnv: true 反而是陷阱。
- 显式关掉它:
"terminal.integrated.inheritEnv": false,再通过terminal.integrated.env.LINUX或启动脚本重置PATH - 验证方式:新开终端,运行
echo $PATH,对比系统终端输出;若缺失~/.nvm/versions/node/或~/.pyenv/shims,就是继承出问题 - 终极保险:在 wrapper 脚本第一行加上
export PATH="$HOME/.nvm/versions/node/$(nvm version)/bin:$PATH",绕过所有环境继承逻辑
Profile 本身不管理终端环境,它只管扩展、UI、快捷键;终端环境的隔离必须靠工作区配置 + 启动脚本双落地。最容易被忽略的一点是:即使你用 code --profile backend 打开项目,终端也不会因此自动切换 Node.js 版本——那还得靠 .vscode/settings.json 里那一堆 shellArgs 和脚本配合。











