簡體   English   中英

將tcsh的“模塊”別名(調用modulecmd)修改為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 $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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM