在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在Real.Lead中创建了一个条目。
但是,java-version仍然显示相同的旧版本,并且module_list不显示任何新模块。在tcsh中一切都很好(我使用add alias模块)。我试过不同版本的模块命令。测试的最新版本是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别名的区别
比尔
帕特里克

最佳答案

modulecmd在其stdout上发出shell脚本(因此参数告诉它为哪个shell生成脚本)。
shell需要实际执行这些命令才能生效;eval就是这样做的。(永远不要使用eval,除非你相信编写程序生成输出的人,你会对角落的情况非常严格--它lends itself to security bugs)。
因此,如果您对于eval命令的现有TCSH别名是:

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

……bash的等价物是:
module() { eval "$(/app/modules/0/bin/modulecmd bash "$@")"; }

08-05 10:09