一般的に、ドナルフェローが提案する標準出力リダイレクトをhis answerにお勧めします。
場合によってはこれは不可能です。たぶん、Tclインタープリタは、出力がどこに行くのかという素晴らしいアイデアを持った複雑なアプリケーションにリンクされていて、stdoutチャンネルを復元する方法がわからないことがあります。
このような場合は、puts
コマンドを再定義してみてください。これを行う方法のコード例を示します。単純なTclでは、コマンドをrenamingで安全な名前に再定義し、オリジナルのコマンドを安全な名前で呼び出すラッパーprocを作成することができます。
proc redirect_file {filename cmd} {
rename puts ::tcl::orig::puts
set mode w
set destination [open $filename $mode]
proc puts args "
uplevel \"::tcl::orig::puts $destination \$args\"; return
"
uplevel $cmd
close $destination
rename puts {}
rename ::tcl::orig::puts puts
}
また、変数にテキストをリダイレクトすることができます。
proc redirect_variable {varname cmd} {
rename puts ::tcl::orig::puts
global __puts_redirect
set __puts_redirect {}
proc puts args {
global __puts_redirect
set __puts_redirect [concat $__puts_redirect [lindex $args end]]
set args [lreplace $args end end]
if {[lsearch -regexp $args {^-nonewline}]<0} {
set __puts_redirect "$__puts_redirect\n"
}
return
}
uplevel $cmd
upvar $varname destination
set destination $__puts_redirect
unset __puts_redirect
rename puts {}
rename ::tcl::orig::puts puts
}
Tcl'ersウィキは、より複雑なアプリケーションでは、別のinteresting example of redefining puts
を持っています。多分、これもまた感動的です。
出典
2012-12-19 08:31:18
cfi