在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 "$@")"; }