我正在创建一个Tcl脚本,它允许我自动安装软件。但我遇到的问题是软件需要预先设置一些环境变量,我想知道是否可以在tcl脚本中设置环境变量。
我打算尝试exec /bin/sh -c "source /path/to/.bash_profile
,但这会创建一个shell脚本并将变量输入到那里,然后tcl脚本就不会选择它。
任何人都可以提出任何其他想法吗?
答案 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脚本让人们更容易配置...