2012-09-27 18 views
7

湖を最初についてTCL EXEC結果すぎる

ケース1

set cvsUpdStr [exec cvs -qn upd] 

ケース2

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

この二行を見て記憶する必要がケースcvsUpdStrはコマンドの出力ですが、コマンド実行中は何も表示されません。 2番目の場合、cvs updコマンド出力が画面に表示されますが、cvsUpdStrは空です。 cvs updの結果を出力し、同じ出力を変数cvsUpdStrに保存するようにそれらを結合する方法?

+0

あなたはCVSのもので特に興味を持っている場合は、 tkcvsを見ているかもしれません。すでにTclでほとんどのCVSコマンドをラップしています。 http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk

答えて

4

2つの可能性があります。 (open |...で作成された)パイプラインとして実行し、メッセージを格納して印刷したり、Unix teeユーティリティを使用してメッセージを受け取ったときに処理します。 2番目の選択肢は間違いなく簡単です!

# 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面でかなり珍しいですが、このような状況で使用するための正しいものです。 (openに「ファイル名」の最初の文字が|ある場合は、引数の残りがパイプラインを構築するために使用する引数のリストとして扱われます。)

+0

私は知っていたティーについて、未亡人ですが、ここでは助けになりません:( – Narek

+0

'オープン| \\ – Narek

+0

@Narek更新されたバージョンを試してください –

関連する問題