调整 "module" 别名(调用 modulecmd)从 tcsh 到 bash

Adapting "module" alias (invoking modulecmd) from tcsh to 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  2>>err.log
}

function module_rm {
    /app/modules/0/bin/modulecmd bash rm  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 帕特里克

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

A shell 需要实际执行这些命令才能生效;这就是 eval 所做的。 (永远不要使用 eval,除非你相信编写生成输出的程序的人 eval 会严格对待极端情况——它 lends itself to security bugs)。

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

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

...bash 等价物是:

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