在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 帕特里克
答案 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 "$@")"; }