В сценарии tcl, как я могу использовать put для записи строки в консоль и в файл одновременно?
# Prints the string in a file
puts $chan stderr "$timestamp - Running test: $test"
# Prints the string on a console
puts "$timestamp - Running test: $test"
Есть ли способ отправить вывод пут на экран и в файл журнала одновременно? В настоящее время у меня есть две вышеупомянутые строки одна за другой в моем сценарии для достижения этой цели.
Или есть другое решение в tcl?
2 ответа
Используйте следующий процесс вместо puts
:
proc multiputs {args} {
if { [llength $args] == 0 } {
error "Usage: multiputs ?channel ...? string"
} elseif { [llength $args] == 1 } {
set channels stdout
} else {
set channels [lrange $args 0 end-1]
}
set str [lindex $args end]
foreach ch $channels {
puts $ch $str
}
}
Примеры:
# print on stdout only
multiputs "1"
# print on stderr only
multiputs stderr "2"
set brieflog [open brief.log w]
set fulllog [open detailed.log w]
# print on stdout and in the log files
multiputs stdout $brieflog $fulllog "3"
Это не то, что я широко использовал, но, похоже, работает (только Tcl 8.6+):
Вам нужно преобразование канала tcl::transform::observe
пакет:
package require tcl::transform::observe
Откройте файл журнала для записи и установите для буферизации значение none:
set f [open log.txt w]
chan configure $f -buffering none
регистр stdout
в качестве получателя:
set c [::tcl::transform::observe $f stdout {}]
Все что написано на канале $c
Теперь перейдем к файлу журнала и stdout
,
puts $c foobar
Обратите внимание, что, по-видимому, имеет смысл иметь преобразование канала поверх stdout
, с каналом в файл журнала в качестве получателя, но я не смог заставить эту работу.
Документация: chan, open, package, put, set, tcl:: transform:: наблюдаем (пакет)