2012-09-27 35 views
7

湖看看這兩條線TCL EXEC結果重定向到stdout需要存儲太

殼體1

set cvsUpdStr [exec cvs -qn upd] 

殼體2

set cvsUpdStr [exec cvs -qn upd >&@stdout] 

對於第一case cvsUpdStr是該命令的輸出,但在命令執行過程中沒有打印出來。對於第二種情況,cvs upd命令輸出打印在屏幕上,但cvsUpdStr爲空。如何合併它們,以便它將打印出cvs upd的結果,並且還會在cvsUpdStr變量中存儲相同的輸出結果?

+0

,你可能會看看tkcvs,因爲它已經用Tcl包裝了大多數CVS命令。 http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk

回答

4

有兩種可能性。將它作爲流水線運行(使用open |...創建),並通過存儲並打印它們來處理消息,或使用Unix tee實用程序。第二種選擇絕對簡單!

# I like to spell out 「update」 in full 
set cvsUpdStr [exec cvs -qn update | tee /dev/tty] 

tee程序發送它的標準輸入到其正常的標準輸出加上指定的文件;我們使用/dev/tty將其發送到當前終端。

但請注意,由於緩衝其輸出,您可能會在cvs的輸出中產生長時間延遲。這只是C庫的I/O處理向非終端發送輸出時的默認行爲,如果您立即需要輸出,則可能會出現問題。修復此得到相當複雜(你最終使用期望),所以如果你滿意的輸出是突發性的,只是不要管它...


在Windows上,你需要做它的其他方式。

set pipe [open |[list cvs -qn update] "r"] 
while {[gets $pipe line] >= 0} { 
    append cvsUpdStr "$line\n" ;# Note the \n at the end! 
    puts $line 
} 
close $pipe      ;# Any errors turn up here! 

|[list ...]的結構是在Tcl的條款相當不尋常的,但它是正確的在這種情況下使用。如果你在CVS的東西特別感興趣(如果「文件名」來open第一個字符是一個|,爭論的其餘被視爲參數列表用於建設管道。)

+0

我在寡婦身邊,關於tee我知道,但它在這裏沒有幫助:( – Narek

+0

「open」的解決方案是什麼? .'? – Narek

+0

@Narek嘗試更新後的版本。 –