2012-09-27 8 views
7

Lago un'occhiata a questo due lineeexec Tcl risultano reindirizzati a necessità stdout da immagazzinare troppo

caso 1

set cvsUpdStr [exec cvs -qn upd] 

caso 2

set cvsUpdStr [exec cvs -qn upd >&@stdout] 

Per la prima il caso cvsUpdStr è l'output del comando, ma non viene stampato nulla durante l'esecuzione del comando. Per il secondo caso l'output del comando cvs upd viene stampato sullo schermo, ma cvsUpdStr è vuoto. Come combinarli in modo che stampi il risultato di cvs upd e memorizzi anche lo stesso output nella variabile cvsUpdStr?

+0

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

risposta

4

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.)

+0

Sono su vedove, su Tee lo sapevo, ma non aiuta qui :( – Narek

+0

Qual è la soluzione con 'open | .. .'? – Narek

+0

@Narek Prova la versione aggiornata –