En general, recomendaría la redirección estándar que sugiere Donal Fellows en his answer.
A veces esto no es posible. Tal vez el intérprete Tcl está vinculado a una aplicación compleja que tiene una idea elegante de hacia dónde debe ir el resultado, y luego usted no sabe cómo restaurar el canal stdout.
En esos casos, puede intentar redefinir el comando puts
. Aquí hay un ejemplo de código sobre cómo puedes hacer eso. En Tcl simple, un comando puede ser redefinido por renaming en un nombre seguro, y creando un proceso de envoltura que llama al comando original con el nombre seguro - o no funciona en absoluto, dependiendo de la funcionalidad deseada.
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
}
También puede redirigir el texto en una variable:
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
}
El Tcl'ers Wiki tiene otra interesting example of redefining puts
en aplicaciones más complejas. Quizás esto es inspirador también.