Я ищу код Tcl, который дублировал бы то, что помещает команда отправляет на стандартный вывод в какой-либо файл журнала. Да, есть возможность изменить все вызовы puts на какую-то пользовательскую функцию. Но хотелось бы сделать его максимально прозрачным. У меня есть этот пробный код, но он не очень хорошо работает:
set pass_log_output "0"
rename puts _puts
proc puts { args } {
global pass_log_output
if {[info exists pass_log_output]} {
# There can be several cases:
# -nonewline parameter, stdout specified or not
set stdout_dest [ lsearch $args stdout ]
set nonewline [ lsearch $args -nonewline ]
if { $stdout_dest != -1 } {
log_low_level "" [lindex $args [expr $stdout_dest + 1]] ""
} elseif { $nonewline != -1 && [ llength $args ] > 1} {
log_low_level "" [lindex $args [expr $nonewline + 1]] ""
} else {
log_low_level "" [lindex $args 0] ""
}
}
if { [ catch { eval _puts $args } err ] } {
return -code error $err
}
}
Функция log_low_level просто сохраняет переданную строку в файл. Пока я получаю эту ошибку:
Tcl Interpreter Error: too many nested evaluations (infinite loop?)