2012-01-04 64 views
3

我有一個tclsh腳本,我需要在後臺執行某些命令。 我可以使用exec命令從tcl實現這個功能:exec myprog &從tclsh調用bash builtins

但是我如何等待myprog從tcl完成。 命令wait不是一個獨立的實用程序,所以我可以使用execwait命令是shell內建的。請讓我知道如何等待tclsh腳本中的後臺進程。我在我的腳本中使用#!/ usr/bin/env tclsh shebang。

+3

如果刪除&?會怎麼樣? – rkosegi 2012-01-04 14:00:02

+0

@rkosegi:推測該命令不再在後臺執行。 – zrvan 2012-01-04 14:28:53

+0

如果我刪除&,命令執行並返回一次myprog完成...所以根本就沒有「等待」的問題...... – Mallik 2012-01-04 21:41:11

回答

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將其設置爲非阻塞將允許您從中讀取而不鎖定腳本中的任何其他進程。每當有數據要讀取時(readable標誌),fileevent將調用指定的回調過程(在本例中爲cb)。 vwait將確保腳本不會繼續執行,直到指定的變量被寫入,因此$command將在後臺執行,允許Tk界面保持響應並等待直到您想要繼續。

+0

不錯 - 但問題似乎是'如何同步運行命令'而不是'異步」。 – 2012-01-04 14:27:41

+1

@JonathanLeffler:好的,不是?我的理解是OP希望進程在後臺執行,但Tcl在命令完成之前退出,所以命令應該異步執行,但應用程序應該等待它完成。 – zrvan 2012-01-04 14:31:53