2012-01-04 21 views
3

バックグラウンドで特定のコマンドを実行する必要のあるtclshスクリプトがあります。 私はexecコマンドを使ってtclからこれを達成することができました:exec myprog &tclshからbash組み込み関数を呼び出す

しかし、私はmyprogがtclから完了するのを待つことができます。 コマンドwaitはスタンドアロンのユーティリティではありませんので、execで使用できます。 waitコマンドは、シェルの組み込みコマンドです。 tclshスクリプトのバックグラウンドプロセスをどのように待つことができるか教えてください。

PS:私のスクリプトに#!/ usr/bin/env tclsh shebangを使用しています。

+3

&を削除するとどうなりますか? – rkosegi

+0

@rkosegi:おそらくコマンドはバックグラウンドで実行されなくなるでしょう。 – zrvan

+0

私が&を削除すると、コマンドが実行され、myprogが完了した後に戻ります...待ち時間は全くありません... – Mallik

答えて

2

あなたはTclの中にバックグラウンドでコマンドを実行したい場合は、の線に沿って何かのために行くことができる:コマンドを使用して、「開くことができるようになる前に

proc cb { fd } { 
     gets $fd buf 
     append ::output $buf 
     if {[eof $fd]} { 
      close $fd 
      set ::finished 1 
     } 
} 

set command "<command to execute>" 
set ::output "" 
set ::finished 0 
set fd [open "|$command" r] 
fconfigure $fd -blocking no 
fileevent $fd readable "cb $fd" 
vwait ::finished 
puts $::output 

|openの使用"コマンドへのパイプ。 fconfigureを使用して非ブロッキングに設定すると、スクリプト内の他のプロセスをロックせずに読み込むことができます。 fileeventは、読み取るデータがある場合はいつでも、指定されたコールバックproc(この場合はcb)を呼び出します(したがって、readableフラグ)。 は、指定された変数が書き込まれるまでスクリプトが続行されないようにします。つまり、$commandがバックグラウンドで実行され、Tkインターフェイスが応答したままで、続行するまで待機します。

+0

いいですが、質問は 'コマンドを同期的に実行する方法'非同期に '。 –

+1

@JonathanLeffler:そうですか?私の理解では、OPはプロセスをバックグラウンドで実行することを望んでいますが、コマンドが完了する前にTclが終了するので、コマンドは非同期で実行する必要がありますが、アプリケーションは終了するまで待機する必要があります。 – zrvan

関連する問題