linux - 将“模块”别名(调用 modulecmd)从 tcsh 调整为 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 $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帕特里克
解决方案
modulecmd
在其标准输出上发出 shell 脚本(因此参数告诉它为哪个 shell 生成脚本)。
shell需要实际执行这些命令才能生效;这就是这样eval
做的。eval
(除非您相信编写生成您要输出的程序的人对eval
极端情况很严格,否则永远不要使用- 它会导致安全错误)。
因此,如果该命令的现有 tcsh 别名module
是:
alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'
... bash 等价物是:
module() { eval "$(/app/modules/0/bin/modulecmd bash "$@")"; }
推荐阅读
- datatables - 如何将我的 BI 工具连接到 YouTube API (ODBC)?
- javascript - 我可以在客户端代码中更改 URL / 重定向的可能方法是什么?
- intellij-idea - Intellij Idea Refactoring - 如何让多个类扩展一个基类?
- python - 函数参数默认值的 Python 风格指南
- c - 如何编写ac程序来创建文件?
- javascript - Scrollmagic 不起作用 - 我该如何解决这个问题?
- javascript - 如何在反应中为直通点击事件添加颜色?(不改变字体颜色)
- cordova - 基于发布的代码推送的强制或可选更新
- html - 接受 YYYY-MM-DD 但不是完全空的输入
- powershell - 使用 2 个 foreach() 循环从 2 个文本文件中读取相应的行