从 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 脚本配置东西更容易…
我正在创建一个 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 脚本配置东西更容易…