На эту тему говорили много раз, и есть много примеров на SO и вики, но я не понимаю, что происходит ... в моем случае.
Если я использую exec {*}$mycmd &
, мои строки отображаются в реальном времени на моей консоли, и это то, что я хочу, но я их не ловлю, поэтому я выбрал другой подход и использовал open |$mycmd r
, но мои строки отображаются на конец команды.
% set mycmd [list $exe $journal -args {*}$args 2>c:/temp/error.txt]
% exec {*}$mycmd &
my line display in real time
my line display in real time
my line display in real time
...
...
...
%
мой код с pipeline
: Fileevent пример
set in [open |$mycmd r]
fconfigure $in -blocking 0
fileevent $in readable [list handleFileEvent $in]
vwait ::forever
proc closePipe {f} {
fconfigure $f -blocking true
if {[catch {close $f} err]} {
puts stderr $err
set ::forever 1
} else {
set ::forever 1
}
}
proc handleFileEvent {f} {
set status [catch { gets $f line } result]
if { $status != 0 } {
puts stderr $result
closePipe $f
} elseif { $result >= 0 } {
puts stdout $line
} elseif { [eof $f] } {
closePipe $f
} elseif { [fblocked $f] } {
puts stdout $line
}
}