在 C Shell 和 TCL 之间共享变量
Sharing variables between C Shell and TCL
我有一个变量在两个不同的脚本中使用:一个 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?
最简单的方法是使变量成为环境变量,因为这些变量是由子进程从父进程继承的。 (在 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+)=([""'']?)(.*)\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+)=([""'']?)(.*)\s*$} $line -> key quote value]} {
set array($key) $value
}
}
close $f
}
loadVariablesFromCshellFile vars.sh myvars
puts $myvars(a)
虽然完全可以在 Tcl 端将值直接加载到标量全局变量中,但我真的不推荐它,因为它会污染全局变量space 来自 Tcl 程序之外的来源,这是一种已知的不良做法。
我有一个变量在两个不同的脚本中使用:一个 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?
最简单的方法是使变量成为环境变量,因为这些变量是由子进程从父进程继承的。 (在 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+)=([""'']?)(.*)\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+)=([""'']?)(.*)\s*$} $line -> key quote value]} {
set array($key) $value
}
}
close $f
}
loadVariablesFromCshellFile vars.sh myvars
puts $myvars(a)
虽然完全可以在 Tcl 端将值直接加载到标量全局变量中,但我真的不推荐它,因为它会污染全局变量space 来自 Tcl 程序之外的来源,这是一种已知的不良做法。