[英]Env not modify when loading module in modulefile
我想將模塊加載到modulefile中(以解決依賴關系)。
MyModule:
#%Module########################################
##
## Modulefile
#
proc ModulesHelp { } {
puts stderr "Env for MyProg"
}
proc addPath {var val} {
prepend-path $var $val
}
module load MyOtherModule
addPath PATH /opt/MyModule/bin
MyOtherModule:
#%Module########################################
##
## Modulefile
#
proc ModulesHelp { } {
puts stderr "Env for MyOtherProg"
}
proc addPath {var val} {
prepend-path $var $val
}
addPath PATH /opt/MyOtherModule/bin
當我運行module load MyModule
,兩個模塊似乎module load MyModule
加載,但是環境不正確:
$module list
Currently Loaded Modulefiles:
1) MyModule 2) MyOtherModule
$echo $PATH
/opt/MyModule/bin:/usr/bin:/bin
如果在module load MyOtherModule
行之后,在MyModule中添加foreach p [array names env] { set tmp $env($p) }
或至少在module load MyOtherModule
set tmp $env(PATH)
中module load MyOtherModule
行,則正確修改了環境。 如果我不使用addPath
函數,但直接使用prepend-path
命令,它也可以正常工作,這有點煩人,因為我當然想在addPath
函數中做更多的事情。
任何人都對正在發生的事情以及我所缺少的事情有一個想法嗎?
prepend-path
可能正在做一些“聰明”的事情來管理變量。 究竟是什么我不知道也不需要知道,因為我們可以使用通用Tcl來解決所有問題。 為了使它的包裝uplevel
,盡管需要考慮使用全局范圍(名稱#0
)還是調用方的范圍(默認值1
),但使用uplevel
代碼在適當的范圍內評估代碼; 他們是當你的程序一樣addPath
從全球范圍內調用,但在其他方面可能是完全不同的,我不知道還有什么其他奇怪是怎么回事的模塊系統處理。
為了演示,請嘗試以下addPath
:
proc addPath {var val} {
puts stderr "BEFORE..."
uplevel 1 [list prepend-path $var $val]
puts stderr "AFTER..."
}
我們使用list
構造要在調用方范圍內評估的事物,因為可以保證生成無替代的單命令腳本。 (還有有效的列表。)這是在Tcl中進行代碼生成的全部秘訣:保持簡單,使用list
進行所需的任何引用,在情況復雜時調用幫助程序(帶有合適的參數),並使用uplevel
控件進行控制評價范圍。
(注意: upvar
也可能有用-將局部變量綁定到另一個作用域中的變量-但這不是您建議的用法。我提到它是因為如果您做更復雜的事情可能很有用……)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.