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.
Un ejemplo de este tipo de programa es irónicamente tclsh. –