如何在tcl中设置环境变量?

时间:2016-06-02 05:12:44

标签: shell environment-variables tcl

当我获取.cshrc文件并运行Tcl脚本时,它运行正常:

$ source .cshrc-sample
$ tclsh invoke.tcl

以下是.cshrc文件:

setenv AUTOTEST "/auto/isbutest/frt"
setenv ATS_EASY "$AUTOTEST"
setenv ATS_USER_PATH "$AUTOTEST"
setenv PATH "${AUTOTEST}/bin:${PATH}"

但是当我尝试在Tcl中设置环境变量并运行脚本时, 我收到以下错误:

$ tclsh invoke.tcl
can't find package ha
    while executing
"package require ha"
    (file "invoke.tcl" line 8)    

我的Tcl脚本 - invoke.tcl

global env

set env(AUTOTEST) "/auto/isbutest/frt"
set env(ATS_EASY) "/auto/isbutest/frt"
set env(ATS_USER_PATH) "/auto/isbutest/frt"
set env(PATH) "$env(PATH):/auto/isbutest/frt/bin:";
package require ha

如何在不采购.cshrc的情况下运行脚本?

使用脚本无法设置环境变量,变量的生命周期在脚本的运行时内。当我尝试打印PATH变量时,它会显示需要的内容,但我不知道为什么它不起作用。还有其他解决方法吗?

2 个答案:

答案 0 :(得分:0)

有几种可能性。要注意的关键事项是,是否有任何其他环境变量错过了,Tcl auto_path全局变量是否在package require之前是正确的,以及是否还有其他事情发生。

从Tcl方面最简单的方法是添加:

puts "auto_path=$auto_path"
parray env

在出现错误的package require之前。这应该打印出大量的信息。 (如果您以不同方式设置TCL_LIBRARYTCLLIBPATH个环境变量,请特别注意。)

除此之外,有可能在~/.tclshrc文件中设置了一些内容,在交互模式下只有 source d(它会在您收到提示之前发生) )。这可能会导致可观察到的变化。另一种选择是,如果ha包的pkgIndex.tcl脚本被编写为使用缩写命令,这些命令仅在Tcl处于交互模式时才有效。包索引定义脚本中的错误将使代码描述如何实际load / source包的实现未注册,并且可以为您提供所见的错误状态。如果脚本假设它可以使用缩写,修复它,因为它总是一个bug。缩写是交互式使用Tcl时的便利,不应该放在正确保存的代码中。

您可能想要检查包列表是否完整。使用此代码:

catch {package require NoSuchPackage}; # Force immediate population of the list of packages
puts Packages:\n\t[join [lsort -dictionary [package names]] \n\t]

再次,在任何全局变量设置之后和问题package require之前将其放入。

答案 1 :(得分:0)

在侧面tcl脚本中,您可以简单地将setenv做为setenv AUTOTEST="/auto/isbutest/frt"

如果要设置变量,请使用set VARNAME "/auto/isbutest/frt"

如果要获取任何环境变量,请使用$::env(AUTOTEST)

以及使用set命令声明的任何变量都可以使用$VARNAME访问。