# 环境 / 情景
MacOS 14.2 M1 用 VSCode 远程连接 Ubuntu 22.04
# 问题
在虚拟机上安装了 Enviroment Modules ,并按照官方配置文档配置了 bash 启动时自动加载 module
指令,ssh 远程登录虚拟机 'module' 指令可用,但是 VSCode 远程连接虚拟机发现 module
指令使用不了。
# 原因
在 VSCode 的 bash 中检查发现当前 shell 不是登录式的:
shopt login_shell | |
# 结果为 off 不是登陆式 | |
login_shell off |
分析发现由于 VSCode 启动 shell 是非登陆式,参考这篇,所以没有加载 /etc/profile
文件,而该文件下包含如下内容:
if [ -d /etc/profile.d ]; then | |
for i in /etc/profile.d/*.sh; do | |
if [ -r $i ]; then | |
. $i | |
fi | |
done | |
unset i | |
fi |
因此也没有加载 /etc/profile.d/
目录下的文件,自然也没有加载 Enviroment Modules 官方文档配置的 /etc/profile.d/modules.sh
或 /etc/profile.d/modules.csh
这些 Linux Link。导致了 VSCode 的终端无法使用 'module' 指令。
去官方文档搜索找到了一个 open 的 issue :https://github.com/microsoft/vscode-remote-release/issues/8484 ,也是同样的问题,暂时没有解决。
# 临时解决方案
暂时无法从 VSCode 这一远程连接服务端解决,那就只能:
- 要么从控制端解决,每次 VSCode 打开一个 shell 后手动输指令加载
/etc/profile
文件 - 要么从受控端解决
- 在 Ubuntu 里编辑
/etc/bash.bashrc
或~/.bashrc
让它加载/etc/profile
等 login shell 才能加载的文件,虽然保证了 VSCode 的 shell 环境能够与 login shell 一致更方便了,但是这么做修改了系统设计可能会导致其他问题。 - 更安全的做法是单独在
/etc/bash.bashrc
或~/.bashrc
里添加单独加载指定的需要的配置文件,还可以单独自定义一个目录存放这样的配置文件并用if
、for
加载这个目录所有文件(模仿/etc/profile
文件里的操作)。
- 在 Ubuntu 里编辑