ソフトウェアのインストールを自動化できるTclスクリプトを作成していました。しかし、私が直面している問題は、ソフトウェアが事前にいくつかの環境変数を設定する必要があることであり、tclスクリプト内で環境変数を設定することが可能かどうか疑問に思いました。
exec /bin/sh -c "source /path/to/.bash_profile
を試してみるつもりでしたが、シェルスクリプトが作成され、そこに変数がソースされ、tclスクリプトはそれを取得しません。
誰か他のアイデアを与えることはできますか?
Tclには、グローバルenv
配列があります。
set ::env(foo) bar
そして、子プロセスの環境には変数foo
があります。
環境変数を中央ファイルに入れたい場合(つまり、.bash_profile
)他のプログラムがそれらを調達できるように、Tclにそのファイルを解析させ、変数をenv
配列に設定するのは非常に簡単です。
一般的に言えば(少なくともLinuxおよびUnixライクなシステムの場合)、子プロセス内から親の環境を変更することはできません。それは tclについてのよくある質問
ただし、Tclスクリプト内から他のソフトウェアを起動する場合は、いくつかのことを実行できます。最も簡単な方法は、環境変数を設定してからソフトウェアを起動するシェルスクリプトファイルを作成することです。次に、Tcl内からシェルスクリプトを実行します。
環境は、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スクリプトを使って設定する方が簡単だと思います…