Ich code ein bisschen in MATLAB und das ist mein erstes Mal mit TcL. Also, benötigte Hilfe, um zu wissen, ob es in TcL möglich ist, Variablen eines Skripts von einem anderen Skript zu bekommen? Wie in MATLAB übergeben wir Variablen an und von Workspace.Ist es möglich, Variablen in TCL von einem Skript zum anderen zu übergeben?
Antwort
Variablen sind standardmäßig an einen Interpreter gebunden, mit Ausnahme des globalen Arrays env
, das einem globalen Prozess zugeordnet ist, der von der C-Laufzeit verwaltet wird (und der wirklich langsam ist).
Aber andere Optionen sind möglich. Beispielsweise können Sie die API thread-shared-variable im Thread-Paket verwenden, um eine Variable zu haben, die von allen Threads in einem Prozess gemeinsam genutzt wird. Die Abbildung ist nicht auf eine echte Variable standardmäßig, wenn auch (für einfache Anwendungsfälle nur) Sie die Zuordnung über einige variable Spuren machen können:
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
}}}
Wenn Sie zwischen Prozessen gemeinsam nutzen möchten (oder zwischen den Systemen), die Dinge werden ein bisschen komplizierter. Ich würde vorschlagen, das System Tequila zu betrachten, wenn das noch am Leben ist. Ich weiß nicht, was die Sicherheitskonsequenzen sind, obwohl ein Server, der nur localhost
ausgesetzt ist, zu viel von einem Problem die meiste Zeit ist.
- Methode # 1
Original-Skript:
$ cat bar.tcl
set script_name $argv0
set var1 [lindex $argv 0]
set var2 [lindex $argv 1]
puts "$script_name: var1=$var1, var2=$var2"
$
Ausführung Ausgabe:
$ tclsh bar.tcl 10 20
bar.tcl: var1=10, var2=20
$
Wrapper-Skript:
$ cat foo.tcl
set file_name bar.tcl
set argv0 $file_name
set argv [list 100 200]
puts "Invoking $file_name"
source $file_name
$
Ausführungs output:
$ tclsh foo.tcl
Invoking bar.tcl
bar.tcl: var1=100, var2=200
$
- Methode # 2
Wrapper-Skript:
$ cat bat.tcl
set file_name bar.tcl
puts "Invoking $file_name"
puts [exec tclsh $file_name 500 600]
$
Ausführungs output:
$ tclsh bat.tcl
Invoking bar.tcl
bar.tcl: var1=500, var2=600
$