2009-02-16 16 views
15

Ich lerne, ein TCL (expect) Skripte zu schreiben, und ich bemerke, dass einige Beispiele zeigen, um spawn zu verwenden, während andere den Befehl exec zeigen. Ich habe versucht zu googeln, aber kann nicht finden, was ist der Unterschied?Was ist der Unterschied zwischen Spawn und Exec?

Angenommen, ich rufe 'exec' mitten in einem langen expect-Skript auf, was kann ich erwarten?

Antwort

15

spawn ist ein expect Befehl kein tcl Befehl. exec ist ein tcl Befehl.

spawn erstellt einen Prozess. Der Eingang und der Ausgang der Prozesse sind verbunden, damit sie von den anderen expect-Befehlen erwartet werden: send, expect und interact.

exec erstellt einen Unterprozess unter tcl. Im Allgemeinen wird der Tcl ausgesetzt, bis der Subprozess abgeschlossen ist. Allerdings kann man erstellen den Unterprozess im Hintergrund (mit & als letztes Argument) und wenn man die Eingabe und Ausgabe richtig hakt, kann tcl mit dem Subprozess interagieren. Dies ist sehr ungeschickt und ist genau die Art von Interaktion, die erwartet wurde, um reibungslos zu handhaben.

0

Soweit ich weiß, gibt spawn eine Prozess-ID zurück (und verlinkt mit Expect), während exec nur das endgültige stdout zurückgibt, es sei denn, Sie übergeben "&". Es wird also Ihre Erwartungen nicht beeinflussen.

13

Eine einfachere Art, die Frage zu beantworten, ist, sie neu zu formulieren, um zu fragen, wann man exec vs spawn verwenden soll. Kurz gesagt, verwende spawn für interaktive Befehle und exec für nicht interaktive Befehle.

5

Es ist auch erwähnenswert, dass einige (viele?) Programme sich anders verhalten, wenn sie von einem Benutzer (dh an der Befehlszeile) als Teil eines Stapelprozesses/Laufs von einem anderen Prozess ausgeführt werden. Der tatsächliche Unterschied besteht darin, ob ein Terminal an den Prozess angeschlossen ist. Der Spawn-Befehl, ein Teil der Expect-Erweiterung von Tcl, richtet Dinge so ein, dass sich das ausgeführte Programm als von einem Benutzer ausgeführt versteht und dann Funktionalität hinzufügt, um dem tcl-Programm auf bequeme Weise die Interaktion mit dem externen Programm zu ermöglichen (dh, es wird über reguläre Ausdrücke ausgegeben und verzweigt diese Übereinstimmungen). Dinge, die über Spawn laufen, werden asynchron ausgeführt.

Der Befehl exec ist ein Tcl-Kernbefehl, der das andere Programm ausführt und dessen Ausgabe zurückgibt. Es tut nichts von der komplizierten Einrichtung, die spawn tut, aber es kann sehr praktisch sein, einfach ein Programm auszuführen und seine Ausgabe zu sehen (und es ist der Rückkehrcode). Dinge, die von exec ausgeführt werden, werden standardmäßig synchron ausgeführt, aber ein kaufmännisches Und-Zeichen am Ende des Befehls bewirkt, dass es im Hintergrund ausgeführt wird (ähnlich wie beim traditionellen Shell-Scripting).

Der Befehl open, der normalerweise zum Lesen/Schreiben von Dateien verwendet wird, kann auch zum Ausführen externer Prozesse verwendet werden. Indem Sie dem Befehlsnamen das Pipe-Symbol (|) voranstellen, geben Sie ihm an, einen externen Prozess auszuführen und Zugriff auf Lese-/Schreib-Dateideskriptoren zu erhalten, um mit dem resultierenden Prozess zu interagieren. Dies ist eine Art Mittelweg zwischen Exec und Spawn, mit viel mehr Interaktion mit dem verfügbaren Prozess, aber ohne die komplizierte Umgebung, die das Spawn tut. Es kann sehr praktisch für die Interaktion mit Programmen sein, die Eingaben benötigen, aber für die Automatisierung noch ziemlich gut eingerichtet sind.

+0

Ein Beispiel für ein solches Programm ist ironisch tclsh. –