Ci sono due possibilità. Eseguilo come pipeline (creato con open |...
) e gestisci i messaggi man mano che arrivano memorizzandoli e stampandoli oppure utilizza l'utilità Unix tee
. La seconda alternativa è sicuramente più semplice!
# I like to spell out “update” in full
set cvsUpdStr [exec cvs -qn update | tee /dev/tty]
Il programma tee
invia il suo standard input al suo normale standard di uscita più il file denominato; usiamo /dev/tty
per inviarlo al terminale corrente.
Si noti tuttavia che potrebbero verificarsi lunghi ritardi nell'output di cvs
a causa del buffering dell'output. Questo è solo il comportamento predefinito della gestione I/O della libreria C quando si invia l'output a un non-terminale e può essere un problema se è necessario l'output all'istante. Fissaggio questo diventa piuttosto complessa (si finisce per utilizzare Aspettatevi) quindi se sei felice con l'uscita essendo a raffica, basta lasciarlo solo ...
Su Windows, è necessario fare il contrario.
set pipe [open |[list cvs -qn update] "r"]
while {[gets $pipe line] >= 0} {
append cvsUpdStr "$line\n" ;# Note the \n at the end!
puts $line
}
close $pipe ;# Any errors turn up here!
Il costrutto con |[list ...]
è piuttosto inusuale in termini Tcl, ma è quello corretto da utilizzare in questa situazione. (Se il primo carattere del “nome del file” per open
è una |
, il resto della argomento è trattato come un elenco di argomenti da utilizzare per la costruzione di un oleodotto.)
fonte
2012-09-27 10:42:03
Se siete particolarmente interessati a cose CVS, potresti dare un'occhiata a tkcvs, dato che include già la maggior parte dei comandi CVS con Tcl. http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk