从TCL脚本中设置环境变量

从TCL脚本中设置环境变量,tcl,environment-variables,Tcl,Environment Variables,我正在创建一个Tcl脚本,它将允许我自动安装软件。但我遇到的问题是,软件需要预先设置一些环境变量,我想知道是否可以在tcl脚本中设置环境变量 我本来打算尝试exec/bin/sh-c“source/path/to/.bash_profile,但这将创建一个shell脚本,并将变量源代码化到其中,而tcl脚本将无法获取它 有人能给出其他想法吗?一般来说(至少对于Linux和类似Unix的系统来说),不可能从子进程中改变父进程的环境。这是一个 但是,如果您正在从Tcl脚本中启动一些其他软件,您可以做

我正在创建一个Tcl脚本,它将允许我自动安装软件。但我遇到的问题是,软件需要预先设置一些环境变量,我想知道是否可以在tcl脚本中设置环境变量

我本来打算尝试
exec/bin/sh-c“source/path/to/.bash_profile
,但这将创建一个shell脚本,并将变量源代码化到其中,而tcl脚本将无法获取它

有人能给出其他想法吗?

一般来说(至少对于Linux和类似Unix的系统来说),不可能从子进程中改变父进程的环境。这是一个


但是,如果您正在从Tcl脚本中启动一些其他软件,您可以做一些事情,其中最简单的可能是创建一个shell脚本文件,该文件同时设置环境变量,然后启动您的软件。然后从Tcl中运行shell脚本。

在Tcl中,您拥有全局
env
数组:

set ::env(foo) bar
然后,任何子进程的环境中都有变量
foo


如果要将环境变量放入中心文件(即
.bash\u profile
)因此,其他程序可以获取它们的源代码,那么让Tcl解析该文件并在
env
数组中设置变量应该非常容易。

环境通过Tcl中的全局
env
数组公开。数组的键和值默认为从父进程继承的环境,Tcl可以使用的任何进程creates将继承它的一个副本,并且在当前进程中检查环境的代码(包括直接从C)将看到它的当前状态

获取shell脚本中的环境集非常棘手。问题是
.bashrc
(例如)可以执行相当复杂的操作,还可以设置一系列环境变量。例如,它还可以打印当天的消息,或有条件地采取措施。但您至少可以使用shell的
env
命令进行合理的尝试:

set data [exec sh -c "source /path/to/file.sh.rc; env"]
# Now we parse with some regular expression magic
foreach {- key value} [regexp -all -inline {(?wi)^(\w+)=((?!')[^\n]+|'[^']+')$} $data] {
    set extracted_env($key) [string trim $value "'"]
}
它非常糟糕,也不完全正确(有些事情可能会混淆它),但它非常接近。值将由它填充到
extracted\u env
数组中


我认为让人们通过Tcl脚本来配置东西更容易…

如果我想设置子进程本身的环境变量呢?因此运行的Tcl脚本的环境变量hmm
env
set
更好地获取环境变量。
set
也会输出函数离子和纯壳变量。