Vale anche la pena notare che alcuni (molti?) Programmi si comportano in modo diverso quando vengono eseguiti da un utente (ad esempio, sulla riga di comando) rispetto all'essere parte di un processo batch/esecuzione da un altro processo. La vera differenza è se c'è un terminale collegato al processo.
Il comando spawn, parte dell'estensione Expect su Tcl, imposta le cose in modo che il programma eseguito si consideri eseguito da un utente e quindi aggiunge funzionalità per consentire al programma tcl di interagire con il programma esterno in modo conveniente (Ad esempio, la corrispondenza viene emessa tramite espressioni regolari e si ramificano quelle corrispondenze). Le cose che scorrono via spawn vengono eseguite in modo asincrono.
Il comando exec è un comando Tcl di base che esegue l'altro programma, restituendone l'output. Non fa nessuna delle complicate impostazioni che genera spawn, ma può essere molto utile solo per eseguire un programma e vederlo in uscita (ed è il codice di ritorno). Le cose eseguite da exec sono, di default, eseguite in modo sincrono, ma una e commerciale alla fine del comando fa sì che venga eseguito in background (proprio come lo scripting di shell tradizionale).
Il comando di apertura, sebbene generalmente utilizzato per leggere/scrivere file, può essere utilizzato anche per eseguire processi esterni. Precedendo il nome del comando con il simbolo pipe (|), gli dici di eseguire un processo esterno e ottenere l'accesso ai descrittori di file di lettura/scrittura per interagire con il processo risultante. Questo è una sorta di via di mezzo tra exec e spawn, con molta più interazione con il processo disponibile, ma senza la complicata configurazione ambientale che genera. Può essere estremamente utile per interagire con programmi che richiedono input, ma sono ancora abbastanza ben impostati per l'automazione.
Un esempio di tale programma è ironicamente tclsh. –