[英]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 $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 Patrik)
modulecmd
在其stdout上發出shell腳本(因此,該參數告訴它為哪個shell生成腳本)。
Shell需要實際執行這些命令才能使它們生效。 這是eval
所做的。 (永遠不要使用eval
除非您信任編寫要生成您要eval
的輸出的程序的人員對eval
情況非常嚴格,否則會導致安全漏洞 )。
因此,如果module
命令的現有tcsh別名為:
alias module 'eval `/app/modules/0/bin/modulecmd tcsh \!*`'
... bash等效項為:
module() { eval "$(/app/modules/0/bin/modulecmd bash "$@")"; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.