Tcl 如何在环境模块文件中使用预定义的环境变量?
我在模块文件中使用任何预定义的环境变量时遇到问题。例如,像这样的Tcl 如何在环境模块文件中使用预定义的环境变量?,tcl,environment-modules,Tcl,Environment Modules,我在模块文件中使用任何预定义的环境变量时遇到问题。例如,像这样的setenv TEST${HOSTNAME}行会抛出一个错误,其中系统将${HOSTNAME}定义为全局环境变量。错误如下:错误:102:Tcl命令执行失败:set TEST${HOSTNAME}。我在模块文件本身中设置了环境变量,并尝试使用这些变量,但得到了相同的错误。比如说, 此不起作用: setenv DUMMY/location/to/some/file setenv测试${DUMMY} 我得到了与上面类似的错误:错误:10
setenv TEST${HOSTNAME}
行会抛出一个错误,其中系统将${HOSTNAME}
定义为全局环境变量。错误如下:错误:102:Tcl命令执行失败:set TEST${HOSTNAME}
。我在模块文件本身中设置了环境变量,并尝试使用这些变量,但得到了相同的错误。比如说,
此不起作用:
setenv DUMMY/location/to/some/file
setenv测试${DUMMY}
我得到了与上面类似的错误:错误:102:Tcl命令执行失败:set TEST${DUMMY}
。但是,
这项工作:
set DUMMY/location/to/some/file
setenv测试${DUMMY}
我需要使用预定义的全局环境变量,因此不能使用上面的命令
如何在模块文件中使用预定义的环境变量?命令设置Tcl变量。这些是模块处理的本地文件:它们不会导出到其他任何地方。在Tcl变量名中可以使用的字符很少有限制;真正需要注意的只有
:
和(
),尽管还有一些会让事情变得非常尴尬,所以最好还是坚持使用字母数字法(和
)
setenv
命令(这不是一个标准的Tcl命令,而是模块
系统添加的)设置环境变量,并将这些变量导出到子流程。它们还作为全局关联数组env
的元素映射为Tcl变量,因此您可以执行此操作
setenv DUMMY /location/to/some/file
setenv TEST $env(DUMMY)
(我上面提到的对(
)的限制是因为这与关联数组的语法相混淆。元素名称可以使用任何字符。环境变量的名称中可能应该避免ASCII NUL和=
)
setenv
的实现可能是这样的:
proc setenv {variable value} {
global env
set env($variable) $value
}
到
env
的映射是双向的。谢谢您的回答@DonalFellows。这似乎对setenv
行很有效。因此,这就解决了这个问题。但是,我也有一些set别名行在别名中使用环境变量时出现了问题。例如,set alias pbin'cd$env(TEST)
抛出与以前相同的错误。您对在别名中使用这些变量有什么见解吗?谢谢!