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