在C Shell和TCL之间共享变量

时间:2016-12-28 07:57:40

标签: variables tcl csh

我有一个变量,它在两个独立的脚本中使用:一个C Shell和一个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

我不想生成两个单独的文件来以两种不同的格式存储相同的变量。有没有办法使用单个vars文件并让变量可用于C Shell和TCL?

1 个答案:

答案 0 :(得分:1)

最简单的方法是使变量成为环境变量,因为这些变量是由子进程从父进程继承的。 (在Tcl方面,它们是::env全局数组中的元素,在C shell方面,它们可以像任何其他变量一样读取,但需要通过setenv进行设置。)

共享单个配置文件要困难得多,因为这两种语言使用不同的语法。如果您不使用引用方式中的任何复杂内容,则可以使Tcl解析C shell格式。

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
}

这不是完整的代码,因为它不处理值内变量的替换,但它足以让你开始。 (我也希望你没有使用这个功能;如果你这样,可移植性将会变得更加困难。)以下是你如何使用它:

#!/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)

虽然完全有可能将值直接加载到Tcl端的标量全局变量中,但我确实不推荐它,因为它从Tcl程序外部的源污染全局变量空间,一种已知的不良做法。