7

この2行を見てください

ケース1

set cvsUpdStr [exec cvs -qn upd]

ケース 2

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

最初のケースcvsUpdStrはコマンドの出力ですが、コマンドの実行中に何も出力されません。2 番目のケースでは、cvs updコマンド出力が画面に出力されますが、cvsUpdStr空です。それらを組み合わせて結果を出力し、同じ出力を変数cvs updに保存する方法は?cvsUpdStr

4

1 に答える 1

4

2 つの可能性があります。これをパイプライン ( で作成open |...) として実行し、受信したメッセージを保存して出力することで処理するか、Unixteeユーティリティを使用します。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 処理のデフォルトの動作にすぎず、すぐに出力が必要な場合に問題になる可能性があります。これを修正するには非常に手間がかかります (Expect を使用することになります)。そのため、出力がバーストしていることに満足している場合は、そのままにしておいてください…</p>


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!

with 構文|[list ...]は Tcl 用語ではかなり珍しいものですが、この状況で使用するのに適したものです。(「ファイル名」の最初の文字が の場合open|残り引数は、パイプラインの構築に使用する引数のリストとして扱われます。)

于 2012-09-27T10:42:03.810 に答える