2011-05-11 9 views

Respuesta

8

No es perfecto (ya que requiere la escritura de archivo externo):

set log [exec executable_file | tee log.txt >@stdout] 

La salida se mostrará inmediatamente, al mismo tiempo, guardado en 'log.txt'. Si no le importa guardar la salida:

set log [exec executable_file >@stdout] 
+2

+1: Tenga en cuenta que ejecutar un comando en una canalización puede cambiar su comportamiento de almacenamiento en búfer; el script esperado 'unbuffer' puede ayudar con eso. –

0

puede ser usted puede iniciar otro proceso en segundo plano antes de su ejecutable, como logfile.txt tail-f, y la salida de los resultados de su ejecutable en este logfile.txt?

+0

¿De modo que no hay forma de obtenerlo en tiempo de ejecución? – Narek

2

Uso open "| ..." y asyncronous lectura del descriptor devuelto, como este linewise:

proc ReadLine fd { 
    if {[gets $fd line] < 0} { 
    if {[chan eof $fd]} { 
     chan close $fd 
     set ::forever now 
     return 
    } 
    } 
    puts $line 
} 

set fd [open "| ./executable_file"] 
chan configure $fd -blocking no 
chan event $fd readable [list ReadLine $fd] 

vwait forever 

Ver this wiki page para ejemplos más complicados.

En un programa real es probable que ya tienen un ciclo de eventos en ejecución por lo que no habría necesidad de un vwait específico para la lectura de la salida de un comando.

Además, si necesita recopilar la salida, no solo [puts] cada línea después de haberla leído, es probable que necesite crear una variable global (generalmente espaciada), inicializarla en "", pasar su nombre como otro argumento al procedimiento de devolución de llamada (ReadLine aquí) y anexar la línea al valor de esa variable.

+0

Si no está recopilando la salida, es mejor conectar directamente el subproceso a stdout. –

Cuestiones relacionadas