从 TCL 脚本中设置环境变量

Setting environment variables from within TCL script

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

我本来打算尝试 exec /bin/sh -c "source /path/to/.bash_profile,但那样会创建一个 shell 脚本并将变量导入其中,然后 tcl 脚本将无法接收它。

谁能给出其他想法?

一般来说(至少对于 Linux 和类 Unix 系统),不可能从子进程内部改变父进程的环境。这是一个 frequently asked question about tcl

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

在 Tcl 中你有全局 env 数组:

set ::env(foo) bar

然后任何子进程在其环境中都有变量 foo

如果您想将环境变量放在中央文件中(即 .bash_profile)以便其他程序可以获取它们,那么让 Tcl 解析该文件并在其中设置变量应该很容易env 数组。

环境通过 Tcl 中的全局 env 数组公开。数组的键和值默认为从父进程继承的环境,Tcl 创建的任何进程都将继承它的副本,检查当前进程中环境的代码(包括直接来自 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_env 数组中。

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