在TCL中是否可以将变量从一个脚本传递到另一个脚本?

在TCL中是否可以将变量从一个脚本传递到另一个脚本?,tcl,workspace,Tcl,Workspace,我用MATLAB编写了一些代码,这是我第一次使用TcL。所以,需要帮助才能知道在TcL中是否可以从另一个脚本获取一个脚本的变量?与在MATLAB中一样,我们在工作区之间传递变量。默认情况下,变量绑定到解释器,但全局env数组除外,该数组映射到由C运行时维护的进程全局(而且速度非常慢) 但其他选择也是可能的。例如,您可以使用thread包中的API来拥有一个在进程中的所有线程之间共享的变量。默认情况下,映射不是真变量,但是(仅适用于简单用例)可以通过一些变量跟踪进行映射: package requ

我用MATLAB编写了一些代码,这是我第一次使用TcL。所以,需要帮助才能知道在TcL中是否可以从另一个脚本获取一个脚本的变量?与在MATLAB中一样,我们在工作区之间传递变量。

默认情况下,变量绑定到解释器,但全局
env
数组除外,该数组映射到由C运行时维护的进程全局(而且速度非常慢)

但其他选择也是可能的。例如,您可以使用thread包中的API来拥有一个在进程中的所有线程之间共享的变量。默认情况下,映射不是真变量,但是(仅适用于简单用例)可以通过一些变量跟踪进行映射:

package require Thread

# The lambdas do some adaptation of arguments in traces
trace add variable foo write {apply {args {
    global foo
    tsv::set share Foo $foo
}}}
trace add variable foo read {apply {args {
    global foo
    set foo [tsv::get share Foo]
}}}
trace add variable foo unset {apply {args {
    tsv::unset share Foo
}}}
如果您想在进程之间(或系统之间)共享,事情会变得更加复杂。我建议看看这个系统,如果它还活着的话。我不知道安全后果是什么,尽管一个只暴露于
localhost
的服务器在大多数情况下都不是什么大问题。

  • 方法#1
原文:

$ cat bar.tcl 
set script_name $argv0
set var1 [lindex $argv 0]
set var2 [lindex $argv 1]
puts "$script_name: var1=$var1, var2=$var2"
$ 
执行输出:

$ tclsh bar.tcl 10 20
bar.tcl: var1=10, var2=20
$ 
$ tclsh foo.tcl 
Invoking bar.tcl
bar.tcl: var1=100, var2=200
$ 
$ tclsh bat.tcl 
Invoking bar.tcl
bar.tcl: var1=500, var2=600
$ 
包装器脚本:

$ cat foo.tcl 
set file_name bar.tcl
set argv0 $file_name
set argv [list 100 200]
puts "Invoking $file_name"
source $file_name
$ 
$ cat bat.tcl 
set file_name bar.tcl
puts "Invoking $file_name"
puts [exec tclsh $file_name 500 600]
$ 
执行输出:

$ tclsh bar.tcl 10 20
bar.tcl: var1=10, var2=20
$ 
$ tclsh foo.tcl 
Invoking bar.tcl
bar.tcl: var1=100, var2=200
$ 
$ tclsh bat.tcl 
Invoking bar.tcl
bar.tcl: var1=500, var2=600
$ 
  • 方法#2
包装器脚本:

$ cat foo.tcl 
set file_name bar.tcl
set argv0 $file_name
set argv [list 100 200]
puts "Invoking $file_name"
source $file_name
$ 
$ cat bat.tcl 
set file_name bar.tcl
puts "Invoking $file_name"
puts [exec tclsh $file_name 500 600]
$ 
执行输出:

$ tclsh bar.tcl 10 20
bar.tcl: var1=10, var2=20
$ 
$ tclsh foo.tcl 
Invoking bar.tcl
bar.tcl: var1=100, var2=200
$ 
$ tclsh bat.tcl 
Invoking bar.tcl
bar.tcl: var1=500, var2=600
$