我有一个变量,它在两个独立的脚本中使用:一个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?
答案 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程序外部的源污染全局变量空间,一种已知的不良做法。