2016-01-05 74 views
0

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

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

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

+0

尝试'$ env(DUMMY)' –

回答

1

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

+0

谢谢您的回答@DonalFellows。这似乎对'setenv'行很好。所以这解决了这个问题。但是,我也有一些别名行,现在在使用别名中的环境变量时抱怨。例如,'set-alias pbin'cd $ env(TEST)''会像以前一样抛出相同的错误。你有任何关于在别名中使用这些变量的见解吗?谢谢! – ExoticDFT