vscode终端默认不读取系统shell,需手动配置terminal.integrated.defaultprofile;macos/linux应设为"zsh"并用which zsh获取绝对路径;旧配置terminal.integrated.shell.*须删除,且新配置仅对新建终端生效。

VSCode终端启动时还是bash,shell配置没生效?
VSCode不会自动读取系统默认shell,它只认自己的配置项。即使你在macOS或Linux里用chsh -s $(which zsh)改了系统默认,VSCode终端仍可能拉起bash——因为它压根没去查/etc/shells或getent passwd $USER。
实操建议:
- 打开VSCode设置(
Cmd+,或Ctrl+,),搜terminal integrated default profile - 在下拉菜单里选中带
zsh的那一项(如zsh (login shell)或zsh);如果没看到,说明VSCode没自动探测到,得手动配 - 点击右上角“打开设置(JSON)”,加这一行:
"terminal.integrated.defaultProfile.linux": "zsh",
(Linux)或"terminal.integrated.defaultProfile.osx": "zsh",
(macOS) - 注意:Windows用户别配这个,
zsh在WSL以外基本跑不起来
terminal.integrated.profiles.*里zsh路径写错导致启动失败
VSCode 1.79+ 改了profile机制,不再靠硬编码路径猜shell,而是依赖你显式声明的path。如果填了不存在的路径,终端点开就报错:The terminal process failed to launch: Path to shell executable "xxx" does not exist.
常见错误现象:
- 填了
/bin/zsh但实际是/usr/bin/zsh(macOS Sonoma后移到/usr/bin) - 用了
~开头的路径,比如~/bin/zsh——VSCode不展开~,必须写绝对路径 - 在WSL里配了
/bin/zsh,但没装zsh:sudo apt install zsh漏了
查真实路径最稳的方式是终端里跑:which zsh,然后把输出原样粘过去。
为什么改了defaultProfile,新终端还是bash?
VSCode终端有两层控制:默认profile决定“点+新建终端时用哪个”,但已有终端实例不受影响。关掉所有终端标签页再新建,才走新配置。
另外容易被忽略的干扰项:
-
terminal.integrated.inheritEnv设为false时,子进程拿不到$SHELL,可能导致某些插件(比如GitLens)内部调用仍走bash - 某些远程开发场景(SSH/Containers),VSCode会优先读远程机器的
terminal.integrated.defaultProfile.linux,本地配置无效 - 如果启用了
terminal.integrated.shell.*(旧版配置),它会覆盖defaultProfile,务必删掉这行
zsh启动慢、补全卡顿,和VSCode有关吗?
无关。VSCode只是起了个zsh进程,后续所有初始化(.zshrc加载、插件、主题)都由zsh自己负责。但VSCode终端有个隐藏影响:它默认以login shell方式启动zsh,会加载/etc/zshrc和~/.zshrc,而bash默认是非login模式——这就解释了为什么换zsh后第一次打开特别慢。
优化建议:
- 检查
~/.zshrc里有没有阻塞操作(比如git status、网络请求、大文件source) - 想让VSCode终端也走非login模式?可以改profile的
args:"args": ["-i", "-c", "exec zsh -d"]
,但多数人没必要,反而可能丢掉环境变量 - 确认是否启用了
oh-my-zsh这类重型框架——它们本身启动就慢,和VSCode没关系
真正要盯住的,是zsh自身的启动耗时,不是VSCode的配置。











