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