Genellikle, Donal Fellows'ın his answer'da önerdiği stdout yönlendirmesini öneririm.
Bazen bu mümkün olmayabilir. Belki de Tcl yorumlayıcısı, çıktının nereye gitmesi gerektiğine dair mükemmel bir fikri olan karmaşık bir uygulamaya bağlanmıştır ve sonra stdout kanalını nasıl geri yükleyeceğinizi bilmiyorsunuzdur.
Bu gibi durumlarda, puts
komutunu yeniden tanımlamayı deneyebilirsiniz. İşte bunu nasıl yapabileceğinize dair bir kod örneği. Düz Tcl'de, bir komut, renaming tarafından güvenli bir adla yeniden tanımlanabilir ve istenen işleve bağlı olarak, orijinal komutunu güvenli adda veya hiç bir şekilde çağırmayan bir sarıcı proc oluşturulabilir.
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
}
Ayrıca bir değişkene metin yönlendirebilirsiniz:
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 Wiki daha karmaşık uygulamalarda başka interesting example of redefining puts
sahiptir. Belki bu da ilham verici.