使用环境模块版本 3.2.10 在模块文件中提供源 bash 脚本

使用环境模块版本 3.2.10 在模块文件中提供源 bash 脚本

我正在尝试在 CentOS 7 中将 bash 脚本作为模块加载的一部分,使用默认的环境模块包(版本 3.2.10),示例如下:

#%Module1.0#####################################################################
##
## example modulefile
##
## modulefiles/example.  Generated from null.in by configure.
##
proc ModulesHelp { } {
        global version

        puts stderr "\tThis module sets up environment for the"
        puts stderr "\texample module "
        puts stderr "\n\tVersion $version\n"
}

module-whatis   "example"


setenv EX_HOME /path/to/install
prepend-path PATH $env(EX_HOME)/bin/

source $env(EX_HOME)/configs/*.bashrc

失败并出现以下错误:

$ module load example/v1 
example/v1(21):ERROR:102: Tcl command execution failed: source $env(EX_HOME)/configs/*.bashrc

我知道模块版本 4 可以使用以下代码

source-sh bash $env(EX_HOME)/configs/*.bashrc

但是我们正在使用许多其他模块,它们都是为版本 3 编写的,我不能承担将整个系统更改为版本 4 并冒破坏功能的风险。有没有解决方法,或者在版本 3.2.10 中是否有原生方法可以做到这一点?

答案1

在 CentOS 7 上,Modules 附带一个名为的实用程序createmodule.sh,该实用程序以 sh shell 脚本作为参数,并输出与脚本执行的环境更改相对应的 modulefile 命令(如果有)。

实现您想要的目标的一种方法是在模块文件中调用此脚本,并使用一些 Tcl 代码将所做的更改保存在单独的环境变量中,以便能够在卸载模块时撤消它们。

#%Module

switch -- [module-info mode] {
    load - display {
        set sourcesh [exec /usr/share/Modules/bin/createmodule.sh test.sh]
        # remove modulefile header
        set sourcesh [string range $sourcesh 13 end] 
        eval $sourcesh
        # record content in environment to remember it when unloading
        setenv TEST_SOURCED_SCRIPT [string map {\n ;} $sourcesh]
    }
    unload {
        if {[info exists env(TEST_SOURCED_SCRIPT)]} {
            eval $env(TEST_SOURCED_SCRIPT)
            # unset variable as we are unloading
            setenv TEST_SOURCED_SCRIPT $env(TEST_SOURCED_SCRIPT)
        }
    }
}

在上面的代码片段中,test.sh通过你想要的脚本更改引用来源

这有点老套,但应该适用于简单的脚本。事实上,实现你想要的最好方法是迁移到 Modules 4.6+ 并使用新的source-shmodulefile 命令。

请注意,如果使用此选项构建了 Modules 4+ --enable-compat-version,它还会安装 Modules 3.2 版本和switchml别名,以便轻松在新旧版本的 Modules 之间切换。它可以帮助您逐步迁移。

答案2

环境2脚本命令,我们可以从脚本转换为模块文件格式。使用上面的命令,我们可以用语法 #%module 和所需的行创建模块文件(即 software-2023.1)。然后执行以下命令。例如:env2 -from bash -to modulecmdScript_path/设置>>输出路径/模块/模块文件/软件-2023.1

注意:它在模块文件中附加了脚本环境变量。

相关内容