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

How do you use predefined enviornmental varaibles in environmental module files?

我在模块文件中使用任何预定义的环境变量时遇到问题。例如,像这样的行 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}

有些行我需要使用预定义的全局环境变量,所以不能使用上面的命令。

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

set 命令设置一个 Tcl 变量。这些是模块处理的本地:它们不会导出到其他任何地方。对于可以在 Tcl 变量名中使用的字符几乎没有限制; 真正要提防的只有:(,尽管还有其他一些可能会让事情变得非常尴尬,所以最好还是坚持字母数字(和 _)。

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

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

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


setenv的实现大概是这样的:

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

env 的映射是 bi-directional。