2016-01-05 102 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