如何在环境模块文件中使用预定义的环境变量?

时间:2016-01-05 16:43:11

标签: tcl environment-modules

我在模块文件中使用任何预定义的环境变量时遇到问题。例如,像setenv TEST ${HOSTNAME}这样的行会引发错误,其中${HOSTNAME}被系统定义为全局环境变量。错误如下:ERROR:102: Tcl command execution failed: set TEST ${HOSTNAME}。我已经在模块文件中设置了环境变量,并尝试使用它们并获得相同类型的错误。例如,

有效:

setenv DUMMY /location/to/some/file setenv TEST ${DUMMY}

我收到与上面类似的错误:ERROR:102: Tcl command execution failed: set TEST ${DUMMY}。但是,

这有效:

set DUMMY /location/to/some/file setenv TEST ${DUMMY}

我需要使用某些行来预定义全局环境变量,因此无法使用上述命令。

如何在模块文件中使用预定义的环境变量?

1 个答案:

答案 0 :(得分:2)

set命令设置Tcl变量。这些是模块处理的本地:它们不会在其他任何地方导出。您可以在Tcl变量名中使用哪些字符的限制很少;关于真正提防的唯一的那些是:(,虽然还有一些其他可以使事情变得非常尴尬所以它仍然是最好的坚持到字母数字(和_)。

setenv命令(不是标准Tcl命令,而是module系统添加的东西)设置环境变量,这些导出到子进程。它们也被映射为Tcl变量作为全局关联数组env的元素,因此您可以这样做

setenv DUMMY /location/to/some/file
setenv TEST $env(DUMMY)

(我在上面提到的对(的限制是因为它与关联数组的语法纠缠在一起。元素名称可以使用任何字符。环境变量可能应该避免使用ASCII NUL并在其名称中= ...)

setenv的实现可能是这样的:

proc setenv {variable value} {
    global env
    set env($variable) $value
}

env的映射是双向的。