1. 简介
在UNIX/Linux系统下进行计算时,不可避免地会接触到各种环境变量。编译程序时,需要通过环境变量来指定编译器、编译选项和依赖库的位置。运行程序时,也需要通过环境变量来查找可执行文件和动态链接库。管理环境变量成为一件重要且棘手的事情。
最简单的管理环境变量的方法是直接在~/.bashrc中添加相应设置。但这种方法存在明显的缺点:容易拼写错误、添加或删除设置后需要重新登录才能生效、bashrc文件冗长等。大型超算中心通常使用Environment Modules系统来解决这个问题。对于个人电脑、自己组装的工作站和小型集群软件环境简单的场景,使用Environment Modules系统显得有些大材小用。在这里,我们提供一个环境变量管理程序bmod,该程序全部由bash语言编写,主体仅有150行左右,但实现了一个Environment Modules系统最基本的功能。下面介绍其安装和使用方法。
2. 安装
3. 使用
3.1 通过命令行添加和移除设置
3.1.1 使用预定义的环境变量
与程序编译和运行相关的环境变量众多,不仅难记,还容易拼错。bmod中预定义了常见的环境变量。以安装在$HOME/soft/lib/fftw-3.3.8下面的fftw库为例,为使该库能正常工作,需要手动输入一系列命令来设置环境变量。而在bmod中,上述设置只需一行命令即可:set_mod add pkg $HOME/soft/lib/fftw-3.3.8。移除设置只需运行:set_mod rm pkg $HOME/soft/lib/fftw-3.3.8。
目前bmod中预定义的类型和对应的环境变量包括:bin、lib、inc、py等,具体含义和使用方法详见文档。
3.1.2 使用自定义的环境变量
3.2 通过脚本添加和移除设置
程序在编译和运行过程中会涉及很多库,需要多次输入set_mod和set_env命令。以siesta为例,加载设置时需要输入一系列命令。而在bmod中,可以通过脚本用同一套命令完成加载和卸载两种操作。在bmod目录下新建一个bash脚本,如siesta-v4.1-b4.sh,把相关的命令存进去,并用$1替换add或rm。加载设置时输入:bmod add siesta-v4.1-b4,卸载时输入:bmod rm siesta-v4.1-b4。bmod会自动把$1替换成add或rm。
除了add/rm外,bmod命令还支持如下选项:av(列出所有可用脚本)、ls(列出所有已加载脚本)、cl(卸载已加载的脚本)、pg(卸载所有脚本)。更多使用方法详见文档。
4. 补充说明
4.1 常见环境变量及报错信息
常见环境变量包括PATH、LD_RUN_PATH、LIBRARY_PATH、LD_LIBRARY_PATH、C_INCLUDE_PATH、CPLUS_INCLUDE_PATH等。若未正确设置这些环境变量,可能会遇到类似以下错误:
(1)无法找到可执行程序;
(2)无法找到编译所需的库文件;
(3)无法找到运行程序所需的动态链接库;
(4)无法找到编译或运行程序所需的头文件。
这些环境变量的具体作用和报错信息详见文档。
4.2 注意事项
目前bmod存在一个问题:对已加载模块的冲突检查功能缺失。如果加载的模块之间存在依赖或冲突关系,可能会导致某些模块无法正常使用。为了解决这个问题,可以选择使用功能更强大的Environment Modules系统或个人开发的Pmod