将tcsh的“模块”别名(调用modulecmd)修改为bash

时间:2018-07-05 13:17:13

标签: linux bash tcsh environment-modules

在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 帕特里克

1 个答案:

答案 0 :(得分:2)

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

shell需要实际执行这些命令才能使它们生效; eval就是这样做的。 (永远不要使用eval,除非您信任编写生成您要eval输出的程序的人员严格遵守极端情况-lends itself to security bugs)。< / p>

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

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

...相当于bash的是:

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