背景
最近在使用 VSCode 配合 Remote-SSH 插件连接远程服务器开发时,我遇到了一个非常顽固的问题。
问题描述
我在服务器的 .bashrc 文件中删除了某个环境变量(例如 ANTHROPIC_AUTH_TOKEN)。按理说,彻底退出 VSCode 并重新连接服务器后,这个变量应该消失才对。
然而,奇怪的事情发生了:在 VSCode 中打开新的集成终端(Integrated Terminal),该变量依然存在,且能被正常读取。
排查过程
起初我以为是服务器缓存问题,但我做了一个对比测试:
- VSCode 集成终端:变量依然存在(异常)。
- iTerm2 直连服务器:变量已消失(符合预期)。
- 检查配置:确认没有在 VSCode 的
terminal.integrated.env.linux中手动配置过该变量。
这让我 100% 确信:这是 VSCode 集成终端特有的机制导致的。
原因分析
经过一番搜索,我发现这是 VSCode 集成终端的环境继承(Inheritance)机制在作祟。VSCode 为了保持会话的一致性,默认会缓存并继承初始连接时的环境变量,即使你在 .bashrc 中做了修改,新开的终端窗口有时仍会“继承”旧的快照。
参考讨论:SegmentFault 相关问答
解决方案
解决办法非常简单,只需要强制 VSCode 不继承环境即可。在 settings.json 中添加以下配置:
{
"terminal.integrated.inheritEnv": false
}
保存后重启 VSCode 终端,困扰许久的“幽灵变量”终于彻底消失了。