2012-02-14 163 views

回答

15

取決於你的真正含義。

的一種方式是寫的第三(「主」)腳本,其將做

source /the/path/to/the/first.tcl 
source /the/path/to/the/second.tcl 

另一種方法是隻在第二個呼叫從上述例子添加到source到第一腳本的底部。

修正案第一種方法:如果要執行的腳本位於同一目錄中的主腳本,一個慣用的方式來source他們是

set where [file dirname [info script]] 
source [file join $where first.tcl] 
source [file join $where second.tcl] 

這樣的採購會工作無論什麼當前進程的目錄和項目目錄所在的位置。

3

你只需要使用源代碼來運行第二個腳本。

source "/tmp/whatever.tcl" 
1

雖然這通常是一個正確的答案,becouse的問題沒有得到precicely制定了有噸的方式才達到從TCL內部運行TCL代碼的目標。 我不想深入瞭解這一點,因爲理解代碼的執行是理解tcl itselve的一個重點。

有源

源命令不應與古典的方式執行腳本驚慌失措,我認爲線程啓動已要求。

source命令與c/perl/php中的「include」命令類似。 另一方面,像java或Python這樣的語言只有「導入」機制。

區別在於這些語言創建了一個內部數據庫的可用包,這些數據庫鏈接到相應的源/二進制/字節碼文件。通過編寫導入語句,加載鏈接的源代碼或字節代碼或二進制文件。這允許更深入的依賴管理而無需編寫額外的代碼。 在tcl中,可以使用命名空間和軟件包require命令來執行此操作。 例子:

假設你有這樣的source.tcl:

proc foo {bar} {puts "baz"} 
set BAM "BOO" 

現在,你有你的 「主人」 的劇本就像你怎麼稱呼它。我稱之爲「主」。它具有內容:

set BAM {my important data} 
source source.tcl 
#also the function foo can now be used, becouse source reads the whole script 
foo {wuz} 
set BAM 
#will output "BOO" 

exec命令

如果你能開始一個全新的解釋情況下,你可能的額外開銷活也做:

set BAM {my important data} 
exec tclsh source.tcl 
#The variable BAM will not be modified. You can not use the function foo. 

EVAL命令

Eval可以評估一個字符串或一個列表(在tcl中,一切都是一個字符串),就像它將被編程的代碼一樣。 您必須將完整的源文件加載到字符串。然後使用eval來評估分離範圍內的代碼,以免覆蓋主源文件中的內容。

set fp [open "somefile" r] 
set code_string [read $fp] 
close $fp 
eval $code_string