あなたが最初のいずれかを実行します。
set AAA [exec tclsh "scriptA.tcl"]
あなたがその文を入れてきたしたTclのプログラム(またはそのプログラムには少なくとも現在のスレッド)サブプロセスが完了するまで続行されません。 Tclは停止し、それを待ちます。
他の代替(つまりopen
またはbgexec
を使用していない)最後の引数として&
を置くことです:
set AAA [exec tclsh "scriptA.tcl" &]
ただし、この場合にはサブプロセスがバックグラウンドで開始され、本当はありません直ちに続行されるマスタープロセスへの接続。この場合のAAA
変数には、プログラムからの出力ではなく、サブプロセスのプロセスIDが含まれます。プラットフォームの通常のシステムツールでそのIDを使用して、そのIDを監視することができます。 (多くのUNIXは/proc/$processID
を見て、実行中のプロセスに関する情報を調べることはできませんが、標準化されておらず、そのディレクトリの内容はです。実際には標準化されていません。いくつかのプロセスIDを使用することができます。
Tcl 8.6では、サブプロセスの監視と処理のための他のオプションを追加しました。 OSが理解したchan pipe
の片方向未処理パイプ(これは一対のチャンネルに接続されています)を使用して、close
の余分な引数を使用して双方向チャンネルの片端を閉じることができます。これにより、exec
でサブプロセスを作成したとしてもfileevent
を使用してサブプロセスを監視するような操作を行うことができますが、その時点ではopen
を使用するよりもはるかに単純ではありません。 exec
コマンドは、チャンネルをサブプロセスに直接接続することをサポートしていますが、実際にはそれらに関連付けられた実際のOSハンドルを持つチャンネル(パイプ、はい、ソケット、はい、端末、はい、ファイル、はい、chan create
、 )。一般的に
、我々はあなたが物事をシンプルに保つことをお勧めします:あなたがサブプロセスを実行し、結果をすぐに待ちたいときのため
exec …
。
open |[list …]
サブプロセスをバックグラウンドで実行して対話する場合(または同じ機能とわずかに異なるインターフェイスを提供するbgexec
)の場合。 Tclのfileevent
は、のパイプラインとターミナル、そしてソケットを備えています。
exec … &
の場合は、バックグラウンドでサブプロセスを実行し、それに対する制御を完全に放棄したい場合に使用します。
実際に複雑なケースには、Expectパッケージがあります。