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)
抛出与以前相同的错误。您对在别名中使用这些变量有什么见解吗?谢谢!