fish 与 module 的结合
背景
之前一直使用 Fish Shell
来作为生产力,但是在本校的集群环境下,其中有个痛点就行不支持原生的 module
, 因为之前系统安装的版本过低,所以需着手解决这个问题。
定位问题
首先根据集群的 官方文档 所述:
export PATH="/public/home/software/opt/moudles/Modules/3.2.10/bin/:/opt/ibm/lsf/10.1/linux3.10-glibc2.17-x86_64/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin"
source /public/home/software/opt/moudles/Modules/3.2.10/init/bash
这两行一个是添加了 module 的路径,一个是初始化 module.
但是在 Fish
环境下,不可能 source ***.bash
, 然后查看目录 /public/home/software/opt/moudles/Modules/3.2.10/init/
, 发现并没有 fish
对应的初始化的脚本。
查看 module
的 官方更新文档, 发现更新后的版本已经支持 fish
了。
所以解决方式就是安装一个用户的 module
.
安装 module
根据官网的 文档, 安装步骤如下:
下载解压
$ curl -LJO https://github.com/cea-hpc/modules/releases/download/v5.3.1/modules-5.3.1.tar.gz
$ tar xfz modules-5.3.1.tar.gz
$ cd modules-5.3.1
编译安装
./configure --prefix=/path/to/your/diy_dir/ ## 这里要指定用户的目录才有权限
make
make install
配置
首先需要做之前提到的初始化,对应的命令是:
source YOUR_PREFIX/init/fish
为了每次登陆都生效,可以写到 fish 的 config 中,添到 ~/.config/fish/config.fish
文件即可。
这样一来,就可以运行 module 了,并且还做好了命令补全:
添加 modulefiles
最重要的就是要添加集群已经配置好的 modulefiles, 好在即使 module 的版本在更新,但是 modulefiles 还是可以共用的。
寻找集群已配置的环境变量,查阅 /public/home/software/opt/moudles/Modules/3.2.10/init/bash
文件,发现如下配置:
MODULESHOME=/public/home/software/opt/moudles/Modules/3.2.10
MODULEPATH=`sed -n's/[ #].*$//; /./H; $ { x; s/^\n//; s/\n/:/g; p; }' ${MODULESHOME}/init/.modulespath`
export MODULEPATH
这样可以直接拿到 $MODULEPATH
这个环境变量,然后把添加到自己安装的 module 的 init 脚本中即可。
示例如下,修改 ~/modules/init/fish
文件:
...
### add by wwj ###
set -xg MODULEPATH /public/home/software/opt/bio/modules/all/:/public/home/software/opt/database/:/public/home/software/opt/genomes/
### end ###
...
这样环境变量每次初始化就会加载。 可以达到原生的 module 的效果
总结
这种方法可以在不修改系统环境的情况下,在 Fish
环境下使用 module
, 并支持命令 / 软件名自动补,整体配置简单快速。