Expect is een programma dat volgens een script met andere interactieve programma's praat. Na het script weet Expect wat er van een programma kan worden verwacht en wat de juiste reactie zou moeten zijn. Een geïnterpreteerde taal biedt vertakkings- en besturingsstructuren op hoog niveau om de dialoog te leiden. Bovendien kan de gebruiker de besturing overnemen en direct communiceren wanneer gewenst, waarna hij de besturing naar het script terugkrijgt.
Expectk is een mix van Expect en Tk. Het gedraagt zich net als de wens van Expect en Tk. Verwacht kan ook direct worden gebruikt in C of C ++ zonder Tcl.
De naam "Expect" komt van het idee van send / expect-sequenties die worden gepopulariseerd door uucp, kermit en andere modembesturingsprogramma's. In tegenstelling tot uucp wordt Expect echter gegeneraliseerd zodat het kan worden uitgevoerd als een opdracht op gebruikersniveau met elk programma en taak in gedachten. Verwacht kan tegelijkertijd met verschillende programma's praten.
Wat verwachten kan doen
Hier zijn enkele dingen die het commando expect kan doen:
- Oorzaak dat uw computer u terugbelt, zodat u kunt inloggen zonder te betalen voor de oproep.
- Start een spel en als de optimale configuratie niet verschijnt, opnieuw en opnieuw starten) totdat dit het geval is, en dan de controle aan u overhandigen.
- Voer fsck uit en beantwoord in antwoord op zijn vragen "ja" of "nee" of geef controle aan u, op basis van vooraf bepaalde criteria.
- Maak verbinding met een ander netwerk en haal uw e-mail automatisch terug, zodat deze lijkt te zijn verzonden naar uw lokale systeem.
- Draag omgevingsvariabelen, huidige directory of enige vorm van informatie over rlogin, telnet, tip, su of chgrp
Er zijn verschillende redenen waarom de shell deze taken niet kan uitvoeren. Alles is mogelijk met Expect.
Over het algemeen is Expect nuttig voor het uitvoeren van elk programma dat interactie vereist tussen het programma en de gebruiker. Het enige dat nodig is, is dat de interactie programmatisch kan worden gekarakteriseerd. Verwacht kan ook de controle teruggeven aan de gebruiker zonder het programma dat wordt bestuurd te stoppen. Evenzo kan de gebruiker op elk gewenst moment de controle over het script teruggeven.
Gebruik
Expect leest cmdfile voor een lijst met uit te voeren commando's. Verwacht kan impliciet worden aangeroepen op systemen die # ondersteunen! notatie door het script als uitvoerbaar bestand te markeren en de eerste regel in het script te maken:
#! / usr / local / bin / expect -f
Natuurlijk moet het pad nauwkeurig beschrijven waar Verwachting leeft. / usr / local / bin is slechts een voorbeeld.
De vlag -c geeft de voorkeur aan een opdracht die moet worden uitgevoerd vóór een in het script. De opdracht moet worden aangehaald om te voorkomen dat deze door de shell wordt verbroken. Deze optie kan meerdere keren worden gebruikt. Meerdere opdrachten kunnen worden uitgevoerd met een enkele -c door ze te scheiden met puntkomma's. Commando's worden uitgevoerd in de volgorde waarin ze verschijnen. Wanneer u Expectk gebruikt, wordt deze optie opgegeven als -opdracht.
De vlag -d maakt enige diagnostische uitvoer mogelijk, die voornamelijk de interne activiteit van opdrachten rapporteert, zoals verwachten en communiceren. Deze vlag heeft hetzelfde effect als "exp_internal 1" aan het begin van een Expect-script, plus de versie van Expect wordt afgedrukt.
De vlag -D maakt een interactieve debugger mogelijk. Een geheel getal moet volgen. De debugger neemt de controle over vóór de volgende Tcl-procedure als de waarde niet nul is of als een ^ C wordt ingedrukt of een breekpunt wordt geraakt, of een andere geschikte debugger-opdracht in het script verschijnt. Wanneer u Expectk gebruikt, is deze optie opgegeven als -Debug.
De vlag -f geeft de voorkeur aan een bestand waarvan de opdrachten moeten worden gelezen. De vlag zelf is optioneel, omdat deze alleen van pas komt bij het gebruik van #! notatie, zodat andere argumenten op de opdrachtregel kunnen worden gegeven. Wanneer u Expectk gebruikt, wordt deze optie opgegeven als -bestand.
Standaard wordt het opdrachtbestand in het geheugen gelezen en in zijn geheel uitgevoerd. Het is af en toe wenselijk om bestanden één regel tegelijk te lezen. Gebruik de vlag -b om te voorkomen dat willekeurige bestanden op deze manier worden verwerkt. Wanneer u Expectk gebruikt, wordt deze optie opgegeven als -buffer.
Als de tekenreeks "-" wordt geleverd als een bestandsnaam, wordt de standaardinvoer gelezen. Gebruik "./-" om uit een bestand te lezen dat eigenlijk "-" heet.
De vlag -i zorgt ervoor dat u interactief opdrachten kunt vragen in plaats van ze uit een bestand te lezen. Prompting wordt beëindigd via het commando exit of op EOF. De vlag -i wordt aangenomen als noch een opdrachtbestand noch -c wordt gebruikt. Wanneer u Expectk gebruikt, is deze optie opgegeven als -interactief.
- kan worden gebruikt om het einde van de opties af te bakenen. Dit is handig als u een optie-achtig argument wilt doorgeven aan uw script zonder dat dit wordt geïnterpreteerd door Expect. Dit kan handig in de # worden geplaatst! regel om elke flaglike interpretatie door Expect te voorkomen. Het volgende laat bijvoorbeeld de oorspronkelijke argumenten inclusief de scriptnaam in de variabele achter argv .
#! / usr / local / bin / expect -
Merk op dat de gebruikelijke getopt (3) en execve (2) conventies in acht moeten worden genomen bij het toevoegen van argumenten aan de #! lijn.
Het bestand $ exp_library / expect.rc wordt automatisch opgehaald indien aanwezig, tenzij de vlag -N wordt gebruikt. (Wanneer u Expectk gebruikt, wordt deze optie opgegeven als -NORC.) Onmiddellijk daarna wordt het bestand ~ / .expect.rc automatisch opgehaald, tenzij de vlag -n wordt gebruikt. Als de omgevingsvariabele DOTDIR is gedefinieerd, wordt deze als een map behandeld en wordt .expect.rc vanaf daar gelezen. Wanneer u Expectk gebruikt, wordt deze optie opgegeven als -norc.Deze inkoop vindt alleen plaats na het uitvoeren van vlag -c.
-v veroorzaakt verwachten dat het versienummer wordt afgedrukt en wordt afgesloten. De bijbehorende vlag in Expectk, die lange vlagnamen gebruikt, is -versie.
Optionele args worden geconstrueerd in een lijst en opgeslagen in de variabele met de naam argv en. argc wordt geïnitialiseerd in de lengte van argv.
Argv0 wordt gedefinieerd als de naam van het script of binaire bestand als er geen script wordt gebruikt. Het volgende print bijvoorbeeld de naam van het script en de eerste drie argumenten:
send_user "$ argv0 lrange $ argv 0 2 n"
commando's
Expect gebruikt Tool Command Language. Tcl biedt controlestroom (indien voor, pauze), evaluatie van de expressie en verschillende andere functies, zoals de definitie van recursie en procedures. Commando's die hier worden gebruikt maar niet worden gedefinieerd (set, if, exec) zijn Tcl-opdrachten. Expect ondersteunt extra commando's. Tenzij anders aangegeven, retourneren opdrachten de lege tekenreeks.
Opdrachten worden alfabetisch weergegeven, zodat ze snel kunnen worden gevonden. Nieuwe gebruikers kunnen het echter gemakkelijker vinden om te beginnen met het lezen van de beschrijvingen van spawn, verzenden, verwachten en communiceren, in die volgorde.
close -slave -onexec 0 | 1 -i spawn_id
sluit de verbinding met het huidige proces. De meeste interactieve programma's zullen EOF op hun stdin detecteren en afsluiten; dus dichtbij meestal volstaat om het proces ook te doden. De vlag -i verklaart dat het proces moet worden afgesloten overeenkomstig de naam spawn_id.
Zowel verwachten als interacteren zullen detecteren wanneer het huidige proces wordt afgesloten en impliciet afsluiten, maar als je het proces doodt door, laten we zeggen, "exec kill $ pid", moet je expliciet dichtbij bellen.
De vlag -onexec bepaalt of de spawn-id wordt gesloten in nieuwe voortgebrachte processen of dat het proces wordt overlayed. Gebruik de waarde 0 om een spawn-ID open te laten. Een niet-nul gehele waarde dwingt de spawn gesloten in nieuwe processen.
De vlag -slave sluit de slave die is gekoppeld aan de spawn-id. Wanneer de verbinding wordt gesloten, wordt de slaaf ook automatisch gesloten als deze nog open is.
Het maakt niet uit of de verbinding impliciet of expliciet is gesloten, u moet wait bellen om het bijbehorende proces van de kernelverwerking op te schonen. De opdracht sluiten roept geen wachttijd op omdat er geen garantie is dat het afsluiten van een procesverbinding ertoe leidt dat deze wordt afgesloten.
debug -nu 0 | 1
bestuurt een Tcl-foutopsporingsprogramma, zodat u instructies kunt doorlopen en breekpunten kunt instellen.
Zonder argumenten wordt een 1 geretourneerd als de foutopsporing niet actief is, anders wordt een 0 geretourneerd.
Met een 1-argument wordt de debugger gestart. Met een argument 0 wordt de foutopsporing gestopt. Als een 1-argument wordt voorafgegaan door de vlag -nu, wordt de debugger onmiddellijk gestart. Anders wordt de debugger gestart met de volgende Tcl-instructie.
Met de opdracht debug worden geen valstrikken gewijzigd. Vergelijk dit met het starten van Expect met de vlag -D.
Het verbreekcommando verbreekt een gevorkt proces van de terminal. Het blijft op de achtergrond actief. Het proces krijgt een eigen procesgroep. Standaard I / O wordt doorgestuurd naar / dev / null.
Het volgende fragment gebruikt disconnect om het script op de achtergrond uit te voeren.
als {fork! = 0} afsluiten verbreken. . .
Het volgende script leest een wachtwoord en voert vervolgens elk uur een programma uit dat bij elke run een wachtwoord vereist. Het script levert het wachtwoord zodat u het slechts één keer hoeft te typen.
send_user "wachtwoord? " expect_user -re "(. *) n" voor {} 1 {} {als {fork! = 0} {sleep 3600; continue} disconnect spawn priv_prog verwacht Password: send "$ expect_out ( 1, string) r ". . . Uitgang }
Een voordeel van het gebruik van de asynchrone procesfunctie van de shell (&) is dat met Expect de terminalparameters kunnen worden opgeslagen voordat ze worden verbroken en later worden toegepast op nieuwe pty's. Met &, Expect heeft u geen kans om de parameters van de terminal te lezen, omdat de terminal al is ontkoppeld op het moment dat de controle wordt ontvangen.
exit -opts status
oorzaken Verwacht af te sluiten of anderszins voor te bereiden om dit te doen.
De -onexit flag zorgt ervoor dat het volgende argument wordt gebruikt als exit-handler. Zonder een argument wordt de huidige exit-handler geretourneerd.
De -geen uitgang vlag oorzaken Verwachten om je voor te bereiden om af te sluiten, maar stop met het terugzetten van de controle naar het besturingssysteem. De door de gebruiker gedefinieerde exit-handler wordt uitgevoerd evenals de eigen interne afhandelingskosten van Expect. Geen verdere Expect-opdrachten moeten worden uitgevoerd. Dit is handig als u Expect met andere Tcl-extensies uitvoert. De huidige interpreter (en hoofdvenster indien in de Tk-omgeving) blijft zo dat andere Tcl-extensies kunnen opschonen. Als Expect is Uitgang wordt opnieuw gebeld (hoe kan dit ook gebeuren), de handlers worden niet opnieuw uitgevoerd.
Bij het afsluiten zijn alle verbindingen met spawned processen gesloten. De sluiting wordt gedetecteerd als een EOF door voortgebrachte processen. Uitgang onderneemt geen andere acties dan wat de normale _exit (2) -procedure doet. Dus, voortgebrachte processen die niet controleren op EOF kunnen blijven draaien. (Een aantal verschillende omstandigheden zijn belangrijk om bijvoorbeeld te bepalen welke signalen een uitgezet proces zal worden verzonden, maar deze zijn systeemafhankelijk, meestal gedocumenteerd onder exit (3).) Uitgespaarde processen die blijven draaien, worden overgenomen door init.
staat (of 0 indien niet gespecificeerd) wordt geretourneerd als de exitstatus van Verwachten . Uitgang wordt impliciet uitgevoerd als het einde van het script is bereikt.
exp_continue -continue_timer
Het bevel exp_continue toestaat verwachten zelf om door te gaan met uitvoeren in plaats van terug te keren zoals het normaal zou doen. Standaard exp_continue reset de time-outtimer. De -continue_timer vlag voorkomt dat de timer opnieuw wordt opgestart. (Zien verwachten voor meer informatie.)
exp_internal -f bestand waarde
veroorzaakt verdere opdrachten om diagnostische informatie intern naar toe te sturen Verwachten stderr als waarde is niet-nul. Deze uitgang is uitgeschakeld als waarde is 0. De diagnostische informatie omvat elk ontvangen teken en elke poging gedaan om de huidige uitvoer te vergelijken met de patronen.
Als de optionele het dossier wordt geleverd, alle normale en foutopsporingsuitvoer wordt naar dat bestand geschreven (ongeacht de waarde van waarde ). Alle voorgaande diagnostische uitvoerbestanden zijn gesloten.
De -info vlag veroorzaakt exp_internal om een beschrijving van de meest recente gegeven niet-infoargumenten te retourneren.
exp_open args -i spawn_id
geeft een Tcl-bestands-ID terug die overeenkomt met de originele spawn-ID. De bestands-ID kan dan worden gebruikt alsof deze door Tcl's is geopend Open commando. (De spawn-ID moet niet meer worden gebruikt Wacht zou niet moeten worden uitgevoerd.
De -open laten vlag laat de spawn id open voor toegang via Expect-commando's. EEN Wacht moet worden uitgevoerd op de spawn-ID.
exp_pid -i spawn_id
geeft het proces-ID terug dat overeenkomt met het proces dat momenteel is uitgezet. Als het -ik vlag wordt gebruikt, de geretourneerde pid correspondeert met die van de gegeven spawn-id.
exp_send
is een alias voor sturen .
exp_send_error
is een alias voor send_error .
exp_send_log
is een alias voor send_log .
exp_send_tty
is een alias voor send_tty .
exp_send_user
is een alias voor send_user .
exp_version -exit -versie
is nuttig om ervoor te zorgen dat het script compatibel is met de huidige versie van Expect.
Zonder argumenten, de huidige versie van Verwachten wordt teruggestuurd. Deze versie kan dan in uw script worden gecodeerd. Als u weet dat u geen functies van recente versies gebruikt, kunt u een eerdere versie opgeven.
Versies bestaan uit drie cijfers gescheiden door punten. De eerste is het belangrijkste nummer. Scripts geschreven voor versies van Verwachten met een ander groot aantal zal vrijwel zeker niet werken. exp_version retourneert een fout als de hoofdnummers niet overeenkomen.
Ten tweede is het ondergeschikte nummer. Scripts geschreven voor een versie met een groter ondergeschikt nummer dan de huidige versie kunnen afhankelijk zijn van een nieuwe functie en kunnen mogelijk niet worden uitgevoerd. exp_version retourneert een fout als de hoofdnummers overeenkomen, maar het secundaire nummer van het script is groter dan dat van het uitvoeren Verwachten .
Ten derde is een getal dat geen rol speelt in de versievergelijking. Het wordt echter geïncrementeerd als het Verwachten Softwaredistributie wordt op elke manier gewijzigd, bijvoorbeeld door aanvullende documentatie of optimalisatie. Het wordt teruggezet op 0 bij elke nieuwe minorversie.
Met de -Uitgang vlag, Verwachten drukt een fout af en wordt afgesloten als de versie verouderd is.
verwacht -opts pat1 body1 … -opts patn bodyn
wacht tot een van de patronen overeenkomt met de uitvoer van een uitgezet proces, een opgegeven tijdsperiode is verstreken of er is een einde bestand te zien. Als het laatste lichaam leeg is, kan het worden weggelaten.
Patronen van de meest recente expect_before commando worden impliciet gebruikt voor andere patronen. Patronen van de meest recente expect_after commando worden impliciet gebruikt na andere patronen.
Als de argumenten voor het geheel verwachten Als een instructie meer dan één regel vereist, kunnen alle argumenten in een regel worden "geschoord" om te voorkomen dat elke regel wordt afgesloten met een backslash. In dit ene geval zullen de gebruikelijke Tcl-substituties optreden ondanks de beugels.
Als een patroon het sleutelwoord is eof , de overeenkomstige instantie wordt uitgevoerd aan het einde van het bestand. Als een patroon het sleutelwoord is time-out , de overeenkomstige instantie wordt uitgevoerd bij time-out. Als er geen time-out zoekwoord wordt gebruikt, wordt een impliciete nulactie uitgevoerd bij time-out. De standaard time-outperiode is 10 seconden maar kan worden ingesteld, bijvoorbeeld op 30, met het commando "time-out 30 instellen". Een oneindige time-out kan worden aangeduid met de waarde -1. Als een patroon het sleutelwoord is standaard , de overeenkomstige instantie wordt uitgevoerd op een time-out of op het einde van het bestand.
Als een patroon overeenkomt, wordt de overeenkomstige instantie uitgevoerd. verwachten retourneert het resultaat van het hoofdgedeelte (of de lege reeks als geen patroon overeenkomt). In het geval dat meerdere patronen overeenkomen, wordt degene die als eerste verschijnt, gebruikt om een instantie te selecteren.
Telkens wanneer nieuwe uitvoer binnenkomt, wordt deze vergeleken met elk patroon in de volgorde waarin ze worden weergegeven. U kunt dus testen op afwezigheid van een overeenkomst door het laatste patroon iets gegarandeerd te laten lijken, zoals een prompt. In situaties waarin er geen prompt is, moet u gebruiken time-out (net zoals je zou doen als je handmatig zou interacteren).
Patronen worden op drie manieren gespecificeerd. Standaard worden patronen gespecificeerd zoals bij Tcl's snaar match commando. (Dergelijke patronen zijn ook vergelijkbaar met reguliere expressies van C-shells die gewoonlijk worden aangeduid als "glob" -patronen). De -GL vlag mag worden gebruikt om patronen te beschermen die anders overeenkomen verwachten vlaggen van doen. Elk patroon dat met een "-" begint, moet op deze manier worden beschermd. (Alle strings die beginnen met "-" zijn gereserveerd voor toekomstige opties.)
Het volgende fragment zoekt bijvoorbeeld naar een succesvolle aanmelding. (Let daar op afbreken wordt verondersteld een procedure te zijn die elders in het script wordt gedefinieerd.)
verwachten {bezig {zet bezig n; exp_continue} is mislukt. aborteer "ongeldig wachtwoord" abort timeout abort connected}
Aanhalingstekens zijn nodig op het vierde patroon omdat het een spatie bevat, die anders het patroon van de actie zou scheiden.Voor patronen met dezelfde actie (zoals de 3e en 4e) moeten de acties opnieuw worden vermeld. Dit kan voorkomen worden door patronen in regexp-stijl te gebruiken (zie hieronder). Meer informatie over het vormen van glob-style patronen is te vinden in het Tcl-handboek.
Regexp-achtige patronen volgen de syntaxis gedefinieerd door Tcl's regexp (afkorting voor "regular expression") commando. regexp-patronen worden geïntroduceerd met de vlag -opnieuw . Het vorige voorbeeld kan met een regexp worden herschreven als:
verwachten {bezig {zet bezig n; exp_continue} -re "failed | ongeldig wachtwoord" abort timeout abort connected}
Beide soorten patronen zijn "unanchored". Dit betekent dat patronen niet de hele reeks hoeven te evenaren, maar de wedstrijd overal in de reeks kunnen beginnen en eindigen (zolang al het andere overeenkomt). Gebruik ^ om het begin van een string te matchen, en $ om het einde te matchen. Merk op dat als je niet op het einde van een string wacht, je antwoorden gemakkelijk in het midden van de string terecht kunnen komen, zoals ze worden weergegeven in het proces van de spawn. Hoewel het nog steeds de juiste resultaten oplevert, kan de uitvoer er onnatuurlijk uitzien. Dus, het gebruik van $ wordt aangemoedigd als je de karakters aan het einde van een string exact kunt beschrijven.
Merk op dat in veel editors de ^ en $ overeenkomen met respectievelijk het begin en einde van de regels. Omdat verwacht niet lijngeoriënteerd is, komen deze tekens overeen met het begin en het einde van de gegevens (in tegenstelling tot lijnen) die zich momenteel in de overeenkomende overeenkomende buffer bevinden. (Zie ook de opmerking hieronder over "systeemindigestie.")
De -ex vlag zorgt ervoor dat het patroon overeenkomt met een "exacte" tekenreeks. Er wordt geen interpretatie van *, ^, enz. Gemaakt (hoewel de gebruikelijke Tcl-conventies nog steeds moeten worden nageleefd). Exacte patronen zijn altijd niet verankerd.
De -geen geval vlag zorgt ervoor dat tekens in hoofdletters van de uitvoer worden vergeleken alsof het kleine letters waren. Het patroon wordt niet beïnvloed.
Tijdens het lezen van de uitvoer kunnen meer dan 2000 bytes eerdere bytes "vergeten" maken. Dit kan met de functie worden gewijzigd match_max . (Merk op dat te grote waarden de patroonaanpassing kunnen vertragen.) Indien patlist is full_buffer , de overeenkomstige instantie wordt uitgevoerd als match_max bytes zijn ontvangen en geen andere patronen zijn gematcht. Of het nu gaat of niet full_buffer sleutelwoord wordt gebruikt, de vergeten karakters worden geschreven naar expect_out (buffer).
Als patlist is het sleutelwoord nul en nullen zijn toegestaan (via de remove_nulls opdracht), wordt de overeenkomstige instantie uitgevoerd als een enkele ASCII 0 overeenkomt. Het is niet mogelijk om 0 bytes aan te passen via glob- of regexp-patronen.
Bij het matchen van een patroon (of eof of full_buffer), wordt elke overeenkomende en voorheen niet-overeenkomende uitvoer opgeslagen in de variabele expect_out (buffer) . Er kunnen maximaal 9 regexp-substringovereenkomsten worden opgeslagen in de variabelen expect_out (1, string) door expect_out (9, koord) . Als het -indices vlag wordt gebruikt vóór een patroon, de begin- en eindindex (in een vorm die geschikt is voor lrange ) van de 10 strings worden opgeslagen in de variabelen expect_out (X, start) en expect_out (X, end) waarbij X een cijfer is, komt overeen met de substringpositie in de buffer. 0 verwijst naar strings die overeenkomen met het gehele patroon en die wordt gegenereerd voor glob-patronen en regexp-patronen. Als een proces bijvoorbeeld de uitvoer van "abcdefgh n" heeft geproduceerd, is het resultaat van:
verwacht "cd"
is alsof de volgende uitspraken zijn uitgevoerd:
set expect_out (0, string) cd set expect_out (buffer) abcd
en "efgh n" blijft in de uitvoerbuffer staan. Als een proces de uitvoer "abbbcabkkkka n" produceerde, het resultaat van:
verwachten -indices -re "b (b *). * (k +)"
is alsof de volgende uitspraken zijn uitgevoerd:
set expect_out (0, start) 1 set expect_out (0, end) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, end) 3 set expect_out (1, string) bb set expect_out (2, start) 10 set expect_out (2, end) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk
en "a n" blijft achter in de uitvoerbuffer. Het patroon "*" (en -re ". *") Spoelt de uitvoerbuffer zonder dat er meer uitvoer van het proces wordt gelezen.
Normaal gesproken wordt de gematchte uitvoer verwijderd uit de interne buffers van Expect. Dit kan worden voorkomen door een patroon vooraf te zetten met de -notransfer vlag. Deze vlag is vooral handig bij het experimenteren (en kan tijdens het experimenteren worden afgekort tot "-not").
De spawn-id die is gekoppeld aan de overeenkomende uitvoer (of eof of full_buffer) wordt opgeslagen in expect_out (spawn_id) .
De -time-out vlag veroorzaakt dat de opdracht current expect de volgende waarde als een time-out gebruikt in plaats van de waarde van de time-outvariabele te gebruiken.
Standaard worden patronen vergeleken met de uitvoer van het huidige proces, echter de -ik flag verklaart dat de uitvoer van de genoemde spawn_id-lijst moet worden vergeleken met eventuele volgende patronen (tot aan de volgende) -ik ). De spawn_id-lijst moet een door spaties gescheiden lijst van spawn_ids zijn of een variabele die naar een dergelijke lijst met spawn_ids verwijst.
In het volgende voorbeeld wordt bijvoorbeeld gewacht op "verbonden" van het huidige proces, of "bezet", "mislukt" of "ongeldig wachtwoord" van de spawn_id genoemd door $ proc2.
verwacht dat {-i $ proc2 bezig is {puts busy n; exp_continue} -re "failed | ongeldig wachtwoord" abort timeout abort connected}
De waarde van de globale variabele any_spawn_id kan worden gebruikt om patronen aan te passen aan spawn_ids die bij alle andere worden genoemd -ik vlaggen in de huidige verwachten commando. De spawn_id van a -ik vlag zonder bijbehorend patroon (d.w.z. onmiddellijk gevolgd door een ander patroon -ik ) is beschikbaar voor alle andere patronen in hetzelfde verwachten commando geassocieerd met any_spawn_id.
De -ik vlag kan ook een globale variabele benoemen, in welk geval de variabele wordt gelezen voor een lijst met α-ids. De variabele wordt opnieuw gelezen wanneer deze verandert. Dit biedt een manier om de I / O-bron te wijzigen terwijl de opdracht wordt uitgevoerd. Opzetten van ids op deze manier worden "indirecte" spawn-id's genoemd.
Acties zoals breken en doorgaan met regelstructuren veroorzaken (d.w.z. voor , proc ) om zich op de gebruikelijke manier te gedragen. Het bevel exp_continue toestaat verwachten zelf om door te gaan met uitvoeren in plaats van terug te keren zoals het normaal zou doen.
Dit is handig voor het vermijden van expliciete lussen of herhaalde verwachtingsverklaringen. Het volgende voorbeeld is onderdeel van een fragment om rlogin te automatiseren. De exp_continue vermijdt om een seconde te schrijven verwachten statement (om de prompt opnieuw te zoeken) als de rlogin om een wachtwoord vraagt.
verwacht {password: {stty-echo send_user "wachtwoord (voor $ gebruiker) op $ host:" expect_user -re "(. *) n" send_user " n" send "$ expect_out (1, string) r" stty echo exp_continue} incorrect {send_user "ongeldig wachtwoord of account n" exit} timeout {send_user "verbinding met $ host getimed n" exit} eof {send_user "verbinding met host mislukt: $ expect_out (buffer)" exit} - re $ prompt}
Het volgende fragment kan bijvoorbeeld een gebruiker helpen bij het begeleiden van een interactie die al volledig is geautomatiseerd. In dit geval wordt de terminal in de onbewerkte modus gezet. Als de gebruiker op "+" drukt, wordt een variabele opgehoogd. Als op "p" wordt gedrukt, worden verschillende retouren naar het proces gestuurd, misschien om het op de een of andere manier te porren, en "i" laat de gebruiker interactie aan met het proces, waardoor de controle van het script wordt gestolen. In beide gevallen is de exp_continue staat de stroom toe verwachten om patroonafstemming voort te zetten na het uitvoeren van de huidige actie.
stty raw -echo expect_after {-i $ user_spawn_id "p" {send " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "stop" exit}
Standaard, exp_continue reset de time-outtimer. De timer wordt niet opnieuw gestart, als exp_continue wordt aangeroepen met de -continue_timer vlag.
expect_after expect_args
werkt identiek aan de expect_before behalve dat als patronen van beide verwachten en expect_after kan evenaren, de verwachten patroon wordt gebruikt. Zie de expect_before commando voor meer informatie.
expect_background expect_args
neemt dezelfde argumenten alsverwachten , maar het keert onmiddellijk terug. Patronen worden getest wanneer nieuwe invoer binnenkomt. Het patroontime-out enstandaard zijn zinloosexpect_background en worden stil weggegooid. Anders deexpect_background commando gebruiktexpect_before enexpect_after patronen net alsverwachten doet.
Wanneerexpect_background acties worden geëvalueerd, achtergrondverwerking voor dezelfde spawn-ID wordt geblokkeerd. Achtergrondverwerking is gedeblokkeerd wanneer de actie is voltooid. Hoewel achtergrondverwerking is geblokkeerd, is het mogelijk om een (voorgrond)verwachten op dezelfde spawn-ID.
Het is niet mogelijk om een uit te voerenverwachten terwijl eenexpect_background is gedeblokkeerd.expect_background voor een bepaalde spawn-id wordt verwijderd door een nieuwe expect_background te declareren met dezelfde spawn-ID. Verklarenexpect_background zonder patroon verwijdert de gegeven spawn-id de mogelijkheid om patronen op de achtergrond te matchen.
expect_before expect_args
neemt dezelfde argumenten alsverwachten , maar het keert onmiddellijk terug. Patroonactieparen van de meest recenteexpect_before met dezelfde spawn-id worden impliciet toegevoegd aan elk volgendverwachten commando's. Als een patroon overeenkomt, wordt het behandeld alsof het is opgegeven in deverwachten commando zelf, en de geassocieerde instantie wordt uitgevoerd in de context van deverwachten commando. Als patronen van beideexpect_before enverwachten kan evenaren, deexpect_before patroon wordt gebruikt.
Als er geen patroon is opgegeven, wordt de spawn-ID niet gecontroleerd op patronen.
Tenzij overruled door een-ik vlag,expect_before patronen komen overeen met de spawn id gedefinieerd op het moment dat deexpect_before opdracht is uitgevoerd (niet wanneer het patroon overeenkomt).
De -info vlag veroorzaaktexpect_before om de huidige specificaties te retourneren van welke patronen deze overeenkomen. Standaard rapporteert het over de huidige spawn-ID. Een optionele spawn-id-specificatie kan worden gegeven voor informatie over die spawn-ID. Bijvoorbeeld
expect_before -info -i $ proc
Er kan maximaal één spawn-ID-specificatie worden gegeven. De flag -indirect onderdrukt directe spawn-id's die alleen afkomstig zijn van indirecte specificaties.
In plaats van een spawn-id-specificatie, zal de vlag "-all" ervoor zorgen dat "-info" rapporteert over alle spawn-id's.
De uitvoer van de vlag -info kan opnieuw worden gebruikt als argument om expect_before te verwachten.
expect_tty expect_args
is alsverwachten maar het leest tekens uit / dev / tty (dat wil zeggen toetsaanslagen van de gebruiker). Standaard wordt het lezen uitgevoerd in de gekookte modus. Dus moeten lijnen eindigen met een terugkeer om voorverwachten om ze te zien. Dit kan worden gewijzigd viastty (zie destty commando hieronder).
expect_user expect_args
is alsverwachten maar het leest tekens van stdin (d.w.z. toetsaanslagen van de gebruiker). Standaard wordt het lezen uitgevoerd in de gekookte modus. Dus moeten lijnen eindigen met een terugkeer om voorverwachten om ze te zien.Dit kan worden gewijzigd viastty (zie destty commando hieronder).
vork
creëert een nieuw proces. Het nieuwe proces is een exacte kopie van de huidigeVerwachten werkwijze. Op succes,vork geeft 0 terug aan het nieuwe (onderliggende) proces en retourneert de proces-id van het onderliggende proces naar het bovenliggende proces. Bij falen (onveranderlijk vanwege een gebrek aan bronnen, bijvoorbeeld swapspace, geheugen),vork geeft -1 terug aan het bovenliggende proces en er wordt geen onderliggend proces aangemaakt.
Vorkprocessen verlaten via deUitgang commando, net als het oorspronkelijke proces. Verrekte processen kunnen schrijven naar de logbestanden. Als u de meeste processen niet uitschakelt voor foutopsporing of aanmelding, kan het resultaat verwarrend zijn.
Sommige kleine implementaties kunnen door meerdere lezers en schrijvers worden verward, zelfs tijdelijk. Het is dus het veiligst omvork vóór het afzetten van processen.
interactie string1 body1 … stringn bodyn
geeft controle over het huidige proces aan de gebruiker, zodat toetsaanslagen naar het huidige proces worden verzonden en de stdout en stderr van het huidige proces worden geretourneerd.
String-body-paren kunnen worden opgegeven als argumenten, in welk geval de hoofdtekst wordt uitgevoerd wanneer de overeenkomstige tekenreeks wordt ingevoerd. (Standaard wordt de tekenreeks niet naar het huidige proces verzonden.) Detolk commando wordt verondersteld, als het laatste lichaam ontbreekt.
Als de argumenten voor het geheelop elkaar inwerken Als een instructie meer dan één regel vereist, kunnen alle argumenten in een regel worden "geschoord" om te voorkomen dat elke regel wordt afgesloten met een backslash. In dit ene geval zullen de gebruikelijke Tcl-substituties optreden ondanks de beugels.
De volgende opdracht voert bijvoorbeeld interactie uit met de volgende string-body-paren: Wanneer ^ Z wordt ingedrukt,Verwachten is geschorst. (De-reset vlag herstelt de terminalmodi.) Wanneer ^ A wordt ingedrukt, ziet de gebruiker "u hebt een besturingselement-A getypt" en wordt het proces a ^ A verzonden. Wanneer $ wordt ingedrukt, ziet de gebruiker de datum. Wanneer ^ C wordt ingedrukt,Verwachten uitgangen. Als "foo" wordt ingevoerd, ziet de gebruiker "balk". Wanneer ~~ wordt ingedrukt, deVerwachten interpreter werkt interactief.
stel CTRLZ 032 in op {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "typ je een controle-A n"; send " 001"} $ {send_user "De datum is klokformaat klokseconden."} 003 exit foo {send_user "bar"} ~~}
In string-body-paren worden tekenreeksen gematcht in de volgorde waarin ze als argumenten worden weergegeven. Snaren die gedeeltelijk overeenkomen, worden niet naar het huidige proces gestuurd in afwachting van de rest. Als tekens dan zo worden ingevoerd dat er niet langer mogelijk een overeenkomst kan zijn, wordt alleen het deel van de tekenreeks naar het proces verzonden dat onmogelijk een andere overeenkomst kan beginnen. Strings die deelreeksen van gedeeltelijke overeenkomsten zijn, kunnen dus later overeenkomen, als de originele tekenreeksen die probeerden overeen te komen uiteindelijk faalden.
Standaard is het matchen van tekenreeksen exact zonder jokertekens. (In tegenstelling, deverwachten commando maakt standaard gebruik van patronen in algemene stijl.) De-ex vlag kan worden gebruikt om patronen te beschermen die anders overeenkomenop elkaar inwerken vlaggen van doen. Elk patroon dat met een "-" begint, moet op deze manier worden beschermd. (Alle strings die beginnen met "-" zijn gereserveerd voor toekomstige opties.)
De-opnieuw vlag dwingt de tekenreeks om te worden geïnterpreteerd als een patroon in de vorm van een regexp-stijl. In dit geval worden overeenkomende substrings in de variabele opgeslagen interact_out op dezelfde manier als de manierverwachten slaat zijn uitvoer op in de variabeleexpect_out . De-indices vlag wordt op dezelfde manier ondersteund.
Het patrooneof introduceert een actie die wordt uitgevoerd aan het einde van het bestand. Een aparteof patroon kan ook de-uitgang vlag, in welk geval het overeenkomt als een eof wordt gedetecteerd tijdens het schrijven van de uitvoer. De standaardeof actie is "terugkeer", dus datop elkaar inwerken keert eenvoudig terug op een EOF.
Het patroontime-out introduceert een time-out (in seconden) en actie die wordt uitgevoerd nadat gedurende een bepaalde tijd geen tekens zijn gelezen. Detime-out patroon is van toepassing op het meest recent gespecificeerde proces. Er is geen standaardtime-out. De speciale variabele "time-out" (gebruikt door deverwachten opdracht) heeft geen invloed op deze time-out.
De volgende instructie zou bijvoorbeeld kunnen worden gebruikt voor autologout-gebruikers die een uur niets hebben getypt, maar die nog steeds frequente systeemberichten ontvangen:
interact -input $ user_spawn_id timeout 3600 return -output $ spawn_id
Als het patroon het sleutelwoord isnul en nullen zijn toegestaan (via deremove_nulls opdracht), wordt de overeenkomstige instantie uitgevoerd als een enkele ASCII 0 overeenkomt. Het is niet mogelijk om 0 bytes aan te passen via glob- of regexp-patronen.
Een patroon voorafgaan met de vlag-ik schrijf veroorzaakt de variabele interact_out (spawn_id) worden ingesteld op de spawn_id die overeenkomt met het patroon (of eOF).
Acties zoalsbreken endoorgaan met regelstructuren veroorzaken (d.w.z.voor , proc ) om zich op de gebruikelijke manier te gedragen. Echterterugkeer zorgt ervoor dat de interactie terugkeert naar zijn beller, terwijlinter_return oorzakenop elkaar inwerken om een terugkeer in zijn beller te veroorzaken. Bijvoorbeeld, als "proc foo" heeft gebeldop elkaar inwerken die vervolgens de actie uitvoerdeinter_return , proc foo zou terugbrengen. (Dit betekent dat alsop elkaar inwerken callstolk interactief typenterugkeer zorgt ervoor dat de interactie doorgaat, terwijlinter_return zorgt ervoor dat de interactie terugkeert naar de beller.)
Gedurendeop elkaar inwerken , de onbewerkte modus wordt gebruikt, zodat alle tekens aan het huidige proces kunnen worden doorgegeven.Als het huidige proces geen opdrachtbesturingssignalen opvangt, stopt het als een stopsignaal wordt verzonden (standaard ^ Z). Om het opnieuw te starten, verzendt u een continu-signaal (zoals door "kill -CONT"). Als je echt een SIGSTOP naar een dergelijk proces wilt sturen (door ^ Z), overweeg dan om eerst csh-kshwning uit te voeren en vervolgens je programma uit te voeren. Aan de andere kant, als u een SIGSTOP wilt sturen naarVerwachten zelf, eerste oproep tolk (misschien met behulp van een escape-teken), en druk vervolgens op ^ Z.
String-body-paren kunnen als afkorting worden gebruikt om te voorkomen dat ze de interpreter moeten invoeren en opdrachten interactief moeten uitvoeren. De vorige terminal-modus wordt gebruikt terwijl het lichaam van een string-body-paar wordt uitgevoerd.
Voor snelheid worden de acties standaard uitgevoerd in de onbewerkte modus. De-reset markeert de terminal opnieuw in de modus die deze eerder hadop elkaar inwerken werd uitgevoerd (onveranderlijk, gekookte modus). Merk op dat tekens die worden ingevoerd wanneer de modus wordt omgeschakeld mogelijk verloren gaan (een ongelukkige functie van het terminalstuurprogramma op sommige systemen). De enige reden om te gebruiken-reset is als je actie afhangt van het draaien in de gekookte modus.
De-echo vlag verzendt tekens die overeenkomen met het volgende patroon terug naar het proces dat ze heeft gegenereerd terwijl elk teken wordt gelezen. Dit kan handig zijn als de gebruiker feedback van gedeeltelijk getypte patronen moet zien.
Als een patroon wordt geëchood maar uiteindelijk niet overeenkomt, worden de tekens naar het spawn-proces verzonden. Als het spawnproces deze echo's geeft, ziet de gebruiker de tekens twee keer.-echo is waarschijnlijk alleen geschikt in situaties waarin het onwaarschijnlijk is dat de gebruiker het patroon niet voltooit. Het volgende fragment is bijvoorbeeld van rftp, het recursieve-ftp-script, waarbij de gebruiker wordt gevraagd om ~ g, ~ p of ~ l in te voeren om de huidige map recursief te krijgen, op te slaan of weer te geven. Deze zijn zo ver verwijderd van de normale ftp-opdrachten dat de gebruiker waarschijnlijk geen ~ zal typen, gevolgd door iets anders, behalve ten onrechte, in welk geval ze het resultaat waarschijnlijk toch gewoon zullen negeren.
interact {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}
De-nobuffer vlag verzendt tekens die overeenkomen met het volgende patroon in het uitvoerproces terwijl tekens worden gelezen.
Dit is handig als u een programma het patroon terug wilt laten echoën. Het volgende kan bijvoorbeeld worden gebruikt om te controleren waar iemand belt (een modem in Hayes-stijl). Telkens wanneer "atd" wordt gezien, registreert het script de rest van de regel.
proc lognummer {} {interact -nobuffer -re "(. *) r" return zet $ log "klokformaat klok seconden: dialed $ interact_out (1, string)"} interact -nobuffer "atd" lognummer
Gedurendeop elkaar inwerken , eerder gebruik vanlog_user wordt genegeerd. Met name,op elkaar inwerken zal de uitvoer dwingen om te worden vastgelegd (verzonden naar de standaarduitvoer), omdat wordt aangenomen dat de gebruiker niet blindelings wil communiceren.
De-O flag zorgt ervoor dat de volgende key-body-paren worden toegepast op de uitvoer van het huidige proces. Dit kan handig zijn, bijvoorbeeld als het gaat om hosts die ongewenste tekens verzenden tijdens een telnet-sessie.
Standaard,op elkaar inwerken verwacht dat de gebruiker stdin schrijft en stdout leest van deVerwachten zelf verwerken. De-u vlag (voor "gebruiker") maaktop elkaar inwerken zoek naar de gebruiker als het proces met de naam van het argument (dit moet een spawn-ID zijn).
Hierdoor kunnen twee niet-gerelateerde processen worden samengevoegd zonder een expliciete lus te gebruiken. Voor hulp bij het opsporen van fouten, kunt u Diagnostische gegevens altijd naar stderr (of standaard voor bepaalde logging- en foutopsporingsinformatie) zoeken. Om dezelfde reden, detolk commando zal interactief van stdin lezen.
Het volgende fragment maakt bijvoorbeeld een aanmeldingsproces. Vervolgens wordt de gebruiker gebeld (niet weergegeven) en worden de twee uiteindelijk met elkaar verbonden. Natuurlijk kan elk proces worden vervangen door login. Met een shell kan de gebruiker bijvoorbeeld werken zonder een account en wachtwoord in te voeren.
spawn login set login $ spawn_id spawn tip modem # terugbellen naar gebruiker # connect user to login interact -u $ login
Als u uitvoer naar meerdere processen wilt verzenden, geeft u elke spawn-id-lijst op met vooraf een a-uitgang vlag. Invoer voor een groep uitvoer-spawn-id's kan worden bepaald door een spawn-id-lijst voorafgegaan door een-invoer vlag. (Beide-invoer en-uitgang kan lijsten nemen in dezelfde vorm als de-ik vlag in deverwachten opdracht, behalve dat any_spawn_id niet zinvol isop elkaar inwerken .) Alle volgende vlaggen en tekenreeksen (of patronen) zijn van toepassing op deze invoer totdat een andere -invoervlag verschijnt. Als Nee-invoer komt naar voren,-uitgang impliceert "-input $ user_spawn_id -output". (Evenzo met patronen die niet hebben-invoer .) Als een-invoer is opgegeven, wordt $ user_spawn_id overschreven. Als een seconde-invoer is opgegeven, wordt $ spawn_id overschreven. Extra-invoer vlaggen kunnen worden opgegeven.
De twee impliciete invoerprocessen zijn standaard ingesteld op het hebben van hun uitvoer gespecificeerd als $ spawn_id en $ user_spawn_id (in omgekeerde richting). Als een-invoer vlag verschijnt zonder-uitgang vlag, worden tekens uit dat proces verwijderd.
De-ik vlag introduceert een vervanging voor de huidige spawn_id wanneer geen andere-invoer of-uitgang vlaggen worden gebruikt. Een Ai-vlag betekent een vlag -o.
Het is mogelijk om de processen te wijzigen waarmee wordt gecommuniceerd door indirecte spawn-id's te gebruiken. (Indirecte spawn-id's worden beschreven in de sectie over de opdracht expect.) Indirecte spawn-id's kunnen worden opgegeven met de -i, -u, -input of -output-flags.
tolk args
zorgt ervoor dat de gebruiker interactief wordt gevraagdVerwachten en Tcl-opdrachten. Het resultaat van elke opdracht wordt afgedrukt.
Acties zoalsbreken endoorgaan met regelstructuren veroorzaken (d.w.z.voor , proc ) om zich op de gebruikelijke manier te gedragen. Echterterugkeer zorgt ervoor dat de interpreter terugkeert naar zijn beller, terwijlinter_return oorzakentolk om een terugkeer in zijn beller te veroorzaken. Bijvoorbeeld, als "proc foo" heeft gebeldtolk die vervolgens de actie uitvoerdeinter_return , proc foo zou terugbrengen. Elke andere opdracht veroorzaakttolk om door te gaan met vragen naar nieuwe opdrachten.
Standaard bevat de aanwijzing twee gehele getallen. Het eerste gehele getal beschrijft de diepte van de evaluatiestapel (d.w.z. hoe vaak Tcl_Eval is aangeroepen). Het tweede gehele getal is de Tcl-geschiedenis-ID. De prompt kan worden ingesteld door een procedure met de naam "prompt1" te definiëren waarvan de geretourneerde waarde de volgende prompt wordt. Als een instructie open aanhalingstekens, parensies, accolades of haakjes heeft, wordt een secundaire aanwijzing (standaard "+>") uitgegeven op newline. De secundaire prompt kan worden ingesteld door een procedure met de naam "prompt2" te definiëren.
Gedurendetolk , de gekookte modus wordt gebruikt, zelfs als de beller de onbewerkte modus gebruikte.
Als stdin gesloten is,tolk zal terugkeren, tenzij de-eof vlag wordt gebruikt, in welk geval het volgende argument wordt aangeroepen.
log_file args -a file
Als een bestandsnaam wordt opgegeven,log_file zal een transcript van de sessie (beginnend op dat punt) in het bestand opnemen.log_file stopt met opnemen als er geen argument wordt gegeven. Elk vorig logbestand is gesloten.
In plaats van een bestandsnaam kan een Tcl-bestands-ID worden opgegeven met behulp van de-Open of-open laten vlaggen. Dit is vergelijkbaar met depaaien commando. (Zienpaaien voor meer informatie.)
De-een flag forces output wordt gelogd die werd onderdrukt door delog_user commando.
Standaard is delog_file commando voegt naar oude bestanden in plaats van ze af te breken, om loggen meerdere keren in één sessie uit te schakelen. Gebruik de .om bestanden te verkleinen-noappend vlag.
De-info flag zorgt ervoor dat log_file een beschrijving retourneert van de meest recente niet-info argumenten gegeven.
log_user -info | 0 | 1
Standaard wordt het verzend / verwacht-dialoog vastgelegd in stdout (en een logbestand indien geopend). Het loggen naar stdout wordt uitgeschakeld door de opdracht "log_user 0" en opnieuw ingeschakeld door "log_user 1". Loggen naar het logbestand is ongewijzigd.
De-info flag zorgt ervoor dat log_user een beschrijving retourneert van de meest recente niet-info argumenten gegeven.
match_max -d -i spawn_id grootte
definieert de grootte van de buffer (in bytes) die intern door wordt gebruiktverwachten . Zonder grootte argument, de huidige grootte wordt geretourneerd.
Met de-d vlag, de standaardgrootte is ingesteld. (De standaardwaarde is 2000.) Met de-ik vlag, de grootte is ingesteld voor de genoemde spawn-id, anders wordt deze ingesteld voor het huidige proces.
overlay - # spawn_id - # spawn_id … programma args
Voert "programma args "in plaats van de stroomVerwachten programma, dat eindigt. Een leeg afbreekstreepje dwingt een koppelteken voor de opdrachtnaam af alsof het een login-shell is. Alle spawn_ids zijn gesloten, behalve degene die worden genoemd als argumenten. Deze worden toegewezen aan de genoemde bestands-ID's.
Spawn_ids worden toegewezen aan bestands-ID's voor het nieuwe programma om te erven. De volgende regel wordt bijvoorbeeld gebruikt voor schaken en maakt het mogelijk om te worden bestuurd door het huidige proces, bijvoorbeeld een schaakmeester.
overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id schaak
Dit is efficiënter dan "interact -u", maar het offert de mogelijkheid om geprogrammeerde interactie te doen sinds deVerwachten proces heeft niet langer controle.
Merk op dat er geen controleterminal is voorzien. Dus als u de standaardinvoer verbreken of opnieuw toewijzen, zullen programma's die taakbeheer (shells, aanmelding, enz.) Niet goed werken.
pariteit -d -i spawn_id waarde
definieert of pariteit moet worden behouden of ontdaan van de uitvoer van voortgebrachte processen. Als waarde is nul, pariteit is gestript, anders is het niet uitgekleed. Zonder waarde argument, de huidige waarde wordt geretourneerd.
Met de-d vlag, de standaardpariteitswaarde is ingesteld. (De standaardwaarde is 1, dat wil zeggen dat pariteit niet is gestript.) Met de-ik vlag, wordt de pariteitswaarde ingesteld voor de genoemde spawn-id, anders wordt deze ingesteld voor het huidige proces.
remove_nulls -d -i spawn_id waarde
definieert of nulls worden behouden of verwijderd uit de uitvoer van spawned processen vóór patroonafstemming of opslaan in de variabele expect_out of interact_out . Als waarde is 1, nullen worden verwijderd. Als waarde is 0, nullen worden niet verwijderd. Zonder waarde argument, de huidige waarde wordt geretourneerd.
Met de-d vlag, de standaardwaarde is ingesteld. (De standaardwaarde is 1, d.w.z. nulls worden verwijderd.) Met de-ik vlag, de waarde is ingesteld voor de genoemde spawn-id, anders wordt deze ingesteld voor het huidige proces.
Of nulls worden verwijderd of nietVerwachten zal nul bytes opnemen in het log en stdout.
stuur een -vlaggen string
stuurt draad naar het huidige proces. Bijvoorbeeld het commando
stuur "hallo wereld r"
verzendt de tekens, h e l l o w o r l d naar het huidige proces. (Tcl bevat een printf-achtige opdracht (genaamdformaat ) die willekeurig complexe reeksen kunnen bouwen.)
Tekens worden onmiddellijk verzonden, hoewel programma's met een regelgebufferde invoer de tekens niet zullen lezen totdat een retourteken wordt verzonden. Een retourteken wordt " r" genoemd.
De-- vlag dwingt het volgende argument om geïnterpreteerd te worden als een string in plaats van een vlag.Elke reeks kan worden voorafgegaan door "-", ongeacht of deze al dan niet op een vlag lijkt. Dit biedt een betrouwbaar mechanisme voor het specificeren van variabele reeksen zonder dat deze worden geactiveerd door degene die per ongeluk op vlaggen lijken. (Alle strings die beginnen met "-" zijn gereserveerd voor toekomstige opties.)
De-ik flag verklaart dat de string naar de named spawn_id wordt verzonden. Als de spawn_id is user_spawn_id , en de terminal bevindt zich in de onbewerkte modus, worden nieuwe regels in de tekenreeks vertaald in return-newline-reeksen, zodat ze eruit zien alsof de terminal in de gekookte modus was. De-raw flag schakelt deze vertaling uit.
De-nul vlag verzendt lege tekens (0 bytes). Standaard wordt één null verzonden. Een geheel getal kan de-nul om aan te geven hoeveel nullen er moeten worden verzonden.
De-breken vlag genereert een onderbrekingsvoorwaarde. Dit heeft alleen zin als de spawn-id verwijst naar een tty-apparaat dat is geopend via "spawn -open". Als u een proces zoals een fooi hebt voortgebracht, moet u de conventie van tip gebruiken voor het genereren van een pauze.
De-s De uitvoer van vlagtroepen moet "langzaam" worden verzonden, dus vermijd de gebruikelijke situatie waarbij een computer een invoerbuffer uittypt die is ontworpen voor een mens die nooit dezelfde buffer zou overschrijden. Deze uitvoer wordt bestuurd door de waarde van de variabele "send_slow" die een lijst met twee elementen maakt. Het eerste element is een geheel getal dat het aantal te atomiseren bytes beschrijft. Het tweede element is een reëel getal dat het aantal seconden beschrijft waarmee de atomaire zendeenheden moeten worden gescheiden. "Set send_slow {10 .001}" zou bijvoorbeeld "send -s" forceren om strings te verzenden met 1 milliseconde tussen elke verzonden 10 tekens.
De-h vlag forceert de uitvoer om (enigszins) te worden verzonden als een mens die daadwerkelijk typt. Menselijke vertragingen verschijnen tussen de personages. (Het algoritme is gebaseerd op een Weibull-distributie, met aanpassingen die passen bij deze specifieke toepassing.) Deze uitvoer wordt bepaald door de waarde van de variabele "send_human" die een lijst met vijf elementen bevat. De eerste twee elementen zijn een gemiddelde interwedstijd van tekens in seconden. De eerste wordt standaard gebruikt. De tweede wordt gebruikt bij woorduitgangen, om de subtiele pauzes na te bootsen die bij dergelijke overgangen soms voorkomen. De derde parameter is een maat voor de variabiliteit waarbij .1 vrij variabel is, 1 redelijk variabel en 10 vrij onveranderlijk. De extremen zijn 0 tot oneindig. De laatste twee parameters zijn respectievelijk een minimale en maximale intervergival-tijd. Het minimum en maximum worden als laatste gebruikt en "laatste" clip. Het uiteindelijke gemiddelde kan behoorlijk afwijken van het gegeven gemiddelde als de minimum- en maximumwaarde voldoende zijn.
Als voorbeeld emuleert het volgende commando een snelle en consistente typist:
set send_human {.1 .3 1 .05 2} send -h "Ik heb honger, laten we lunchen."
terwijl het volgende misschien meer geschikt is na een kater:
set send_human {.4 .4 .2 .5 100} send -h "Goodr party lash night!"
Let op: fouten worden niet gesimuleerd, hoewel je zelf foutcorrectiesituaties kunt instellen door fouten en correcties in een verzendargument in te bedden.
De vlaggen voor het verzenden van lege tekens, voor het verzenden van pauzes, voor het forceren van trage uitvoer en voor uitvoer in menselijke stijl sluiten elkaar uit. Alleen degene die als laatste is opgegeven, wordt gebruikt. Verder geen draad argument kan worden opgegeven met de vlaggen voor het verzenden van ongeldige tekens of onderbrekingen.
Het is een goed idee om aan de eerste vooraf te gaansturen naar een proces van eenverwachten. verwachten zal wachten tot het proces begint, terwijlsturen kan niet. In het bijzonder, als de eerstesturen voltooid voordat het proces begint te lopen, loopt u het risico dat uw gegevens worden genegeerd. In situaties waarin interactieve programma's geen initiële prompt bieden, kunt u hieraan voorafgaansturen door een vertraging zoals in:
# Om te voorkomen dat hackers hints krijgen over inbraak, # vraagt dit systeem niet om een extern wachtwoord. # Wacht 5 seconden voor exec om spawn telnet te voltooien very.secure.gov slaap 5 stuur wachtwoord r
exp_send is een alias voor sturen. Als u Expectk of een andere variant van Expect in de Tk-omgeving gebruikt,sturen wordt door Tk gedefinieerd voor een heel ander doel.exp_send is bedoeld voor compatibiliteit tussen omgevingen. Vergelijkbare aliassen zijn beschikbaar voor de andere verzendopdrachten van andere Expect's.
send_error -lages string
is alssturen , behalve dat de uitvoer naar stderr wordt verzonden in plaats van het huidige proces.
send_log - string
is alssturen , behalve dat de tekenreeks alleen naar het logbestand wordt verzonden (zielog_file .) De argumenten worden genegeerd als er geen logbestand geopend is.
send_tty -flags string
is alssturen , behalve dat de uitvoer naar / dev / tty wordt verzonden in plaats van het huidige proces.
send_user -lages string
is alssturen , behalve dat de uitvoer naar stdout wordt verzonden in plaats van het huidige proces.
slaap seconden
zorgt ervoor dat het script gedurende het opgegeven aantal seconden slaapt. Seconden kunnen een decimaal getal zijn. Onderbrekingen (en Tk-gebeurtenissen als u Expectk gebruikt) worden verwerkt terwijl u Verwacht slaapt.
spawn args -programma args
maakt een nieuw proces aan "programma args ". Zijn stdin, stdout en stderr zijn verbonden met Expect, zodat ze kunnen worden gelezen en geschreven door andereVerwachten commando's. De verbinding is verbroken doordichtbij of als het proces zelf een van de bestands-ID's sluit.
Wanneer een proces is gestart doorpaaien , de variabele spawn_id is ingesteld op een descriptor die verwijst naar dat proces. Het proces beschreven door spawn_id wordt beschouwd als de "stroom werkwijze" . spawn_id kan worden gelezen of geschreven, waardoor de taak wordt beheerst.
user_spawn_id is een globale variabele die een descriptor bevat die verwijst naar de gebruiker. Bijvoorbeeld wanneer spawn_id is ingesteld op deze waarde,verwachten gedraagt zich alsexpect_user .
.IK error_spawn_id is een globale variabele die een descriptor bevat die verwijst naar de standaardfout. Bijvoorbeeld wanneer spawn_id is ingesteld op deze waarde,sturen gedraagt zich alssend_error .
tty_spawn_id is een globale variabele die een descriptor bevat die verwijst naar / dev / tty. Als / dev / tty niet bestaat (zoals in een cron-, at- of batch-script), dan tty_spawn_id is niet gedefinieerd. Dit kan worden getest als:
als {info vars tty_spawn_id} {# / dev / tty exists} else {# / dev / tty niet bestaat # waarschijnlijk in cron, batch of script}
paaien geeft het UNIX-proces-ID als resultaat. Als er geen proces wordt gestart, wordt 0 geretourneerd. De variabele spawn_out (slave, naam) is ingesteld op de naam van het pty-slave-apparaat.
Standaard,paaien echo's van de opdrachtnaam en argumenten. De-noecho vlag stoptpaaien van dit te doen.
De-troosten flag zorgt ervoor dat de console-uitvoer wordt omgeleid naar het spawn-proces. Dit wordt niet op alle systemen ondersteund.
internpaaien gebruikt een pty, geïnitialiseerd op dezelfde manier als de tty van de gebruiker. Dit wordt verder geïnitialiseerd zodat alle instellingen "




