2009-02-16 10 views
15

Sto imparando a scrivere uno script TCL (previsto) e noto che alcuni esempi mostrano di usare spawn, mentre altri mostrano il comando exec. Ho provato su google, ma non riesco a trovare qual è la differenza?Qual è la differenza tra spawn ed exec?

Supponiamo che io chiami "exec" nel bel mezzo di uno script long expect, cosa posso aspettarmi che accada?

risposta

15

spawn è un comando expect non un comando tcl. exec è un comando tcl.

spawn crea un processo. L'input e l'output dei processi sono connessi per essere utilizzati dagli altri comandi previsti: send, expect e interact.

exec crea un sottoprocesso in tcl. In generale il tcl è sospeso fino al completamento del sottoprocesso. Tuttavia, uno può creare sottoprocesso in background (utilizzando & come ultimo argomento) e se uno collega l'input e l'output correttamente, tcl può interagire con il sottoprocesso. Questo è molto maldestro ed è esattamente il tipo di interazione che ci si aspetta sia stato progettato per gestire agevolmente.

0

Per quanto ne so, spawn restituisce un ID di processo (e collega con Expect), mentre exec restituisce solo lo stdout finale, a meno che non si passi "&". Quindi non influenzerà le tue aspettative.

13

Un modo più semplice di rispondere alla domanda è riformulandolo per chiedere quando è necessario utilizzare exec vs spawn. In breve, utilizzare spawn per comandi interattivi ed exec per comandi non interattivi.

5

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.

+0

Un esempio di tale programma è ironicamente tclsh. –

Problemi correlati