web-dev-qa-db-ja.com

他のtclスクリプトでtclスクリプトを実行する方法は?

2つのtclスクリプトがあります。そして、最初に終了したときに2番目のスクリプトを実行したいと思います。どうすればいいですか?

12
d_pilot

あなたが本当に何を意味するかによります。

1つの方法は、3番目の(「マスター」)スクリプトを作成することです。

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

もう1つの方法は、上記の例のsourceへの2番目の呼び出しを最初のスクリプトの最後に追加することです。

最初のアプローチの修正:実行するスクリプトがマスタースクリプトと同じディレクトリにある場合、それらをsourceする慣用的な方法は次のとおりです。

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

このように、現在のプロセスのディレクトリが何であるか、プロジェクトディレクトリがどこにあるかに関係なく、ソーシングは機能します。

17
kostix

2番目のスクリプトを実行するには、sourceを使用する必要があります。

source "/tmp/whatever.tcl"
5
TrojanName

これは一般的に正しい答えですが、質問が正確に定式化されていないため、tcl内からtclコードを実行するという目標を達成する方法はたくさんあります。コードの実行を理解することは、tcl自体を理解する上での主要なポイントの1つであるため、これについては詳しく説明しません。

ソースがあります

ソースコマンドは、スレッドスターターが求めている古典的な方法でスクリプトを実行することと混同しないでください。

Sourceコマンドは、c/Perl/phpの「include」コマンドに似ています。一方、Javaまたはpythonのような言語には、「インポート」メカニズムしかありません。

違いは、これらの言語が、対応するソース/バイナリ/バイトコードファイルにリンクされている利用可能なパッケージの内部データベースを作成することです。 importステートメントを記述することにより、リンクされたソース、バイトコード、またはバイナリファイルがロードされます。これにより、追加のコードを記述せずに、より詳細な依存関係管理が可能になります。 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
4
Lis