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