【问题标题】:How to set environment variables in tcl?如何在 tcl 中设置环境变量?
【发布时间】:2026-02-24 21:45:01
【问题描述】:

当我获取 .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 变量时,它显示了需要什么,但我不知道为什么它不起作用。有没有其他解决方法?

【问题讨论】:

    标签: shell environment-variables tcl


    【解决方案1】:

    有几种可能性。要查看的关键事项是是否有任何其他 环境变量您错过了,Tcl auto_path 全局变量在package require 之前是否正确,以及是否有任何东西其他的继续。

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

    puts "auto_path=$auto_path"
    parray env
    

    就在出现错误的package require 之前。那应该打印出大量信息。 (特别注意您是否设置了不同的 TCL_LIBRARYTCLLIBPATH 环境变量。)

    除此之外,~/.tclshrc 文件中可能设置了一些内容, sourced 在交互模式下(在您收到提示之前发生)。这可能会导致可观察到的变化。另一种选择是如果 ha 包的 pkgIndex.tcl 脚本被编写为使用缩写命令,这仅在 Tcl 处于交互模式时有效。包索引定义脚本中的错误将使描述如何实际 load/source 包的实现不注册的代码,并可能给你你看到的错误状态。如果脚本假设它可以使用缩写,修复它,因为这总是一个错误。缩写是交互式使用 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之前。

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】: