web-dev-qa-db-ja.com

TCLスクリプト内からの環境変数の設定

ソフトウェアのインストールを自動化できるTclスクリプトを作成していました。しかし、私が直面している問題は、ソフトウェアが事前にいくつかの環境変数を設定する必要があることであり、tclスクリプト内で環境変数を設定することが可能かどうか疑問に思いました。

exec /bin/sh -c "source /path/to/.bash_profileを試してみるつもりでしたが、シェルスクリプトが作成され、そこに変数がソースされ、tclスクリプトはそれを取得しません。

誰か他のアイデアを与えることはできますか?

8
Attiq

Tclには、グローバルenv配列があります。

set ::env(foo) bar

そして、子プロセスの環境には変数fooがあります。

環境変数を中央ファイルに入れたい場合(つまり、.bash_profile)他のプログラムがそれらを調達できるように、Tclにそのファイルを解析させ、変数をenv配列に設定するのは非常に簡単です。

11
glenn jackman

一般的に言えば(少なくともLinuxおよびUnixライクなシステムの場合)、子プロセス内から親の環境を変更することはできません。それは tclについてのよくある質問

ただし、Tclスクリプト内から他のソフトウェアを起動する場合は、いくつかのことを実行できます。最も簡単な方法は、環境変数を設定してからソフトウェアを起動するシェルスクリプトファイルを作成することです。次に、Tcl内からシェルスクリプトを実行します。

3
Edward

環境は、Tclのグローバルenv配列を介して公開されます。配列のキーと値はデフォルトで親プロセスから継承された環境になり、Tclが作成するプロセスはそのコピーを継承し、現在のプロセス(Cから直接含む)の環境を調べるコードは現在の状態を確認しますそれの。

シェルスクリプトで設定された環境を取得するのは非常に注意が必要です。問題は、(たとえば).bashrcが非常に複雑なことを実行できるだけでなく、一連の環境変数を設定できることです。たとえば、その日のメッセージを印刷したり、条件付きでアクションを実行したりすることもできます。ただし、シェルの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スクリプトを使って設定する方が簡単だと思います…

1
Donal Fellows