首页 > 解决方案 > 将“模块”别名(调用 modulecmd)从 tcsh 调整为 bash

问题描述

在 tcsh 中,我可以运行如下命令:

 module add jdk/1.8.0_162 

...使用这样定义的别名:

alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'

我正在尝试为 bash 获得与此等效的内容。


目前,我已经尝试为每个子命令创建一个单独的 bash 函数,如下所示:

function module_add {
    /app/modules/0/bin/modulecmd bash add $1 2>>err.log
}

function module_rm {
    /app/modules/0/bin/modulecmd bash rm $1 2>>err.log
}

function module_list {
    /app/modules/0/bin/modulecmd bash list
}

java -version
module_list
module_rm 'j2re'
module_add 'jdk/1.8.0_162'
module_add 'gtk+/2.24.17'
module_list
java -version

我可以确定程序调用已经执行,因为不存在的模块(出于测试目的添加)gtk+/2.24.17 在 err.log 中创建了一个条目。

但是, java -version 仍然显示相同的旧版本,并且 module_list 不显示任何新模块。一切都在 tcsh 中运行良好(我使用模块添加别名代替)。我尝试了不同版本的模块命令。测试的最新版本是 3.2.10。结果在 RHEL6 和 RHEL7 上是一样的

任何想法如何解决这个问题?

编辑

基于一些聪明的评论,我尝试对 tcsh 使用完全相同的命令

/app/modules/0/bin/modulecmd tcsh add jdk/1.8.0_162

它给出了相同的结果。任何知道该命令和命令之间区别的人

module add jdk/1.8.0_162 

在tcsh?

所以我想问题是关于 modulescmd 与 tcsh 别名有何不同module add

BR帕特里克

标签: linuxbashtcshenvironment-modules

解决方案


modulecmd在其标准输出上发出 shell 脚本(因此参数告诉它为哪个 shell 生成脚本)。

shell需要实际执行这些命令才能生效;这就是这样eval做的。eval(除非您相信编写生成您要输出的程序的人对eval极端情况很严格,否则永远不要使用- 它会导致安全错误)。

因此,如果该命令的现有 tcsh 别名module是:

alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'

... bash 等价物是:

module() { eval "$(/app/modules/0/bin/modulecmd bash "$@")"; }

推荐阅读