私はたくさんの機能を実行しています。それぞれが大量のテキストを stdout に出力するため、結果をすばやく確認できません。stdout チャネルへの出力を停止する簡単な方法はありますか? ありがとう
2 に答える
関数がロギング目的で stdout に書き込むだけで、そのすべてを破棄したい場合、およびディスクやソケット、その他の種類のチャネルに書き込みたくない場合、最も簡単な方法は次のとおりです。
rename puts original_puts
proc puts args {} ;# A do-nothing procedure!
通常の操作に戻すには:
rename puts {}
rename original_puts puts
注意しないと、ラップされたコードにエラーがあると問題が発生することに注意してください。これはラップされた「注意深い」バージョンです (Tcl 8.5 用):
proc replacement_puts args {}
proc silentEval {script} {
rename puts original_puts
interp alias {} puts {} replacement_puts
catch [list uplevel 1 $script] msg opts
rename puts {}
rename original_puts puts
return -options $opts $msg
}
次に、これを行うだけです:
silentEval {
call-noisy-function-A
call-noisy-function-B
...
}
ファイル(またはソケットなど)に書き込みたいコードがある場合は、より複雑なreplacement_puts
方法で可能です(常に を使用original_puts
して汚い作業を行うことができます)。
これらの関数が C レベルから stdout に書き込んでいる場合は、さらに行き詰まります。ファイル記述子をシンクに向けることはできますclose stdout;open /dev/null
が、そこから簡単に回復することはできません。(dup
必要な場合は、TclX パッケージに含まれています。) 可能であれば、最初に上記の単純なバージョンを試してください。
stdout/stderr への出力を防止する唯一の良い方法は、スクリプトを実行しているインタープリターから stdout/stderr チャネルを (何らかの方法で) 削除することです。puts
、chan puts
およびに限定fcopy
)
新しい安全な interp を作成し、チャネルをこの interp に転送し、スクリプトを呼び出して、チャネルを元に戻すことをお勧めします。その後、interp を削除するか、同様の目的で再利用するかを選択できます。
proc silentEval {script} {
set i [interp create -safe]
interp transfer {} stdout $i
catch [list uplevel 1 $script] msg opts
interp transfer $i stdout {}
interp delete $i
dict incr $opts -level
return -options $opts $msg
}