2016-12-28 1 views
0

I ont une variable qui est utilisée dans deux scripts distincts: un C Shell un et un TCL. Y at-il un moyen de le définir une seule fois et y accéder dans les deux scripts?variables de partage entre C Shell et TCL

vars.sh

#!/usr/bin/env tcsh 
set a=b 

run.sh

#!/usr/bin/env tcsh 
source vars.sh 
echo $a 

vars.tcl

#!/usr/bin/env tclsh 
set a b 

run.tcl

#!/usr/bin/env tclsh 
source vars.tcl 
puts $a 

Je n'aime pas l'idée de générer deux fichiers séparés pour stocker les mêmes variables dans deux formats différents. Existe-t-il un moyen d'utiliser un seul fichier vars et d'avoir les variables disponibles pour C Shell et TCL?

Répondre

1

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.

+0

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