La méthode la plus simple est de rendre les variables soient les variables d'environnement, puisque celles-ci sont hérités par un processus enfant de ses parents. (Du côté Tcl, ils sont les éléments du tableau global ::env
, et sur le côté de la coque C, ils peuvent être lus comme toute autre variable mais doivent être réglés via setenv
.)
Le partage d'un seul fichier de configuration est beaucoup plus difficile, puisque les deux langues utilisent une syntaxe différente. Pourvu que vous n'utilisiez rien de compliqué dans la façon de citer, vous pouvez faire en sorte que Tcl analyse le format du shell C.
proc loadVariablesFromCshellFile {filename arrayName} {
upvar 1 $arrayName array
set f [open $filename]
while {[gets $f line] >= 0} {
if {[regexp {^\s*set (\w+)=([""'']?)(.*)\2\s*$} $line -> key quote value]} {
set array($key) $value
}
}
close $f
}
Ce n'est pas un code complet, car il ne gère pas la substitution de variables à l'intérieur de la valeur, mais il est suffisant pour vous aider à démarrer. (Je l'espère aussi vous ne l'utilisez cette fonction, si vous êtes, la portabilité va être un peu plus difficile à atteindre.) Voici comment utiliser cette fonctionnalité?
#!/usr/bin/env tclsh
proc loadVariablesFromCshellFile {filename arrayName} {
upvar 1 $arrayName array
set f [open $filename]
while {[gets $f line] >= 0} {
if {[regexp {^\s*set (\w+)=([""'']?)(.*)\2\s*$} $line -> key quote value]} {
set array($key) $value
}
}
close $f
}
loadVariablesFromCshellFile vars.sh myvars
puts $myvars(a)
Bien qu'il soit tout à fait possible charger les valeurs directement dans gLOBALS scalaire sur le côté Tcl, je vraiment ne recommande pas car il pollue l'espace variable globale d'une source en dehors du programme Tcl, un morceau connu de mauvaise pratique.
Merci! Je ne voulais pas muck avec env. variables, mais je pense que c'est la solution la plus rapide et la plus facile. – Wilderness