我要說的是,這個問題是相當普遍的。首先我遇到了這個問題,當時我想在PoserShell中初始化Microsoft Visual Studio環境(這是使用.cmd腳本完成的)。後來我遇到了其他腳本語言的任何組合(Bash,Tcl,Python等)的問題。
Hai Vu提供的解決方案很好。如果你從一開始就知道你需要哪些變量,那麼效果很好。但是,如果您要使用腳本來初始化某些環境,那麼我包含數十個變量(您甚至不需要知道這些變量,但是這些變量是正常操作環境所需的)。
一般情況下,該問題的解決方案如下:
- 執行腳本,並在年底全部打印環境變量和捕獲輸出。
- 匹配模式的輸出行,如「變量=值」,其中是你想得到的。
- 使用您的語言設施設置環境變量。
我沒有現成的解決方案,但我想,類似這種東西應該工作(注意,該片段以下未測試 - 他們只是旨在給予解決的想法):
執行腳本;打印VAR和捕獲輸出(參數擴展 - {*} - 需要的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.
}
Store var-val pair或set env var。這裏可以使用幾種方法:
3.1。設置Tcl變量中,並使用它們像這樣的(根據上下文):
set $var $val
或
variable $var $val
3.2。設置環境變量(實際上,3.1分的情況下):
global ::env
set ::env($var) $val
3.3集字典或數組並沒有全球環境的改變您的應用程序(或腳本)中使用它:
set myEnv($var) val ;# set array
dict set myEnvDict $var $val ;# set dict
我我想重申,這只是收據的想法。更重要的是,由於大多數現代腳本語言都支持正則表達式,因此該收據可以提供幾乎任意一對語言之間的橋樑,但不僅僅是Bash < - > Tcl
感謝Hai Vu&Dmitry – user2622965