簡體   English   中英

在modulefile中加載模塊時環境未修改

[英]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.

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