Expect ist ein Programm, das gemäß einem Skript mit anderen interaktiven Programmen spricht. Nach dem Skript weiß Expect, was von einem Programm erwartet werden kann und wie die richtige Antwort sein sollte. Eine interpretierte Sprache bietet Verzweigungs- und Steuerungsstrukturen auf hoher Ebene, um den Dialog zu steuern. Darüber hinaus kann der Benutzer die Kontrolle übernehmen und direkt interagieren, wenn dies gewünscht wird, und anschließend die Kontrolle an das Skript zurückgeben.
Expectk ist eine Mischung aus Expect und Tk. Es verhält sich genauso wie der Wunsch von Expect und Tk. Expect kann auch direkt in C oder C ++ ohne Tcl verwendet werden.
Der Name "Expect" kommt von der Idee, dass Sende- / Erwartungs-Sequenzen durch uucp, kermit und andere Modemsteuerungsprogramme verbreitet werden. Im Gegensatz zu uucp wird Expect jedoch verallgemeinert, sodass es als Befehl auf Benutzerebene mit jedem Programm und jeder Aufgabe ausgeführt werden kann. Expect kann mit mehreren Programmen gleichzeitig sprechen.
Was können Sie tun?
Hier einige Beispiele, die der Expect-Befehl ausführen kann:
- Lassen Sie sich vom Computer zurückrufen, damit Sie sich anmelden können, ohne den Anruf zu bezahlen.
- Starten Sie ein Spiel, und wenn die optimale Konfiguration nicht angezeigt wird, starten Sie es immer wieder neu, bis dies der Fall ist, und übergeben Sie die Kontrolle an Sie.
- Führen Sie fsck aus und beantworten Sie als Antwort auf seine Fragen "Ja" oder "Nein", oder geben Sie die Kontrolle nach vorgegebenen Kriterien zurück.
- Stellen Sie eine Verbindung zu einem anderen Netzwerk her und rufen Sie Ihre E-Mails automatisch ab, sodass sie so aussehen, als wäre sie ursprünglich an Ihr lokales System gesendet worden.
- Übertragen Sie Umgebungsvariablen, aktuelles Verzeichnis oder beliebige Informationen über rlogin, telnet, tip, su oder chgrp
Es gibt verschiedene Gründe, warum die Shell diese Aufgaben nicht ausführen kann. Alle sind mit Expect möglich.
Im Allgemeinen ist Expect nützlich, um alle Programme auszuführen, die eine Interaktion zwischen dem Programm und dem Benutzer erfordern. Es ist lediglich notwendig, dass die Interaktion programmatisch charakterisiert werden kann. Expect kann dem Benutzer auch die Kontrolle zurückgeben, ohne das gesteuerte Programm zu stoppen. In ähnlicher Weise kann der Benutzer jederzeit die Kontrolle an das Skript zurückgeben.
Verwendungszweck
Expect liest die Datei cmdfile für eine Liste der auszuführenden Befehle. Expect kann implizit auf Systemen aufgerufen werden, die das # unterstützen! Notation durch Markieren des Skripts als ausführbar und Erstellen der ersten Zeile im Skript:
#! / usr / local / bin / expect -f
Natürlich muss der Pfad genau beschreiben, wo Expect lebt. / usr / local / bin ist nur ein Beispiel.
Das Flag -c stellt einen Befehl vor, der vor einem beliebigen Skript ausgeführt werden soll. Der Befehl sollte in Anführungszeichen gesetzt werden, um zu verhindern, dass die Shell sie auflöst. Diese Option kann mehrfach verwendet werden. Mehrere Befehle können mit einem einzigen -c ausgeführt werden, indem sie durch Semikola getrennt werden. Befehle werden in der Reihenfolge ausgeführt, in der sie erscheinen. Bei Verwendung von Expectk wird diese Option als -command angegeben.
Das Flag -d aktiviert einige Diagnoseausgaben, die hauptsächlich die interne Aktivität von Befehlen wie "Expect" und "Interaction" anzeigen. Dieses Flag hat den gleichen Effekt wie "exp_internal 1" am Anfang eines Expect-Skripts. Außerdem wird die Version von Expect gedruckt.
Das Flag -D ermöglicht einen interaktiven Debugger. Ein ganzzahliger Wert sollte folgen. Der Debugger übernimmt die Kontrolle vor der nächsten Tcl-Prozedur, wenn der Wert nicht Null ist oder wenn ein ^ C gedrückt wird oder ein Haltepunkt getroffen wird oder ein anderer geeigneter Debugger-Befehl im Skript angezeigt wird. Bei Verwendung von Expectk ist diese Option als angegeben -Debuggen.
Das Flag -f stellt eine Datei vor, aus der Befehle gelesen werden sollen. Das Flag selbst ist optional, da es nur bei der Verwendung von # nützlich ist! Notation, so dass andere Argumente in der Befehlszeile angegeben werden können. Bei Verwendung von Expectk wird diese Option als -file angegeben.
Standardmäßig wird die Befehlsdatei in den Speicher eingelesen und vollständig ausgeführt. Es ist gelegentlich wünschenswert, Dateien zeilenweise zu lesen. Verwenden Sie das Flag -b, um beliebige Dateien auf diese Weise zu behandeln. Bei Verwendung von Expectk wird diese Option als -buffer angegeben.
Wenn der String "-" als Dateiname angegeben wird, wird stattdessen die Standardeingabe gelesen. Verwenden Sie "./-", um aus einer Datei mit dem Namen "-" zu lesen.
Das Flag -i bewirkt, dass Expect interaktiv nach Befehlen fragt, anstatt sie aus einer Datei zu lesen. Die Aufforderung wird über den exit-Befehl oder über EOF beendet. Das Flag -i wird angenommen, wenn weder eine Befehlsdatei noch -c verwendet wird. Bei Verwendung von Expectk wird diese Option als -interactive angegeben.
- kann verwendet werden, um das Ende der Optionen zu begrenzen. Dies ist nützlich, wenn Sie ein optionähnliches Argument an Ihr Skript übergeben möchten, ohne dass es von Expect interpretiert wird. Dies kann sinnvoll in das # eingefügt werden! Zeile, um eine flaggenartige Interpretation von Expect zu verhindern. Im folgenden Beispiel werden die ursprünglichen Argumente einschließlich des Skriptnamens in der Variablen beibehalten argv .
#! / usr / local / bin / expect -
Beachten Sie, dass beim Hinzufügen von Argumenten zu den # die üblichen Konventionen getopt (3) und execve (2) beachtet werden müssen! Linie.
Die Datei $ exp_library / expect.rc wird, sofern vorhanden, automatisch angegeben, sofern nicht das Flag -N verwendet wird. (Bei Verwendung von Expectk ist diese Option als -NORC angegeben.) Unmittelbar danach wird die Datei ~ / .expect.rc automatisch bereitgestellt, sofern nicht das Flag -n verwendet wird. Wenn die Umgebungsvariable DOTDIR definiert ist, wird sie als Verzeichnis behandelt und .expect.rc wird von dort gelesen. Bei Verwendung von Expectk wird diese Option als -norc angegeben.Diese Beschaffung erfolgt erst nach dem Ausführen von -c-Flags.
-v bewirkt, dass Expect seine Versionsnummer druckt und beendet. Das entsprechende Flag in Expectk, das lange Flagnamen verwendet, ist -version.
Optionale Argumente werden in einer Liste erstellt und in der Variablen argv und gespeichert. argc wird auf die Länge von argv initialisiert.
Argv0 ist definiert als Name des Skripts oder binär, wenn kein Skript verwendet wird. Das Folgende gibt beispielsweise den Namen des Skripts und die ersten drei Argumente aus:
send_user "$ argv0 lrange $ argv 0 2 n"
Befehle
Expect verwendet die Werkzeugbefehlssprache. Tcl bietet einen Kontrollfluss (wenn für break), die Auswertung von Ausdrücken und verschiedene andere Funktionen wie Rekursion und Prozedurdefinition. Befehle, die hier verwendet werden, aber nicht definiert sind (set, if, exec), sind Tcl-Befehle. Expect unterstützt zusätzliche Befehle. Wenn nicht anders angegeben, geben Befehle die leere Zeichenfolge zurück.
Befehle werden alphabetisch aufgelistet, damit sie schnell gefunden werden können. Für neue Benutzer ist es jedoch möglicherweise einfacher, die Beschreibungen von Spawn, Senden, Erwarten und Interagieren in dieser Reihenfolge zu lesen.
close -slave -onexec 0 | 1 -i spawn_id
Schließt die Verbindung zum aktuellen Prozess. Die meisten interaktiven Programme erkennen EOF auf ihrem Standard und werden beendet. somit schließen Normalerweise genügt es, den Prozess ebenfalls zu beenden. Das -i-Flag deklariert den zu schließenden Prozess entsprechend der genannten Spawn-ID.
Expect und Interact erkennen, wann der aktuelle Prozess beendet ist, und schließen implizit, aber wenn Sie den Prozess mit "exec kill $ pid" beenden, müssen Sie explizit close aufrufen.
Das -onexec-Flag legt fest, ob die Spawn-ID in neuen Spawn-Prozessen geschlossen wird oder ob der Prozess überlagert wird. Um eine Spawn-ID geöffnet zu lassen, verwenden Sie den Wert 0. Ein ganzzahliger Wert ungleich Null zwingt den Spawn in allen neuen Prozessen.
Das Flag -slave schließt den Slave, der der Spawn-ID zugeordnet ist. Wenn die Verbindung geschlossen wird, wird der Slave automatisch geschlossen, wenn er noch geöffnet ist.
Unabhängig davon, ob die Verbindung implizit oder explizit geschlossen wird, sollten Sie wait aufrufen, um den entsprechenden Kernel-Prozess-Slot aufzuräumen. Der Befehl zum Schließen ruft nicht wait auf, da keine Garantie dafür besteht, dass das Schließen einer Prozessverbindung dazu führt, dass diese beendet wird.
debuggen -now 0 | 1
steuert einen Tcl-Debugger, mit dem Sie Anweisungen schrittweise durchgehen und Haltepunkte setzen können.
Ohne Argumente wird eine 1 zurückgegeben, wenn der Debugger nicht ausgeführt wird. Andernfalls wird eine 0 zurückgegeben.
Mit einem Argument 1 wird der Debugger gestartet. Mit einem 0-Argument wird der Debugger angehalten. Wenn einem Argument das Argument -now vorangestellt wird, wird der Debugger sofort gestartet. Andernfalls wird der Debugger mit der nächsten Tcl-Anweisung gestartet.
Der Befehl debug ändert keine Traps. Vergleichen Sie dies mit dem Start von Expect mit dem Flag -D.
Der Befehl disconnect trennt einen gegabelten Prozess vom Terminal. Es läuft weiter im Hintergrund. Der Prozess erhält eine eigene Prozessgruppe. Standard-E / A wird zu / dev / null umgeleitet.
Das folgende Fragment verwendet disconnect, um das Skript im Hintergrund weiter auszuführen.
Wenn {Gabel! = 0} beendet wird, trennen Sie die Verbindung. . .
Das folgende Skript liest ein Kennwort und führt dann stündlich ein Programm aus, das bei jeder Ausführung ein Kennwort verlangt. Das Skript gibt das Kennwort an, damit Sie es nur einmal eingeben müssen.
send_user "Kennwort?" "erwartet_Benutzer -re" (. *) n "für {} 1 {} {Wenn {Abzweigung! = 0} {sleep 3600; fortsetzen} Sperre der Verbindung trennen Priv_prog Erwarten Kennwort: Sende" 1, string) r ". . . Ausfahrt }
Ein Vorteil der Verwendung von Disconnect gegenüber der Shell-Funktion für asynchronen Prozess (&) ist, dass Expect die Terminalparameter vor dem Trennen der Verbindung speichern und sie später auf neue ptys anwenden kann. Mit & hat Expect keine Möglichkeit, die Parameter des Terminals zu lesen, da das Terminal bereits zu dem Zeitpunkt getrennt ist, zu dem Expect die Kontrolle erhält.
exit -opts status
bewirkt, dass Expect beendet wird oder sich anderweitig darauf vorbereitet.
Das -exit Flag bewirkt, dass das nächste Argument als Exit-Handler verwendet wird. Ohne Argument wird der aktuelle Exit-Handler zurückgegeben.
Das -Kein Ausgang Flag verursacht Erwarten von um sich auf das Beenden vorzubereiten, stoppen Sie jedoch erst, wenn Sie die Kontrolle an das Betriebssystem zurückgeben. Der benutzerdefinierte Exit-Handler wird ebenso wie die internen Handler von Expect ausgeführt. Es dürfen keine weiteren Expect-Befehle ausgeführt werden. Dies ist nützlich, wenn Sie Expect mit anderen Tcl-Erweiterungen ausführen. Der aktuelle Interpreter (und das Hauptfenster in der Tk-Umgebung) bleiben erhalten, sodass andere Tcl-Erweiterungen aufräumen können. Wenn Sie erwarten Ausfahrt erneut aufgerufen wird (dies kann jedoch vorkommen), werden die Handler nicht erneut ausgeführt.
Beim Beenden werden alle Verbindungen zu den erzeugten Prozessen geschlossen. Die Schließung wird durch erzeugte Prozesse als EOF erkannt. Ausfahrt führt keine anderen Aktionen aus als die normale _exit (2) -Prozedur. Spawn-Prozesse, die nicht auf EOF prüfen, können daher weiterhin ausgeführt werden. (Eine Vielzahl von Bedingungen ist zum Beispiel wichtig, um zu bestimmen, welche Signale ein generierter Prozess gesendet wird, diese sind jedoch systemabhängig und werden normalerweise unter exit (3) dokumentiert.) Entstehende Prozesse, die weiterhin ausgeführt werden, werden von init geerbt.
Status (oder 0, falls nicht angegeben) wird als Beendigungsstatus von zurückgegeben Erwarten von . Ausfahrt wird implizit ausgeführt, wenn das Ende des Skripts erreicht ist.
exp_continue -continue_timer
Der Befehl exp_continue erlaubt erwarten von sich fortzusetzen, statt wie üblich zurückzukehren. Standardmäßig exp_continue setzt den Timeout-Timer zurück. Das -continue_timer Flag verhindert, dass der Timer neu gestartet wird. (Sehen erwarten von für mehr Informationen.)
exp_internal -f file -Wert
bewirkt, dass weitere Befehle interne Diagnoseinformationen senden Erwarten von zu stderr wenn Wert ist nicht Null. Dieser Ausgang ist deaktiviert, wenn Wert ist 0. Die Diagnoseinformation enthält jedes empfangene Zeichen und jeden Versuch, die aktuelle Ausgabe mit den Mustern abzugleichen.
Wenn das optional ist Datei Wird geliefert, werden alle normalen und Debugging-Ausgaben in diese Datei geschrieben (unabhängig vom Wert von Wert ). Alle vorherigen Diagnoseausgabedateien werden geschlossen.
Das -Info Flag bewirkt, dass exp_internal eine Beschreibung der zuletzt angegebenen Nicht-Info-Argumente zurückgibt.
exp_open args -i spawn_id
gibt eine Tcl-Datei-ID zurück, die der ursprünglichen Spawn-ID entspricht. Die Datei-ID kann dann so verwendet werden, als ob sie von Tcl geöffnet wurde öffnen Befehl. (Die Spawn-ID sollte nicht mehr verwendet werden. A warten sollte nicht ausgeführt werden.
Das -offenlassen Flag lässt die Spawn-ID für den Zugriff über Expect-Befehle geöffnet. EIN warten muss auf der Spawn-ID ausgeführt werden.
exp_pid -i spawn_id
gibt die Prozess-ID zurück, die dem aktuell erzeugten Prozess entspricht. Wenn die -ich Flag verwendet wird, entspricht die zurückgegebene PID der der angegebenen Spawn-ID.
exp_send
ist ein Alias für senden .
exp_send_error
ist ein Alias für Fehler senden .
exp_send_log
ist ein Alias für send_log .
exp_send_tty
ist ein Alias für send_tty .
exp_send_user
ist ein Alias für send_user .
exp_version -exit version
ist nützlich, um sicherzustellen, dass das Skript mit der aktuellen Version von Expect kompatibel ist.
Ohne Argumente wird die aktuelle Version von Erwarten von ist zurück gekommen. Diese Version kann dann in Ihrem Skript codiert werden. Wenn Sie tatsächlich wissen, dass Sie keine Funktionen der letzten Versionen verwenden, können Sie eine frühere Version angeben.
Versionen bestehen aus drei durch Punkte getrennten Zahlen. Erstens ist die Hauptzahl. Skripts für Versionen von Erwarten von mit einer anderen großen nummer wird es fast sicher nicht funktionieren. exp_version Gibt einen Fehler zurück, wenn die Hauptzahlen nicht übereinstimmen.
Zweitens ist die Nebenzahl. Skripts, die für eine Version mit einer höheren Nebennummer als die aktuelle Version geschrieben wurden, können von einigen neuen Funktionen abhängen und möglicherweise nicht ausgeführt werden. exp_version Gibt einen Fehler zurück, wenn die Hauptzahlen übereinstimmen, die Nebennummer des Skripts jedoch größer ist als die laufende Zahl Erwarten von .
Drittens ist eine Zahl, die im Versionsvergleich keine Rolle spielt. Es wird jedoch erhöht, wenn die Erwarten von Die Softwareverteilung wird auf beliebige Weise geändert, z. B. durch zusätzliche Dokumentation oder Optimierung. Bei jeder neuen Nebenversion wird es auf 0 zurückgesetzt.
Mit dem -Ausfahrt Flagge, Erwarten von gibt einen Fehler aus und wird beendet, wenn die Version nicht mehr aktuell ist.
erwarten -opts pat1 body1 … -opts patn bodyn
wartet, bis eines der Muster mit der Ausgabe eines erzeugten Prozesses übereinstimmt, ein bestimmter Zeitraum verstrichen ist oder ein Dateiende erkannt wird. Wenn der letzte Körper leer ist, kann er weggelassen werden.
Muster aus dem neuesten Erwarten_vorher Befehl werden implizit vor allen anderen Mustern verwendet. Muster aus dem neuesten erwarten_nach Befehl werden implizit nach allen anderen Mustern verwendet.
Wenn die Argumente auf die gesamte erwarten von Eine Anweisung erfordert mehr als eine Zeile. Alle Argumente können in eine "geschichtet" werden, um zu vermeiden, dass jede Zeile mit einem Backslash abgeschlossen wird. In diesem Fall treten die üblichen Tcl-Substitutionen trotz der geschweiften Klammern auf.
Wenn ein Muster das Schlüsselwort ist eof wird der entsprechende Hauptteil am Dateiende ausgeführt. Wenn ein Muster das Schlüsselwort ist Auszeit , wird der entsprechende Body nach einer Zeitüberschreitung ausgeführt. Wenn kein Timeout-Schlüsselwort verwendet wird, wird bei Timeout eine implizite Null-Aktion ausgeführt. Die voreingestellte Timeout-Zeit beträgt 10 Sekunden, kann aber mit dem Befehl "set timeout 30" auf beispielsweise 30 eingestellt werden. Ein unendlicher Timeout kann mit dem Wert -1 bezeichnet werden. Wenn ein Muster das Schlüsselwort ist Standard wird der entsprechende Hauptteil entweder nach einer Zeitüberschreitung oder nach einem Dateiende ausgeführt.
Wenn ein Muster übereinstimmt, wird der entsprechende Body ausgeführt. erwarten von gibt das Ergebnis des Hauptteils zurück (oder die leere Zeichenfolge, wenn kein Muster gefunden wurde). Falls mehrere Muster übereinstimmen, wird das zuerst erscheinende verwendet, um einen Körper auszuwählen.
Jedes Mal, wenn eine neue Ausgabe ankommt, wird sie mit jedem Muster in der Reihenfolge verglichen, in der sie aufgelistet sind. Daher können Sie das Fehlen einer Übereinstimmung testen, indem Sie dafür sorgen, dass das letzte Muster garantiert angezeigt wird, z. B. eine Eingabeaufforderung. In Situationen, in denen keine Aufforderung vorhanden ist, müssen Sie verwenden Auszeit (genau wie Sie es tun würden, wenn Sie manuell interagieren würden).
Muster werden auf drei Arten angegeben. Standardmäßig werden Muster wie bei Tcl angegeben String-Übereinstimmung Befehl. (Solche Muster ähneln auch regulären Ausdrücken der C-Shell, die normalerweise als "Glob" -Muster bezeichnet werden). Das -gl Flag kann verwendet werden, um Muster zu schützen, die ansonsten übereinstimmen könnten erwarten von Flaggen davon. Jedes Muster, das mit einem "-" beginnt, sollte auf diese Weise geschützt werden. (Alle Zeichenfolgen, die mit "-" beginnen, sind für zukünftige Optionen reserviert.)
Das folgende Fragment sucht beispielsweise nach einer erfolgreichen Anmeldung. (Beachten Sie, dass abbrechen Es wird angenommen, dass es sich um eine Prozedur handelt, die an anderer Stelle im Skript definiert ist.)
erwarten {beschäftigt {setzt beschäftigt n; exp_continue} Abbruch fehlgeschlagen "ungültiges Kennwort" Abbruchzeitüberschreitung Abbruch verbunden}
Beim vierten Muster sind Anführungszeichen erforderlich, da es ein Leerzeichen enthält, das das Muster sonst von der Aktion trennen würde.Bei Mustern mit derselben Aktion (z. B. 3. und 4.) müssen die Aktionen erneut aufgelistet werden. Dies kann durch die Verwendung von Regex-Mustern vermieden werden (siehe unten). Weitere Informationen zum Formen von Glob-Mustern finden Sie im Tcl-Handbuch.
Muster im Regexp-Stil folgen der von Tcl definierten Syntax Regex (kurz für "regulärer Ausdruck") Befehl. Regex-Muster werden mit der Flagge eingeführt -Re . Das vorherige Beispiel kann mit einem regulären Ausdruck wie folgt umgeschrieben werden:
erwarten {beschäftigt {setzt beschäftigt n; exp_continue} -re "fehlgeschlagen | ungültiges Kennwort" Abbruchzeitüberschreitung Abbruch verbunden}
Beide Arten von Mustern sind "nicht verankert". Dies bedeutet, dass Muster nicht mit der gesamten Zeichenfolge übereinstimmen müssen, sondern die Übereinstimmung an einer beliebigen Stelle in der Zeichenfolge beginnen und enden können (sofern alles andere übereinstimmt). Verwenden Sie ^, um den Anfang einer Zeichenfolge zu finden, und $, um das Ende zu finden. Wenn Sie nicht auf das Ende einer Zeichenfolge warten, können Ihre Antworten leicht in der Mitte der Zeichenfolge enden, da sie vom erzeugten Prozess wiederholt werden. Die Ausgabe kann zwar immer noch korrekte Ergebnisse liefern, aber sie kann unnatürlich aussehen. Daher wird die Verwendung von $ empfohlen, wenn Sie die Zeichen am Ende einer Zeichenfolge genau beschreiben können.
Beachten Sie, dass in vielen Editoren die Zeichen ^ und $ jeweils am Anfang und am Ende der Zeile liegen. Da Expect jedoch nicht zeilenorientiert ist, stimmen diese Zeichen mit dem Anfang und dem Ende der Daten (im Gegensatz zu Zeilen) überein, die sich aktuell im Expect-Matching-Puffer befinden. (Siehe auch den Hinweis unter "Verdauungsstörung").
Das -Ex Flag bewirkt, dass das Muster als "exakte" Zeichenfolge abgeglichen wird. Es wird keine Interpretation von *, ^ usw. vorgenommen (obwohl die üblichen Tcl-Konventionen immer noch beachtet werden müssen). Genaue Muster sind immer unverankert.
Das -kein Fall Flag bewirkt, dass Großbuchstaben der Ausgabe verglichen werden, als ob sie Kleinbuchstaben wären. Das Muster ist nicht betroffen.
Beim Lesen der Ausgabe können mehr als 2000 Bytes das "Vergessen" früherer Bytes erzwingen. Dies kann mit der Funktion geändert werden match_max . (Beachten Sie, dass zu große Werte den Pattern Matcher verlangsamen können.) If patlist ist full_buffer wird der entsprechende Körper ausgeführt, wenn match_max Bytes wurden empfangen und es wurden keine anderen Muster gefunden. Ob das oder nicht? full_buffer Schlüsselwort verwendet wird, werden die vergessenen Zeichen in Expect_out (Puffer) geschrieben.
Ob patlist ist das Stichwort Null und Nullen sind erlaubt (über die remove_nulls Kommando) wird der entsprechende Body ausgeführt, wenn ein einzelnes ASCII 0 übereinstimmt. Es ist nicht möglich, 0 Bytes über Glob- oder Regexp-Muster abzugleichen.
Beim Abgleichen eines Musters (oder eof oder full_buffer) werden alle übereinstimmenden und zuvor nicht übereinstimmenden Ausgaben in der Variablen gespeichert expect_out (Puffer) . In den Variablen werden bis zu 9 Übereinstimmungen mit regulären Ausdrücken gespeichert expect_out (1, Zeichenfolge) durch expect_out (9, Zeichenfolge) . Wenn die -indizes Flag wird vor einem Muster, dem Start- und dem Endindex (in einer für lrange ) der 10 Zeichenketten werden in den Variablen gespeichert expect_out (X, Start) und expect_out (X, Ende) wobei X eine Ziffer ist, entspricht die Position des Teilstrings im Puffer. 0 bezieht sich auf Zeichenfolgen, die mit dem gesamten Muster übereinstimmen und für Glob-Muster sowie Regex-Muster generiert werden. Wenn beispielsweise ein Prozess die Ausgabe von "abcdefgh n" erzeugt hat, ist das Ergebnis:
erwarten "cd"
als ob die folgenden Anweisungen ausgeführt worden wären:
set Expect_out (0, Zeichenfolge) cd Set Expect_out (Puffer) abcd
und "efgh n" verbleibt im Ausgabepuffer. Wenn ein Prozess die Ausgabe "abbbcabkkkka n" erzeugt hat, ergibt sich folgendes Ergebnis:
erwarten -indices -re "b (b *). * (k +)"
als ob die folgenden Anweisungen ausgeführt worden wären:
set Expect_out (0, Start) 1 Set Expect_out (0, Ende) 10 Set Expect_out (0, String) bbbcckkkkk Set Expect_out (1, Start) 2 Set Expect_out (1, Ende) 3 Set Expect_out (1, String) Bb Set Expect_out (2, Start) 10 Set Expect_out (2, Ende) 10 Set Expect_out (2, String) k Set Expect_out (Puffer) Abbbcabkkkk
und "a n" verbleibt im Ausgabepuffer. Das Muster "*" (und -re ". *") Leert den Ausgabepuffer, ohne weitere Ausgaben aus dem Prozess zu lesen.
Normalerweise wird die angepasste Ausgabe aus den internen Puffern von Expect gelöscht. Dies kann verhindert werden, indem dem Muster ein Muster vorangestellt wird -transfer Flagge. Dieses Flag ist besonders nützlich beim Experimentieren (und kann aus praktischen Gründen beim Experimentieren als "-not" abgekürzt werden).
Die Spawn-ID, die der übereinstimmenden Ausgabe (oder eof oder full_buffer) zugeordnet ist, wird in gespeichert expect_out (spawn_id) .
Das -Auszeit Flag bewirkt, dass der aktuelle Expect-Befehl den folgenden Wert als Timeout verwendet, anstatt den Wert der Timeout-Variablen zu verwenden.
Standardmäßig werden Muster mit der Ausgabe des aktuellen Prozesses verglichen -ich Flag gibt an, dass die Ausgabe aus der genannten Spawn_id-Liste mit den folgenden Mustern abgeglichen wird (bis zum nächsten) -ich ). Die Spawn_ID-Liste sollte entweder eine durch Whitespace getrennte Liste von Spawn_ids oder eine Variable sein, die auf eine solche Liste von Spawn_ids verweist.
Das folgende Beispiel wartet beispielsweise auf "Verbunden" aus dem aktuellen Prozess oder "Beschäftigt", "Fehlgeschlagen" oder "Ungültiges Kennwort" aus der mit $ proc2 benannten Spawn-ID.
erwarten {-i $ proc2 busy {setzt beschäftigt n; exp_continue} -re "fehlgeschlagen | ungültiges Kennwort" Abbruchzeitüberschreitung Abbruch verbunden}
Der Wert der globalen Variablen any_spawn_id kann verwendet werden, um Muster mit beliebigen spawn_ids abzugleichen, die mit allen anderen benannt sind -ich Flags in der aktuellen erwarten von Befehl. Die spawn_id von a -ich Flag ohne zugeordnetes Muster (d. h. unmittelbar gefolgt von einem anderen -ich ) wird für alle anderen Muster in derselben zur Verfügung gestellt erwarten von Befehl verbunden mit any_spawn_id.
Das -ich Flag kann auch eine globale Variable benennen. In diesem Fall wird die Variable für eine Liste von Spawn-IDs gelesen. Die Variable wird bei jeder Änderung erneut gelesen. Auf diese Weise können Sie die E / A-Quelle ändern, während der Befehl ausgeführt wird. Auf diese Weise bereitgestellte Spawn-IDs werden "indirekte" Spawn-IDs genannt.
Aktionen wie brechen und fortsetzen verursachen Kontrollstrukturen (d. h. zum , Proc ) sich wie gewohnt verhalten. Der Befehl exp_continue erlaubt erwarten von sich fortzusetzen, statt wie üblich zurückzukehren.
Dies ist nützlich, um explizite Schleifen oder wiederholte Expect-Anweisungen zu vermeiden. Das folgende Beispiel ist Teil eines Fragments zur Automatisierung von rlogin. Das exp_continue vermeidet, eine Sekunde schreiben zu müssen erwarten von Anweisung (um erneut nach der Aufforderung zu suchen), wenn das rlogin zur Eingabe eines Kennworts auffordert.
erwarten {Passwort: {stty -echo send_user "Kennwort (für $ user) auf $ host:" expect_user -re "(. *) n" send_user " n" send "$ expect_out (1, string) r" stty echo exp_continue} fehlerhaft {send_user "ungültiges Kennwort oder Konto n" exit} timeout {send_user "Verbindung mit $ host Timeout n" exit} re $ prompt}
Das folgende Fragment kann beispielsweise einem Benutzer helfen, eine Interaktion zu führen, die bereits vollständig automatisiert ist. In diesem Fall wird das Terminal in den Rohmodus versetzt. Wenn der Benutzer "+" drückt, wird eine Variable erhöht. Wenn "p" gedrückt wird, werden mehrere Rückläufe an den Prozess gesendet, um ihn auf irgendeine Weise zu stoßen, und "i" lässt den Benutzer mit dem Prozess interagieren, wodurch er die Kontrolle aus dem Skript entfernt. In jedem Fall ist das exp_continue erlaubt den Strom erwarten von um den Musterabgleich nach der Ausführung der aktuellen Aktion fortzusetzen.
stty raw -echo expect_after {-i $ user_spawn_id "p" {send " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interagieren; exp_continue} "quit" exit}
Standardmäßig, exp_continue setzt den Timeout-Timer zurück. Der Timer wird nicht neu gestartet, wenn exp_continue wird mit der angerufen -continue_timer Flagge.
expect_after expect_args
arbeitet identisch mit dem Erwarten_vorher außer dass Muster von beiden erwarten von und erwarten_nach kann passen, die erwarten von Muster wird verwendet. Siehe die Erwarten_vorher Befehl für weitere Informationen.
expect_background expect_args
nimmt die gleichen Argumente wieerwarten von jedoch kehrt es sofort zurück. Muster werden getestet, sobald neue Eingaben eingehen. Das MusterAuszeit undStandard sind sinnlos zuexpect_background und werden still verworfen. Ansonsten derexpect_background Befehl verwendetErwarten_vorher underwarten_nach Muster wieerwarten von tut.
Wannexpect_background Aktionen werden ausgewertet, die Hintergrundverarbeitung für dieselbe Spawn-ID wird blockiert. Die Hintergrundverarbeitung wird aufgehoben, wenn die Aktion abgeschlossen ist. Während die Hintergrundverarbeitung gesperrt ist, ist es möglich, (Vordergrund) zu arbeiten.erwarten von auf der gleichen Spawn-ID.
Es ist nicht möglich, ein auszuführenerwarten von während einexpect_background ist nicht blockiert.expect_background für eine bestimmte Spawn-ID wird gelöscht, indem ein neues Expect_background mit derselben Spawn-ID deklariert wird. Deklarierenexpect_background Ohne Muster entfernt die angegebene Spawn-ID die Fähigkeit, Muster im Hintergrund abzugleichen.
expect_before expect_args
nimmt die gleichen Argumente wieerwarten von jedoch kehrt es sofort zurück. Muster-Aktionspaare vom neuestenErwarten_vorher mit der gleichen Spawn-ID werden implizit zu allen folgenden hinzugefügterwarten von Befehle. Wenn ein Muster übereinstimmt, wird es so behandelt, als wäre es im angegeben wordenerwarten von Befehl selbst und der zugehörige Body wird im Kontext des Befehls ausgeführterwarten von Befehl. Wenn Muster von beidenErwarten_vorher underwarten von kann passen, dieErwarten_vorher Muster wird verwendet.
Wenn kein Muster angegeben ist, wird die Spawn-ID nicht auf Muster geprüft.
Sofern nicht durch-ich Flagge,Erwarten_vorher Muster stimmen mit der Spawn-ID überein, die zu dem Zeitpunkt definiert wurde, zu dem derErwarten_vorher Befehl wurde ausgeführt (nicht, wenn das Muster übereinstimmt).
Die -info-Flag verursachtErwarten_vorher um die aktuellen Spezifikationen der Muster zurückzugeben. Standardmäßig wird über die aktuelle Spawn-ID berichtet. Eine optionale Angabe zur Spawn-ID kann angegeben werden, um Informationen zu dieser Spawn-ID zu erhalten. Zum Beispiel
expect_before -info -i $ proc
Es darf höchstens eine Spawn-ID angegeben werden. Das Flag-Indirect unterdrückt direkte Spawn-IDs, die nur von indirekten Spezifikationen stammen.
Anstelle einer Spawn-ID-Spezifikation wird durch das Flag "-all" "-info" über alle Spawn-IDs gemeldet.
Die Ausgabe des -info-Flags kann als das Argument von expect_before wiederverwendet werden.
expect_tty expect_args
ist wieerwarten von Es liest jedoch Zeichen aus / dev / tty (d. h. Tastatureingaben des Benutzers). Standardmäßig wird das Lesen im gekochten Modus durchgeführt. Zeilen müssen also mit einem Return endenerwarten von Sie zu sehen. Dies kann über geändert werdenstty (siehe diestty Befehl unten).
expect_user expect_args
ist wieerwarten von es liest jedoch Zeichen aus stdin (d. h. Tastatureingaben des Benutzers). Standardmäßig wird das Lesen im gekochten Modus durchgeführt. Zeilen müssen also mit einem Return endenerwarten von Sie zu sehen.Dies kann über geändert werdenstty (siehe diestty Befehl unten).
Gabel
schafft einen neuen Prozess. Der neue Prozess ist eine exakte Kopie des StromsErwarten von verarbeiten. Über den ErfolgGabel gibt 0 an den neuen (untergeordneten) Prozess zurück und gibt die Prozess-ID des untergeordneten Prozesses an den übergeordneten Prozess zurück. Bei einem Ausfall (ausnahmslos aufgrund fehlender Ressourcen, z. B. Auslagerungsspeicher, Speicher),Gabel gibt -1 an den übergeordneten Prozess zurück, und es wird kein untergeordneter Prozess erstellt.
Verzweigte Prozesse werden über dieAusfahrt Befehl, genau wie der ursprüngliche Prozess. Gespaltene Prozesse dürfen in die Protokolldateien schreiben. Wenn Sie das Debuggen oder Protokollieren in den meisten Prozessen nicht deaktivieren, kann das Ergebnis verwirrend sein.
Einige Implementierungen können von mehreren Lesern und Schreibern sogar für einen Moment verwirrt werden. So ist es am sicherstenGabel vor dem Laichen.
interagieren string1 body1 … stringn bodyn
gibt dem Benutzer die Kontrolle über den aktuellen Prozess, sodass Tastatureingaben an den aktuellen Prozess gesendet werden und stdout und stderr des aktuellen Prozesses zurückgegeben werden.
String-Body-Paare können als Argumente angegeben werden. In diesem Fall wird der Body ausgeführt, wenn der entsprechende String eingegeben wird. (Standardmäßig wird die Zeichenfolge nicht an den aktuellen Prozess gesendet.)Dolmetscher Kommando wird angenommen, wenn der letzte Körper fehlt.
Wenn die Argumente auf die gesamteinteragieren Eine Anweisung erfordert mehr als eine Zeile. Alle Argumente können in eine "geschichtet" werden, um zu vermeiden, dass jede Zeile mit einem Backslash abgeschlossen wird. In diesem Fall treten die üblichen Tcl-Substitutionen trotz der geschweiften Klammern auf.
Zum Beispiel interagieren die folgenden Befehlsläufe mit den folgenden definierten String-Body-Paaren: Wenn ^ Z gedrückt wird,Erwarten von ist suspendiert. (Das-reset Das Flag stellt die Terminalmodi wieder her.) Wenn ^ A gedrückt wird, wird dem Benutzer "Sie haben ein Steuerelement-A eingegeben" angezeigt, und der Prozess wird als ^ A gesendet. Wenn $ gedrückt wird, sieht der Benutzer das Datum. Wenn ^ C gedrückt wird,Erwarten von Ausgänge Wenn "foo" eingegeben wird, sieht der Benutzer "bar". Wenn ~~ gedrückt wird, wird dieErwarten von Interpreter läuft interaktiv.
setze CTRLZ 032 interact {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "Sie haben ein Steuerelement eingegeben A n"; send " 001"} $ {send_user "Das Datum ist Uhrformat Sekunden."} 003 exit foo {send_user "bar"} ~~}
In String-Body-Paaren werden Zeichenfolgen in der Reihenfolge abgeglichen, in der sie als Argumente aufgeführt sind. Teilweise übereinstimmende Zeichenfolgen werden nicht in Erwartung des Rests an den aktuellen Prozess gesendet. Wenn Zeichen so eingegeben werden, dass möglicherweise keine Übereinstimmung mehr möglich ist, wird nur der Teil der Zeichenfolge an den Prozess gesendet, der möglicherweise keine andere Übereinstimmung starten kann. Daher können Zeichenfolgen, die Teilzeichenfolgen von partiellen Übereinstimmungen sind, später übereinstimmen, wenn die ursprünglichen Zeichenfolgen, die versucht haben, übereinzustimmen, letztendlich fehlschlagen.
Standardmäßig ist der String-Abgleich exakt ohne Platzhalter. (Im Gegensatz dazu dieerwarten von Der Befehl verwendet standardmäßig Glob-Muster-Ex Flag kann verwendet werden, um Muster zu schützen, die ansonsten übereinstimmen könnteninteragieren Flaggen davon. Jedes Muster, das mit einem "-" beginnt, sollte auf diese Weise geschützt werden. (Alle Zeichenfolgen, die mit "-" beginnen, sind für zukünftige Optionen reserviert.)
Das-Re Flag erzwingt, dass der String als Muster im Regex-Stil interpretiert wird. In diesem Fall werden übereinstimmende Teilzeichenfolgen in der Variablen gespeichert interact_out ähnlich dem Wegerwarten von speichert seine Ausgabe in der Variablenexpect_out . Das-indizes flag wird ähnlich unterstützt.
Das Mustereof Führt eine Aktion aus, die am Dateiende ausgeführt wird. Ein separateseof Muster kann auch folgen-Ausgabe Flag, in welchem Fall es abgeglichen wird, wenn beim Schreiben der Ausgabe ein eof erkannt wird. Der Standardeof Aktion ist "Rückkehr", so dassinteragieren kehrt einfach bei jeder EOF zurück.
Das MusterAuszeit führt ein Timeout (in Sekunden) und eine Aktion aus, die ausgeführt wird, nachdem für eine bestimmte Zeit keine Zeichen gelesen wurden. DasAuszeit Das Muster gilt für den zuletzt angegebenen Prozess. Es gibt kein Standard-Timeout. Die spezielle Variable "Timeout" (wird vom verwendeterwarten von Befehl) hat keinen Einfluss auf dieses Timeout.
Die folgende Anweisung kann beispielsweise verwendet werden, um Benutzer, die eine Stunde lang nichts eingegeben haben, aber dennoch häufige Systemmeldungen erhalten, automatisch auszuloggen:
interaktiv -input $ user_spawn_id timeout 3600 return -output $ spawn_id
Wenn das Muster das Schlüsselwort istNull und Nullen sind erlaubt (über dieremove_nulls Kommando) wird der entsprechende Body ausgeführt, wenn ein einzelnes ASCII 0 übereinstimmt. Es ist nicht möglich, 0 Bytes über Glob- oder Regexp-Muster abzugleichen.
Ein Muster mit der Flagge voranstellen-Ich schreibe verursacht die Variable interact_out (spawn_id) muss auf die spawn_id gesetzt werden, die dem Muster (oder eof) entspricht.
Aktionen wiebrechen undfortsetzen verursachen Kontrollstrukturen (d. h.zum , Proc ) sich wie gewohnt verhalten. jedochRückkehr bewirkt, dass Interact zu seinem Anrufer zurückkehrt, währendinter_return verursachtinteragieren eine Rückgabe in seinem Anrufer verursachen. Zum Beispiel, wenn "proc foo" aufgerufen wirdinteragieren die dann die Aktion ausgeführt hatinter_return , Proc foo würden zurückkehren. (Dies bedeutet, dass wenninteragieren AnrufeDolmetscher interaktiv schreibenRückkehr wird die Interaktion fortsetzen, währendinter_return bewirkt, dass die Interaktion zu ihrem Aufrufer zurückkehrt.)
Währendinteragieren Im Raw-Modus werden alle Zeichen an den aktuellen Prozess übergeben.Wenn der aktuelle Prozess keine Jobsteuerungssignale abfängt, wird er gestoppt, wenn ein Stoppsignal gesendet wird (standardmäßig ^ Z). Um es erneut zu starten, senden Sie ein fortlaufendes Signal (z. B. "kill-CONT"). Wenn Sie wirklich einen SIGSTOP an einen solchen Prozess senden möchten (durch ^ Z), sollten Sie zuerst csh starten und dann Ihr Programm ausführen. Andererseits, wenn Sie einen SIGSTOP an senden möchtenErwarten von selbst, rufen Sie zuerst den Interpreter an (möglicherweise mit einem Escape-Zeichen) und drücken Sie dann ^ Z.
String-Body-Paare können als Abkürzung verwendet werden, um zu vermeiden, dass Sie den Interpreter eingeben und Befehle interaktiv ausführen müssen. Der vorherige Terminalmodus wird verwendet, während der Body eines String-Body-Paares ausgeführt wird.
Für die Geschwindigkeit werden Aktionen standardmäßig im Raw-Modus ausgeführt. Das-reset Das Flag setzt das Terminal auf den vorherigen Modus zurückinteragieren wurde ausgeführt (immer gekochter Modus). Beachten Sie, dass Zeichen, die eingegeben werden, wenn der Modus gewechselt wird, verloren gehen können (eine unglückliche Funktion des Terminal-Treibers auf einigen Systemen). Der einzige Grund zu verwenden-reset ist, wenn Ihre Aktion davon abhängt, im gekochten Modus zu laufen.
Das-Echo flag sendet Zeichen, die dem folgenden Muster entsprechen, an den Prozess zurück, der sie beim Lesen jedes Zeichens generiert hat. Dies kann nützlich sein, wenn der Benutzer Feedback von teilweise typisierten Mustern sehen muss.
Wenn ein Muster wiederholt wird, aber letztendlich nicht übereinstimmt, werden die Zeichen an den erzeugten Prozess gesendet. Wenn der erzeugte Prozess sie dann wiederholt, sieht der Benutzer die Zeichen zweimal.-Echo ist wahrscheinlich nur in Situationen angemessen, in denen es unwahrscheinlich ist, dass der Benutzer das Muster nicht abschließt. Der folgende Auszug stammt beispielsweise von rftp, dem rekursiven-ftp-Skript, in dem der Benutzer aufgefordert wird, ~ g, ~ p oder ~ l einzugeben, um das aktuelle Verzeichnis rekursiv abzurufen, abzulegen oder aufzulisten. Diese sind so weit von den normalen ftp-Befehlen entfernt, dass es unwahrscheinlich ist, dass der Benutzer ~ gefolgt von irgendetwas anderem eingibt, es sei denn, es wurde versehentlich eingegeben. In diesem Fall ignorieren sie das Ergebnis ohnehin.
interagieren {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}
Das-puffer flag sendet Zeichen, die dem folgenden Muster entsprechen, an den Ausgabeprozess, wenn Zeichen gelesen werden.
Dies ist nützlich, wenn Sie möchten, dass ein Programm das Muster wiederholt. Beispielsweise kann Folgendes verwendet werden, um zu überwachen, wo eine Person wählt (ein Hayes-Modem). Jedes Mal, wenn "atd" angezeigt wird, protokolliert das Skript den Rest der Zeile.
proc lognumber {} {interact -nobuffer -re "(. *) r" return setzt $ log "Uhrformat Uhrsekunden: Gewähltes $ interact_out (1, string)"} interact -nobuffer "atd" Protokollnummer
Währendinteragieren , vorherige Verwendung vonlog_user wird ignoriert. Im Speziellen,interagieren erzwingt, dass seine Ausgabe protokolliert wird (an die Standardausgabe gesendet wird), da davon ausgegangen wird, dass der Benutzer nicht blind interagieren möchte.
Das-O Flag bewirkt, dass alle folgenden Schlüsselkörperpaare auf die Ausgabe des aktuellen Prozesses angewendet werden. Dies kann beispielsweise nützlich sein, wenn Sie mit Hosts arbeiten, die während einer Telnet-Sitzung unerwünschte Zeichen senden.
Standardmäßig,interagieren erwartet, dass der Benutzer stdin schreibt und stdout des liestErwarten von verarbeiten sich selbst. Das-u flag (für "user") machtinteragieren Suchen Sie den Benutzer als den Prozess, der nach seinem Argument benannt wird (dies muss eine erzeugte ID sein).
Dadurch können zwei nicht zusammenhängende Prozesse ohne explizite Schleife miteinander verbunden werden. Um das Debuggen zu erleichtern, gehen Sie zur Diagnose von Expect immer nach stderr (oder stdout für bestimmte Protokollierungs- und Debugginginformationen). Aus dem gleichen Grund dieDolmetscher Der Befehl liest interaktiv von stdin.
Das folgende Fragment erstellt beispielsweise einen Anmeldeprozess. Dann wählt es den Benutzer (nicht gezeigt) und verbindet schließlich die beiden miteinander. Natürlich kann jeder Prozess für die Anmeldung verwendet werden. Eine Shell zum Beispiel würde es dem Benutzer ermöglichen, zu arbeiten, ohne ein Konto und ein Kennwort anzugeben.
spawn login set login $ spawn_id spawn tippmodem # zum Benutzer zurückwählen # Benutzer mit dem Login verbinden -u $ login
Um die Ausgabe an mehrere Prozesse zu senden, listen Sie jede Spawn-ID-Liste mit dem vorangestellten a auf-Ausgabe Flagge. Die Eingabe für eine Gruppe von Ausgabe-Spawn-IDs kann durch eine Spawn-ID-Liste bestimmt werden, der ein vorangestelltes a vorangestellt ist-Eingang Flagge. (Beide-Eingang und-Ausgabe kann Listen in derselben Form wie das-ich Flagge in dererwarten von Befehl, außer dass any_spawn_id keine Bedeutung hatinteragieren .) Alle folgenden Flags und Strings (oder Muster) gelten für diese Eingabe, bis eine andere Eingabe-Markierung erscheint. Wenn nein-Eingang erscheint,-Ausgabe impliziert "-input $ user_spawn_id -output". (Ähnlich mit Mustern, die nicht haben-Eingang .) Wenn man-Eingang angegeben ist, überschreibt es $ user_spawn_id. Wenn eine Sekunde-Eingang angegeben ist, überschreibt $ spawn_id. Zusätzlich-Eingang Flags können angegeben werden.
Bei den beiden implizierten Eingabeprozessen werden ihre Ausgaben standardmäßig als $ spawn_id und $ user_spawn_id (umgekehrt) angegeben. Wenn eine-Eingang Flagge erscheint mit Nr-Ausgabe flag, werden Zeichen aus diesem Prozess verworfen.
Das-ich flag führt einen Ersatz für die aktuelle spawn_id ein, wenn keine andere-Eingang oder-Ausgabe Flags werden verwendet. Eine -i-Flagge impliziert eine -o-Flagge.
Es ist möglich, die Prozesse zu ändern, mit denen interagiert wird, indem indirekte Spawn-IDs verwendet werden. (Indirekte Spawn-IDs werden im Abschnitt zum Expect-Befehl beschrieben.) Indirekte Spawn-IDs können mit den Flags -i, -u, -input oder -output angegeben werden.
dolmetscher args
bewirkt, dass der Benutzer interaktiv aufgefordert wirdErwarten von und Tcl-Befehle. Das Ergebnis jedes Befehls wird gedruckt.
Aktionen wiebrechen undfortsetzen verursachen Kontrollstrukturen (d. h.zum , Proc ) sich wie gewohnt verhalten. jedochRückkehr bewirkt, dass der Interpreter zu seinem Anrufer zurückkehrt, währendinter_return verursachtDolmetscher eine Rückgabe in seinem Anrufer verursachen. Zum Beispiel, wenn "proc foo" aufgerufen wirdDolmetscher die dann die Aktion ausgeführt hatinter_return , Proc foo würden zurückkehren. Jeder andere Befehl verursachtDolmetscher um fortzufahren, neue Befehle einzugeben.
Die Eingabeaufforderung enthält standardmäßig zwei Ganzzahlen. Die erste ganze Zahl beschreibt die Tiefe des Auswertungsstapels (d. H. Wie oft Tcl_Eval aufgerufen wurde). Die zweite ganze Zahl ist der Tcl-Verlaufsbezeichner. Die Eingabeaufforderung kann durch Definieren einer Prozedur namens "Eingabeaufforderung1" festgelegt werden, deren Rückgabewert die nächste Eingabeaufforderung wird. Wenn eine Anweisung offene Anführungszeichen, Parens, Klammern oder Klammern enthält, wird eine sekundäre Eingabeaufforderung (standardmäßig "+>") beim Zeilenvorschub ausgegeben. Die sekundäre Aufforderung kann durch Definieren einer Prozedur mit dem Namen "prompt2" festgelegt werden.
WährendDolmetscher wird der gekochte Modus verwendet, auch wenn der Anrufer den Raw-Modus verwendet hat.
Wenn stdin geschlossen ist,Dolmetscher wird zurückkehren, wenn die-eof Flag wird verwendet. In diesem Fall wird das nachfolgende Argument aufgerufen.
log_file args -a Datei
Wenn ein Dateiname angegeben wird,Logdatei zeichnet ein Protokoll der Sitzung (beginnend an diesem Punkt) in der Datei auf.Logdatei stoppt die Aufnahme, wenn kein Argument angegeben wird. Alle vorherigen Protokolldateien werden geschlossen.
Anstelle eines Dateinamens kann eine Tcl-Datei-ID mithilfe von bereitgestellt werden-öffnen oder-offenlassen Flaggen. Das ist ähnlich demlaichen Befehl. (Sehenlaichen Für mehr Information.)
Das-ein Flag erzwingt die Protokollierung der Ausgabe, die durch die unterdrückt wurdelog_user Befehl.
Standardmäßig ist dieLogdatei Befehl hängt an auf alte Dateien, anstatt sie abzuschneiden, um die Protokollierung in einer Sitzung mehrmals ein- und ausschalten zu können. Zum Abschneiden von Dateien verwenden Sie die-noappend Flagge.
Das-Info Flag bewirkt, dass log_file eine Beschreibung der zuletzt angegebenen Nicht-Info-Argumente zurückgibt.
log_user -info | 0 | 1
Standardmäßig wird der Send / Expect-Dialog in stdout (und in einer Protokolldatei, falls geöffnet) protokolliert. Die Protokollierung in stdout wird durch den Befehl "log_user 0" deaktiviert und durch "log_user 1" wieder aktiviert. Die Protokollierung in der Protokolldatei ist unverändert.
Das-Info Flag bewirkt, dass log_user eine Beschreibung der zuletzt angegebenen Nicht-Info-Argumente zurückgibt.
match_max -d -i Spawn_id Größe
Definiert die Größe des Puffers (in Byte), der intern von verwendet wirderwarten von . Ohne Größe Argument wird die aktuelle Größe zurückgegeben.
Mit dem-d Flag ist die Standardgröße festgelegt. (Die Standardeinstellung ist 2000.) Mit der-ich flag, wird die Größe für die genannte Spawn-ID festgelegt, ansonsten für den aktuellen Prozess.
Überlagerung - # spawn_id - # spawn_id … program args
führt aus "Programm args "anstelle des StromsErwarten von Programm, das beendet wird. Ein Argument ohne Bindestrich zwingt einen Bindestrich vor dem Befehlsnamen, als wäre es eine Login-Shell. Alle spawn_ids sind geschlossen, mit Ausnahme der als Argumente genannten. Diese werden den benannten Dateikennungen zugeordnet.
Spawn_ids werden den Dateikennungen zugeordnet, damit das neue Programm erben kann. Die folgende Zeile führt beispielsweise Schach aus und ermöglicht, dass sie vom aktuellen Prozess gesteuert wird - beispielsweise von einem Schachmeister.
Überlagerung -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id Schach
Dies ist effizienter als "Interaktion -u", opfert jedoch die Möglichkeit, programmierte Interaktion seit dem auszuführenErwarten von Prozess ist nicht mehr unter Kontrolle.
Beachten Sie, dass kein steuerndes Terminal bereitgestellt wird. Wenn Sie also die Standardeingabe trennen oder neu zuordnen, funktionieren Programme, die die Jobsteuerung (Shells, Login usw.) übernehmen, nicht ordnungsgemäß.
Parität -d -i Spawn_id Wert
legt fest, ob die Parität beibehalten oder aus der Ausgabe der erzeugten Prozesse entfernt werden soll. Ob Wert Null ist, wird die Parität entfernt, ansonsten wird sie nicht entfernt. Ohne Wert Argument wird der aktuelle Wert zurückgegeben.
Mit dem-d Flag ist der Standardwert für die Parität festgelegt. (Die anfängliche Standardeinstellung ist 1, d. H. Die Parität wird nicht entfernt.) Mit der-ich Flag wird der Paritätswert für die benannte Spawn-ID festgelegt, ansonsten für den aktuellen Prozess.
remove_nulls -d -i Spawn_id Wert
legt fest, ob Nullen vor der Mustererkennung oder dem Speichern in der Variablen von der Ausgabe der erzeugten Prozesse beibehalten oder entfernt werden expect_out oder interact_out . Ob Wert ist 1, werden Nullen entfernt. Ob Wert 0 ist, werden Nullen nicht entfernt. Ohne Wert Argument wird der aktuelle Wert zurückgegeben.
Mit dem-d Flag ist der Standardwert festgelegt. (Die anfängliche Standardeinstellung ist 1, d. H., Nullen werden entfernt.) Mit der-ich Flag, der Wert wird für die benannte Spawn-ID festgelegt, ansonsten für den aktuellen Prozess.
Ob Nullen entfernt werden oder nichtErwarten von NULL-Bytes werden in das Protokoll und in die Standardausgabe aufgenommen.
send -flags Zeichenfolge
Sendet Schnur zum aktuellen Prozess. Zum Beispiel der Befehl
"Hallo Welt r" senden
Sendet die Zeichen an den aktuellen Prozess. (Tcl enthält einen printf-artigen Befehl (aufgerufenFormat ) die beliebig komplexe Zeichenketten bilden kann.)
Zeichen werden sofort gesendet, obwohl Programme mit Zeilenpufferung die Zeichen erst lesen, wenn ein Rückkehrzeichen gesendet wird. Ein Rückkehrzeichen wird mit " r" bezeichnet.
Das-- flag zwingt das nächste Argument als String und nicht als Flag interpretiert zu werden.Vor jeder Zeichenfolge kann "-" stehen, unabhängig davon, ob sie tatsächlich wie eine Flagge aussieht oder nicht. Dies bietet einen zuverlässigen Mechanismus zum Festlegen variabler Zeichenfolgen, ohne dass sie von solchen ausgelöst werden, die versehentlich wie Flags aussehen. (Alle Zeichenfolgen, die mit "-" beginnen, sind für zukünftige Optionen reserviert.)
Das-ich Flag gibt an, dass die Zeichenfolge an die genannte Spawn-ID gesendet wird. Wenn die spawn_id ist user_spawn_id Wenn sich das Terminal im Raw-Modus befindet, werden Zeilenumbrüche in Zeichenfolgen mit Zeilenumbrüchen übersetzt, sodass sie so aussehen, als wäre das Terminal im gekochten Modus. Das-roh Flag deaktiviert diese Übersetzung.
Das-Null Flag sendet null Zeichen (0 Byte). Standardmäßig wird eine Null gesendet. Eine ganze Zahl kann dem folgen-Null um anzugeben, wie viele Nullen gesendet werden sollen.
Das-brechen Das Flag generiert eine Unterbrechungsbedingung. Dies ist nur dann sinnvoll, wenn sich die Spawn-ID auf ein über "Spawn-Open" geöffnetes TTY-Gerät bezieht. Wenn Sie einen Prozess wie tip erzeugt haben, sollten Sie die Konvention von tip verwenden, um eine Unterbrechung zu erzeugen.
Das-s Das Flag bewirkt, dass die Ausgabe "langsam" gesendet wird. Vermeiden Sie daher die übliche Situation, in der ein Computer einen Eingabepuffer ausgibt, der für einen Menschen konzipiert wurde, der niemals denselben Puffer überlisten würde. Diese Ausgabe wird durch den Wert der Variablen "send_slow" gesteuert, die eine Liste mit zwei Elementen enthält. Das erste Element ist eine ganze Zahl, die die Anzahl der Bytes beschreibt, die atomar gesendet werden sollen. Das zweite Element ist eine reelle Zahl, die die Anzahl Sekunden angibt, um die die atomaren Sends getrennt werden müssen. Zum Beispiel würde "set send_slow {10 .001}" dazu führen, dass "send -s" Zeichenfolgen mit einer Millisekunde zwischen jeweils 10 gesendeten Zeichen sendet.
Das-h Flag zwingt die Ausgabe (etwas) wie ein tatsächlich getippter Mensch. Zwischen den Charakteren treten menschenähnliche Verzögerungen auf. (Der Algorithmus basiert auf einer Weibull-Verteilung mit Modifikationen für diese bestimmte Anwendung.) Diese Ausgabe wird durch den Wert der Variablen "send_human" gesteuert, die eine Liste mit fünf Elementen enthält. Die ersten beiden Elemente sind eine durchschnittliche Zeitdauer zwischen den Charakteren in Sekunden. Die erste wird standardmäßig verwendet. Die zweite wird bei Wortendungen verwendet, um die subtilen Pausen zu simulieren, die gelegentlich bei solchen Übergängen auftreten. Der dritte Parameter ist ein Maß für die Variabilität, wobei .1 ziemlich variabel ist, 1 relativ variabel ist und 10 ziemlich konstant ist. Die Extreme sind 0 bis unendlich. Die letzten beiden Parameter sind jeweils eine minimale und maximale Zeit zwischen den Briefen. Das Minimum und Maximum wird zuletzt verwendet und das letzte Mal "Clip". Der endgültige Durchschnitt kann sich vom angegebenen Durchschnitt stark unterscheiden, wenn die Werte für Minimum und Maximum ausreichend sind.
Als Beispiel emuliert der folgende Befehl eine schnelle und konsistente Schreibkraft:
set send_human {.1 .3 1 .05 2} send -h "Ich habe Hunger. Lass uns zu Mittag essen."
während das Folgende nach einem Kater besser geeignet ist:
set send_human {.4 .4 .2 .5 100} send -h "Goodd Party-Wimpernacht!"
Beachten Sie, dass Fehler nicht simuliert werden, obwohl Sie selbst Fehlerkorrektur-Situationen einrichten können, indem Sie Fehler und Korrekturen in ein Sendeargument einbetten.
Die Flags zum Senden von Nullzeichen, zum Senden von Pausen, zum Erzwingen einer langsamen Ausgabe und für die Ausgabe im menschlichen Stil schließen sich gegenseitig aus. Nur der zuletzt angegebene wird verwendet. Außerdem nein Schnur Das Argument kann mit den Flags zum Senden von Nullzeichen oder -umbrüchen angegeben werden.
Es ist eine gute Idee, dem ersten vorauszugehensenden zu einem Prozess von einemerwarten von. erwarten von wartet, bis der Prozess beginnt, währendsenden kann nicht. Insbesondere wenn der erstesenden Bevor der Prozess ausgeführt wird, besteht die Gefahr, dass Ihre Daten ignoriert werden. In Situationen, in denen interaktive Programme keine erste Aufforderung bieten, können Sie vorausgehensenden mit einer Verzögerung wie in:
# Um zu vermeiden, dass Hacker Hinweise zum Eindringen geben, fordert # das System nicht zur Eingabe eines externen Kennworts auf. # Warten Sie 5 Sekunden, bis der Exec abgeschlossen ist. Telnet very.secure.gov sleep 5 send password r
exp_send ist ein Alias für senden. Wenn Sie Expectk oder eine a