我想说这个问题比较笼统。首先,当我想在 PoserShell 中初始化 Microsoft Visual Studio 环境(使用 .cmd 脚本完成)时,我遇到了这个问题。后来,我在任何组合(Bash、Tcl、Python 等)的其他脚本语言中遇到了这个问题。
Hai Vu提供的解决方案很好。如果您从一开始就知道您需要哪些变量,那么它运作良好。但是,如果您要使用脚本来初始化某些环境,它可能包含许多变量(您甚至不需要知道这些变量,但这些变量是环境正常运行所必需的)。
一般来说,该问题的解决方案如下:
- 执行脚本,最后打印所有环境变量并捕获输出。
- 匹配“variable=value”等模式的输出行,这就是你想要得到的。
- 使用您的语言工具设置环境变量。
我没有现成的解决方案,但我想,与此类似的东西应该可以工作(注意,下面的片段没有经过测试 - 它们只是为了给出解决方案的想法):
执行脚本;打印变量并捕获输出(参数扩展 - {*} - 需要 Tcl 8.5,这里我们可以不用它,但我更喜欢使用它):
set bashCommand {bash -c 'myScriptName arg1 arg2 2>&1 >/dev/null && export -p'}
if [catch {*}${bashCommand} output] {
set errMsg "ERROR: Failed to run script."
append errMsg "\n" $output
error $errMsg
}
;# If we get here, output contains the output of "export -p" command
解析命令的输出:
set vars [dict create]
foreach line [split $output "\n"] {
regex -- {^declare -x ([[:alpha:]_]*)=\"(.*)\"$} $line dummy var val
;# 3. Store var-val pair of set env var.
}
存储 var-val 对或设置 env var。这里可以使用几种方法:
3.1。设置 Tcl 变量并像这样使用它们(取决于上下文):
set $var $val
或者
variable $var $val
3.2. 设置环境变量(其实是3.1的子案例):
global ::env
set ::env($var) $val
3.3 设置 dict 或 array 并在您的应用程序(或脚本)中使用它而不修改全局环境:
set myEnv($var) val ;# set array
dict set myEnvDict $var $val ;# set dict
我想重复一遍,这只是收据的想法。更重要的是,由于大多数现代脚本语言都支持正则表达式,因此该收据可以在几乎任意语言对之间提供桥梁,而不仅仅是 Bash<->Tcl