# 环境 / 情景

MacOS 14.2 M1 用 VSCode 远程连接 Ubuntu 22.04

# 问题

在虚拟机上安装了 Enviroment Modules ,并按照官方配置文档配置了 bash 启动时自动加载 module 指令,ssh 远程登录虚拟机 'module' 指令可用,但是 VSCode 远程连接虚拟机发现 module 指令使用不了。

# 原因

在 VSCode 的 bash 中检查发现当前 shell 不是登录式的:

shell
shopt login_shell
# 结果为 off 不是登陆式
login_shell    	off

分析发现由于 VSCode 启动 shell 是非登陆式,参考这篇,所以没有加载 /etc/profile 文件,而该文件下包含如下内容:

shell
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 里添加单独加载指定的需要的配置文件,还可以单独自定义一个目录存放这样的配置文件并用 iffor 加载这个目录所有文件(模仿 /etc/profile 文件里的操作)。