2015-04-17 2 views
5

Ich erstellte ein Tcl-Skript, mit dem ich die Installation von Software automatisieren kann. Aber das Problem, auf das ich stoße, ist, dass die Software einige Umgebungsvariablen benötigt, die vorher gesetzt wurden, und ich frage mich, ob es möglich ist, Umgebungsvariablen innerhalb des tcl-Skripts zu setzen.Setzen von Umgebungsvariablen aus TCL-Skript

Ich wollte versuchen exec /bin/sh -c "source /path/to/.bash_profile, aber das würde ein Shell-Skript erstellen und die Variablen in dort und das Tcl-Skript wird es nicht abholen dann.

Kann jemand andere Ideen geben?

Antwort

3

In Tcl haben Sie den globalen env Array:

set ::env(foo) bar 

Und dann hat jedes Kind Prozess die Variable foo in seiner Umgebung.

Wenn Sie Umgebungsvariablen in eine zentrale Datei (d. H. .bash_profile) setzen möchten, damit andere Programme sie beziehen können, sollte es ziemlich einfach sein, Tcl zum Analysieren der Datei zu erhalten und die Variablen im Array env festzulegen.

3

Im Allgemeinen (zumindest für Linux und Unix-ähnliche Systeme) ist es nicht möglich, innerhalb eines Child-Prozesses die Umgebung des Parents zu ändern. Es ist ein frequently asked question about tcl

Wenn Sie jedoch einige andere Software aus dem Tcl-Skript starten, können Sie einige Dinge tun, von denen die einfachste eine Shell-Skriptdatei erstellen kann, die sowohl Umgebungsvariablen als auch dann setzt startet Ihre Software. Führen Sie das Shell-Skript dann aus Tcl aus.

+1

was ist, wenn ich die Umgebungsvariable des Kindes Prozess selbst setzen wollten? Daher wäre die Umgebungsvariable des tcl-Skripts, das – Attiq

0

Die Umgebung wird über das globale env Array in Tcl exponiert. Die Schlüssel und Werte des Arrays verwenden standardmäßig die vom übergeordneten Prozess geerbte Umgebung. Jeder von Tcl erstellte Prozess erbt eine Kopie davon und Code, der die Umgebung im aktuellen Prozess untersucht (einschließlich direkt von C), wird den aktuellen Status sehen davon.

Das Aufnehmen der Umgebung in einem Shell-Skript ist ziemlich schwierig. Das Problem ist, dass eine .bashrc (zum Beispiel) ziemlich komplexe Dinge tun kann, sowie eine Reihe von Umgebungsvariablen einstellen kann. Zum Beispiel kann es auch eine Nachricht des Tages ausdrucken oder bedingt Aktionen ausführen. Aber man kann zumindest machen einen angemessenen Versuch der env Befehl Shell verwenden:

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 "'"] 
} 

Es ist ziemlich schrecklich, und ist nicht ganz Recht (es gibt Dinge, die es verwechselt werden könnte), aber es ist ziemlich nah dran . Die Werte werden in dem extracted_env-Array dadurch aufgefüllt.

Ich denke, es ist einfacher, Leute zu bekommen Dinge über Tcl-Skripte konfigurieren ...

+0

hmm 'env' ausführt, besser als' set', um Umgebungsvariablen zu erhalten. 'set' spuckt auch Funktionen und einfache Shell-Variablen aus. –

+0

@glennjackman Wusste nicht, dass 'env' dafür verwendbar war. –