当我获取.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
变量时,它会显示需要的内容,但我不知道为什么它不起作用。还有其他解决方法吗?
答案 0 :(得分:0)
有几种可能性。要注意的关键事项是,是否有任何其他环境变量错过了,Tcl auto_path
全局变量是否在package require
之前是正确的,以及是否还有其他事情发生。
从Tcl方面最简单的方法是添加:
puts "auto_path=$auto_path"
parray env
在出现错误的package require
之前。这应该打印出大量的信息。 (如果您以不同方式设置TCL_LIBRARY
或TCLLIBPATH
个环境变量,请特别注意。)
除此之外,有可能在~/.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
访问。