2012-09-27 22 views
7

lago un vistazo a estas dos líneasejecutivo de TCL Resultado de redirigidos a la necesidad stdout a almacenar demasiado

caso 1

set cvsUpdStr [exec cvs -qn upd] 

caso 2

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

Por primera case cvsUpdStr es la salida del comando, pero no hay nada impreso durante la ejecución del comando. Para el segundo caso, la salida del comando cvs upd se imprime en la pantalla, pero cvsUpdStr está vacío. ¿Cómo combinarlos para que imprima el resultado de cvs upd y también almacenará la misma salida en la variable cvsUpdStr?

+0

Si usted está especialmente interesado en las cosas de CVS, Puede echar un vistazo a tkcvs, ya que envuelve la mayoría de los comandos CVS con Tcl. http://tksvn.tigris.org/source/browse/tksvn/trunk/tkcvs/ – schlenk

Respuesta

4

Hay dos posibilidades. Puede ejecutarlo como una interconexión (creada con open |...) y manejar los mensajes tal como vienen almacenándolos e imprimiéndolos, o use la utilidad Unix tee. ¡La segunda alternativa es definitivamente más simple!

# I like to spell out “update” in full 
set cvsUpdStr [exec cvs -qn update | tee /dev/tty] 

El programa tee envía su entrada estándar a la salida estándar normal más el archivo llamado; usamos /dev/tty para enviarlo a la terminal actual.

Sin embargo, tenga en cuenta que puede obtener largas demoras en la salida de cvs debido a que el buffer de su salida. Este es solo el comportamiento predeterminado de la gestión de E/S de la biblioteca C al enviar la salida a un terminal no terminal, y puede ser un problema si necesita la salida instantáneamente. La fijación de este se pone un poco complicado (que terminan usando Esperar) por lo que si usted es feliz con la salida siendo ráfagas, simplemente dejarlo solo ...


En Windows, es necesario hacerlo de la otra manera.

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! 

El constructo con |[list ...] es bastante inusual en términos Tcl, pero es la correcta para utilizar en esta situación. (Si el primer carácter del “nombre de archivo” a open es un |, la resto del argumento es tratado como una lista de argumentos a utilizar para la construcción de un oleoducto.)

+0

Estoy en viudas, sobre el tee que conocía, pero no ayuda aquí :( – Narek

+0

¿Cuál es la solución con 'open | .. .''? – Narek

+0

@Narek Pruebe la versión actualizada. –

Cuestiones relacionadas