从TCL脚本中设置环境变量

时间:2015-04-17 18:33:11

标签: tcl environment-variables

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

我打算尝试exec /bin/sh -c "source /path/to/.bash_profile,但这会创建一个shell脚本并将变量输入到那里,然后tcl脚本就不会选择它。

任何人都可以提出任何其他想法吗?

3 个答案:

答案 0 :(得分:7)

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

set ::env(foo) bar

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

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

答案 1 :(得分:3)

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

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

中运行shell脚本

答案 2 :(得分:0)

通过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脚本让人们更容易配置...