2009-02-16 20 views
15

Estoy aprendiendo a escribir un script TCL (expect) y veo que algunos ejemplos muestran el uso de spawn, mientras que otros muestran el comando exec. Intenté buscar en Google, pero no puedo encontrar cuál es la diferencia.¿Cuál es la diferencia entre spawn y exec?

Supongamos que llamo a 'exec' en medio de un script de espera larga, ¿qué puedo esperar que ocurra?

Respuesta

15

spawn es un comando expect no es un comando tcl. exec es un comando tcl.

spawn crea un proceso. La entrada y la salida de los procesos están conectadas para esperar que los otros comandos de espera: send, expect y interact.

exec crea un subproceso en tcl. En general, el tcl se suspende hasta que el subproceso se completa. Sin embargo, uno puede crear el subproceso en segundo plano (utilizando & como último argumento) y si uno conecta la entrada y salida correctamente, tcl puede interactuar con el subproceso. Esto es muy torpe y es exactamente el tipo de interacción que esperamos fue diseñada para manejar sin problemas.

0

Por lo que sé, spawn devuelve un ID de proceso (y enlaces con Esperar), mientras que el ejecutivo simplemente devuelve el stdout final, a menos que pase "&". Por lo tanto, no afectará sus expectativas.

13

Una forma más sencilla de responder la pregunta es reformularla para preguntar cuándo debe usar exec vs spawn. En resumen, use spawn para comandos interactivos y exec para comandos no interactivos.

5

También vale la pena señalar que algunos (¿muchos?) Programas se comportan de manera diferente cuando los ejecuta un usuario (es decir, en la línea de comandos) frente a ser parte de un proceso por lotes/ejecución de otro proceso. La diferencia real es si hay una terminal conectada al proceso.

El comando spawn, parte de la extensión Expect para Tcl, configura las cosas para que el programa ejecutado se vea como ejecutado por un usuario y luego agrega funcionalidad para permitir que el programa tcl interactúe con el programa externo de manera conveniente (es decir, hacer coincidir su salida a través de expresiones regulares y ramificar esas coincidencias). Las cosas que se ejecutan a través de spawn se ejecutan de forma asíncrona.

El comando exec es un comando core Tcl que ejecuta el otro programa y devuelve su salida. No hace ninguna de las complicadas configuraciones que genera, pero puede ser muy útil solo para ejecutar un programa y ver su salida (y su código de retorno). Las cosas que ejecuta Exec son, de forma predeterminada, ejecutadas de forma síncrona, pero un símbolo de unión al final del comando hace que se ejecute en segundo plano (al igual que las secuencias de comandos de shell tradicionales).

El comando Abrir, aunque se usa generalmente para leer/escribir archivos, también se puede usar para ejecutar procesos externos. Al anteceder el nombre del comando con el símbolo de tubería (|), le dice que ejecute un proceso externo y obtenga acceso a los descriptores de archivos de lectura/escritura para interactuar con el proceso resultante. Esta es una especie de término medio entre el ejecutor y el engendro, con mucha más interacción con el proceso disponible, pero sin la complicada configuración ambiental que genera. Puede ser extremadamente útil para interactuar con programas que requieren entrada, pero todavía están bastante bien configurados para la automatización.

+0

Un ejemplo de este tipo de programa es irónicamente tclsh. –

Cuestiones relacionadas