1

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

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

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

4

1 回答 1

2

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

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是双向的。

于 2016-01-05T18:12:23.287 回答