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

时间:2016-06-15 04:33:15

标签: tcl workspace

我在MATLAB中编写了一些代码,这是我第一次使用TcL。那么,需要帮助知道在TcL中是否可以从另一个脚本获取一个脚本的变量?就像在MATLAB中一样,我们将变量传入和传出Workspace。

2 个答案:

答案 0 :(得分:0)

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

但其他选择也是可能的。例如,您可以使用线程包中的thread-shared-variable 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
}}}

如果要在进程之间(或系统之间)共享,事情会变得复杂一些。我建议查看Tequila系统,如果它仍然存在的话。我不知道安全后果是什么,尽管只有localhost的服务器在大多数情况下都不是 大部分问题。

答案 1 :(得分:0)

  • 方法#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
$ 

包装脚本:

$ cat foo.tcl 
set file_name bar.tcl
set argv0 $file_name
set argv [list 100 200]
puts "Invoking $file_name"
source $file_name
$ 

执行输出:

$ tclsh foo.tcl 
Invoking bar.tcl
bar.tcl: var1=100, var2=200
$ 
  • 方法#2

包装脚本:

$ cat bat.tcl 
set file_name bar.tcl
puts "Invoking $file_name"
puts [exec tclsh $file_name 500 600]
$ 

执行输出:

$ tclsh bat.tcl 
Invoking bar.tcl
bar.tcl: var1=500, var2=600
$