Die Linux / Unix opdrag verwag

Verwag is 'n program wat volgens 'n skrif met ander interaktiewe programme gesels. Na aanleiding van die skrif, Verwag weet wat van 'n program verwag kan word en wat die regte antwoord moet wees. 'N Vertolkte taal bied vertakking en hoëvlakbeheerstrukture om die dialoog te lei. Daarbenewens kan die gebruiker beheer neem en direk met mekaar kommunikeer wanneer dit verlang word, en daarna beheer oor die skrif.

Expectk is 'n mengsel van Verwagting en Tk. Dit tree op soos verwag en verwag van Tk. Verwag kan ook direk in C of C ++ gebruik word sonder Tcl.

Die naam "Verwag" kom van die idee van stuur / verwag reekse wat deur uucp, kermit en ander modem beheerprogramme gewild is. In teenstelling met uucp, is Verwagting egter veralgemeen sodat dit as 'n gebruikersvlakopdrag kan loop met enige program en taak in gedagte. Verwag kan op dieselfde tyd met verskeie programme praat.

Wat verwag kan doen

Byvoorbeeld, hier is 'n paar dinge wat die verwagte bevel kan doen:

Daar is verskeie redes waarom die dop nie hierdie take kan verrig nie. Al is moontlik met Verwag.

Oor die algemeen is verwag dat dit nuttig is vir die uitvoer van enige program wat interaksie tussen die program en die gebruiker vereis. Al wat nodig is, is dat die interaksie programmaties gekenmerk kan word. Verwag kan ook terugbeheer aan die gebruiker gee sonder om die program te beheer wat beheer word. Net so kan die gebruiker op enige stadium beheer oor die script kry.

gebruik

Verwag lees cmdfile vir 'n lys van opdragte om uit te voer. Verwag kan implisiet aangewend word op stelsels wat die #! notasie deur die skrif as uitvoerbaar te merk en die eerste reël in die skrif te maak:

#! / usr / local / bin / expect -f

Natuurlik moet die pad akkuraat beskryf waar lewens verwag. / usr / local / bin is net 'n voorbeeld.

Die -c vlag prefaces 'n opdrag wat uitgevoer moet word voor enige in die script. Die opdrag moet aangehaal word om te voorkom dat dit deur die dop gebreek word. Hierdie opsie kan verskeie kere gebruik word. Meervoudige opdragte kan met 'n enkele -c uitgevoer word deur hulle met semikolonse te skei. Opdragte word uitgevoer in die volgorde wat hulle verskyn. As u Expectk gebruik, word hierdie opsie as -kommando gespesifiseer.

Die -d-vlag maak 'n paar diagnostiese uitvoer moontlik, wat hoofsaaklik interne aktiwiteit van opdragte soos verwag en interaksie rapporteer. Hierdie vlag het dieselfde effek as "exp_internal 1" aan die begin van 'n verwagte skrip, plus die weergawe van Verwagting is gedruk.

Die -D vlag stel 'n interaktiewe debugger in staat. 'N Heelgetal moet volg. Die debugger sal beheer neem voor die volgende Tcl prosedure as die waarde nie nul is nie of as 'n ^ C gedruk word of 'n breekpunt getref word, of 'n ander toepaslike debugger-opdrag in die skrip verskyn. As u Expectk gebruik, word hierdie opsie gespesifiseer as - Ontfout.

Die -f vlag prefaces 'n lêer om kommando's te lees. Die vlag self is opsioneel aangesien dit slegs nuttig is wanneer die #! notasie, sodat ander argumente op die bevellyn verskaf kan word. As u Expectk gebruik, word hierdie opsie as -file gespesifiseer.

By verstek word die opdraglêer in geheue ingevoer en in sy geheel uitgevoer. Dit is af en toe wenslik om lêers een reël op 'n slag te lees. Om te dwing om arbitrêre lêers op hierdie manier hanteer te word, gebruik die -b-vlag. As u Expectk gebruik, word hierdie opsie as buffer verskaf.

As die string "-" as 'n lêernaam verskaf word, word standaardinvoer in plaas daarvan gelees. Gebruik "./-" om te lees uit 'n lêer wat eintlik die naam "-" genoem word.

Die -i-vlag veroorsaak Verwagting om interaktief te vra vir opdragte in plaas daarvan om dit vanaf 'n lêer te lees. Prompting word beëindig via die uitgangsbevel of op EOF. Die -i vlag word aanvaar indien nie 'n bevellêer of -c gebruik word nie. As u Expectk gebruik, word hierdie opsie as -interaktief gespesifiseer.

- kan gebruik word om die einde van die opsies te beperk. Dit is handig as u 'n opsie-agtige argument vir u skrif wil slaag sonder dat dit deur Verwagting vertolk word. Dit kan nuttig geplaas word in die #! lyn om te verhoed dat enige vlagagtige interpretasie verwag word. Byvoorbeeld, die volgende sal die oorspronklike argumente verlaat, insluitende die skrifnaam in die veranderlike argv .

#! / usr / local / bin / expect -

Let daarop dat die gewone getopt (3) en execve (2) konvensies waargeneem moet word wanneer argumente by die #! lyn.

Die lêer $ exp_library / expect.rc word outomaties verkry indien dit teenwoordig is, tensy die -N-vlag gebruik word. (By die gebruik van Expectk word hierdie opsie as -NORC aangedui.) Onmiddellik daarna word die lêer ~ / .expect.rc outomaties verkry, tensy die -n vlag gebruik word. As die omgewingsveranderlike DOTDIR gedefinieer is, word dit as 'n gids behandel en word .expect.rc van daar af gelees. As u Expectk gebruik, word hierdie opsie as -norc gespesifiseer. Hierdie verkryging vind eers plaas nadat enige -c-vlae uitgevoer is.

-V veroorsaak dat sy weergawe nommer druk en uitstuur. Die ooreenstemmende vlag in Expectk, wat lang vlag name gebruik, is -versie.

Opsionele args word in 'n lys saamgestel en gestoor in die veranderlike genaamd argv en. Argc is geïnitialiseer tot die lengte van argv.

Argv0 is gedefinieer as die naam van die skrif of binêre as geen skrif gebruik word nie. Byvoorbeeld, die volgende druk die naam van die skrif en die eerste drie argumente uit:

send_user "$ argv0 [lrange $ argv 0 2] \ n"

opdragte

Verwag gebruike Tool Command Language. Tcl bied beheervloei (indien, vir, breek), uitdrukkingevaluering en verskeie ander funksies, soos rekursie en prosedure definisie. Opdragte wat hier gebruik word, maar nie gedefinieer nie (stel, indien, exec) is Tcl opdragte. Verwag ondersteun bykomende opdragte. Tensy anders gespesifiseer, gee opdragte die leë string terug.

Opdragte word alfabeties gelys sodat hulle vinnig opgespoor kan word. Nuwe gebruikers kan dit egter makliker vind om te begin deur die beskrywings van spawn te lees, te stuur, te verwag en te wissel in daardie volgorde.

sluit [-slave] [-onexec 0 | 1] [-i spawn_id]

sluit die verbinding met die huidige proses . Die meeste interaktiewe programme sal die EOF op hul staking en uittrede opspoor; So naby is dit gewoonlik genoeg om die proses ook dood te maak. Die -i-vlag verklaar die proses om te sluit wat ooreenstem met die genoemde spawn_id.

Beide verwag en interaksie sal opspoor wanneer die huidige proses verlaat en implisiet 'n einde maak, maar as jy die proses doodmaak deur te sê, "exec kill $ pid", moet jy eksplisiet naby bel .

Die -onexec-vlag bepaal of die spawn-id in enige nuwe geprojekteerde prosesse gesluit is of as die proses oorlaai word. Om 'n kuit-id oop te maak, gebruik die waarde 0. 'n Nie-nul-heelgetal waarde dwing die kuit gesluit in enige nuwe prosesse.

Die -slave-vlag sluit die slaaf wat verband hou met die spawn-ID. Wanneer die verbinding gesluit is, word die slaaf outomaties gesluit as dit nog oop is.

Maak nie saak of die verbinding implisiet of eksplisiet gesluit is nie, dan moet jy wag om die ooreenstemmende kernprosesreeks op te klaar. Die geslote opdrag skakel nie wag nie, aangesien daar geen waarborg is dat die sluiting van 'n prosesverbinding sal veroorsaak dat dit verlaat nie.

ontfout [[-now] 0 | 1]

beheer 'n Tcl debugger wat jou toelaat om stellings deur te voer en breekpunte te stel.

Met geen argumente word 'n 1 teruggestuur as die debugger nie loop nie, anders word 'n 0 teruggegee.

Met 'n 1 argument word die debugger begin. Met 'n 0-argument word die debugger gestop. As 'n 1 argument voorafgegaan word deur die -nou vlag, word die debugger onmiddellik begin. Andersins word die debugger begin met die volgende Tcl-stelling.

Die debug-opdrag verander geen valle nie. Vergelyk dit met die begin verwag met die -D vlag.

Die ontkoppelopdrag verbreek 'n vurkproses vanaf die terminale . Dit gaan voort op die agtergrond. Die proses word sy eie prosesgroep gegee. Standaard I / O word aangestuur na / dev / null .

Die volgende fragment gebruik ontkoppel om die skrip op die agtergrond te laat loop.

as {[vurk]! = 0} sluit ontkoppel. . .

Die volgende skrif lees 'n wagwoord en hardloop dan 'n program elke uur wat elke keer 'n wagwoord vereis. Die skrif verskaf die wagwoord sodat jy dit net een keer moet tik.

send_user "password? \" expect_user -re "(. *) \ n" vir {} 1 {} {if {[fork]! = 0} {slaap 3600; voortgaan} ontkoppel spawn priv_prog verwag Wagwoord: stuur "$ expect_out 1, string) \ r ". . . uitgang}

'N Voordeel om die verbinding tussen die asynkroonprosesfunksie (&) van die dop te gebruik, is dat Verwag die terminaal parameters kan stoor voordat dit afgeskakel word, en dan later op nuwe ptys toe te pas. Met &, Expect het nie die geleentheid om die terminale se parameters te lees nie, aangesien die terminaal reeds ontkoppel is teen die tyd wat verwag word, ontvang beheer.

uitgang [-opts] [status]

veroorsaak Verwagting om uit te gaan of andersins voor te berei om dit te doen.

Die -onexit- vlag veroorsaak dat die volgende argument gebruik word as 'n uittreksel. Sonder 'n argument word die huidige uittrekselaar terugbesorg.

Die -noexit vlag veroorsaak dat verwag om voor te berei om te verlaat, maar stop kort van eintlik terugkeer beheer na die bedryfstelsel. Die gebruiker-gedefinieerde uittrekselaar word sowel as verwag se eie interne hanteerders uitgevoer. Geen verdere verwag dat opdragte uitgevoer moet word nie. Dit is handig as jy verwag Verwag met ander Tcl-uitbreidings. Die huidige tolk (en hoof venster as in die Tk omgewing) bly so dat ander Tcl uitbreidings kan opruim. As Expect se uitgang weer genoem word (hoe dit ook al mag voorkom), word die hanteerders nie herhaling nie.

By die verlaat word alle verbindings met geproeide prosesse gesluit. Sluiting sal opgespoor word as 'n EOF deur geprojekteerde prosesse. Uittreksel neem geen ander aksies as wat die normale _exit (2) prosedure doen nie. Dus, produseer prosesse wat nie vir EDF kyk nie, kan voortgaan om te hardloop. ('N Verskeidenheid toestande is belangrik om byvoorbeeld te bepaal watter seine 'n geproede proses sal gestuur word, maar dit is stelselafhanklik, tipies gedokumenteer onder uitgang (3).) Gekruide prosesse wat voortgaan om te hardloop, sal geërf word deur init.

status (of 0 indien nie gespesifiseer nie) word teruggestuur as die uitgangstatus van Verwag . Uittreksel word implisiet uitgevoer as die einde van die skrif bereik is.

exp_continue [-continue_timer]
Die opdrag exp_continue laat hom toe om voort te gaan uitvoer eerder as om terug te keer soos dit normaalweg sou wees. By verstek herstel exp_continue die time-out timer. Die -continue_timer- vlag voorkom dat die timer herbegin word. (Sien verwag vir meer inligting.)

exp_internal [-f file] waarde
veroorsaak verdere instruksies om diagnostiese inligting intern te stuur om te verwag dat stderr as die waarde nie nul is nie. Hierdie uitset is gedeaktiveer as die waarde 0 is. Die diagnostiese inligting sluit elke karakter wat ontvang word in, en elke poging aangewend om die huidige uitset teen die patrone te pas.

As die opsionele lêer verskaf word, word alle normale en debugging-uitvoer na daardie lêer geskryf (ongeag die waarde van die waarde ). Enige vorige diagnostiese uitvoer lêer is gesluit.

Die -info- vlag veroorsaak dat 'n beskrywing van die mees onlangse nie-inligtingsargumente gegee word.

exp_open [args] [-i spawn_id]
gee 'n Tcl lêer identifiseerder wat ooreenstem met die oorspronklike spawn id. Die lêer identifiseerder kan dan gebruik word asof dit oopgemaak is deur Tcl se oop opdrag. (Die kuit ID moet nie meer gebruik word nie. 'N Wag moet nie uitgevoer word nie.

Die vlag- oop vlag laat die kuit ID oop vir toegang deur Verwag opdragte. 'N Wag moet op die spawn-id uitgevoer word.

exp_pid [-i spawn_id]
gee die proses ID terug wat ooreenstem met die proses wat tans ontstaan ​​het. As die -i- vlag gebruik word, kom die pid terug wat ooreenstem met dié van die gegewe spawn-id.

exp_send
is 'n alias vir stuur .

exp_send_error
is 'n alias vir send_error .

exp_send_log
is 'n alias vir send_log .

exp_send_tty
is 'n alias vir send_tty .

exp_send_user
is 'n alias vir send_user .

exp_version [[-exit] weergawe]
is nuttig om te verseker dat die skrif verenigbaar is met die huidige weergawe van Verwagting.

Met geen argumente word die huidige weergawe van Verwagting terugbesorg nie. Hierdie weergawe kan dan in u skrif gekodeer word. As u eintlik weet dat u nie funksies van onlangse weergawes gebruik nie, kan u 'n vorige weergawe spesifiseer.

Versies bestaan ​​uit drie getalle geskei deur kolletjies. Eerstens is die hoofgetal. Skripte wat geskryf is vir weergawes van verwag met 'n ander hoofnommer sal byna seker nie werk nie. exp_version gee 'n fout as die hoofgetalle nie ooreenstem nie.

Die tweede is die geringe getal. Skripte wat geskryf is vir 'n weergawe met 'n groter klein getal as die huidige weergawe, kan van 'n nuwe funksie afhang en mag nie hardloop nie. exp_version gee 'n fout as die hoofgetalle ooreenstem, maar die skrifgeringe getal is groter as dié van die hardloop verwag .

Derde is 'n nommer wat geen deel in die weergawe vergelyking speel nie. Dit word egter toegeneem wanneer die verspreiding van die sagtewareagteware op enige manier verander word, soos deur addisionele dokumentasie of optimalisering. Dit word gereset op 0 op elke nuwe klein weergawe.

Met die -exit vlag, Verwag afdrukke 'n fout en uitgange as die weergawe verouderd is.

verwag [[-opts] pat1 body1] ... [-opts] patn [bodyn]
wag totdat een van die patrone ooreenstem met die uitset van 'n geproeide proses, 'n bepaalde tydperk is verby, of 'n einde van die lêer word gesien. As die finale liggaam leeg is, mag dit weggelaat word.

Patrone van die mees onlangse expect_before- opdrag word implisiet voor enige ander patrone gebruik. Patrone van die mees onlangse expect_after- opdrag word implisiet gebruik na enige ander patrone.

As die argumente vir die hele verwagte stelling meer as een reël benodig, kan al die argumente in een ingedruk word om te voorkom dat elke lyn met 'n terugslag gesluit word. In hierdie een geval sal die gewone Tcl vervangings plaasvind ten spyte van die hakies.

As 'n patroon die sleutelwoord is, word die ooreenstemmende liggaam uitgevoer op die einde van die lêer. As 'n patroon die sleutelwoord- termyn is , word die ooreenstemmende liggaam uitgevoer by die tydsduur. As daar geen time-out sleutelwoord gebruik word nie, word 'n implisiete nul-aksie uitgevoer by die tydsduur. Die standaard time-out tydperk is 10 sekondes, maar kan ingestel word, byvoorbeeld tot 30, met die opdrag "set timeout 30". 'N Oneindige time-out kan aangewys word met die waarde -1. As 'n patroon die sleutelwoordverstek is, word die ooreenstemmende liggaam uitgevoer op die tydstip of einde van die lêer.

As 'n patroon pas, dan word die ooreenstemmende liggaam uitgevoer. verwag opbrengste die resultaat van die liggaam (of die leë tou indien geen patroon ooreenstem nie). In die geval dat verskeie patrone pas, word die een wat eerste voorkom, gebruik om 'n liggaam te kies.

Elke keer as die nuwe uitset aankom, word dit vergelyk met elke patroon in die volgorde wat hulle gelys word. So, jy kan toets vir die afwesigheid van 'n wedstryd deur die laaste patroon iets gewaarborg te laat verskyn, soos 'n spoed. In situasies waar daar geen spoed is nie, moet jy die tydsduur gebruik (net soos jy wil as jy handmatig met mekaar inwerk).

Patrone word op drie maniere gespesifiseer. Standaard word patrone gespesifiseer soos met Tcl se string-wedstrydopdrag . (Sulke patrone is ook soortgelyk aan C-dop gereelde uitdrukkings, gewoonlik na verwys as "glob" -patrone). Die -gl vlag mag gebruik word om patrone te beskerm wat andersins ooreenstem met verwagte vlae om dit te doen. Enige patroon wat met 'n "-" begin, moet op hierdie manier beskerm word. (Alle snare wat begin met "-" word gereserveer vir toekomstige opsies.)

Byvoorbeeld, die volgende fragment soek na 'n suksesvolle aanmelding. (Let daarop dat afskaffing vermoed word dat dit 'n prosedure is wat elders in die skrif gedefinieer word.)

verwag (besig (sit besig \ n; exp_continue} misluk onderbreek "ongeldige wagwoord" abort time-out abort verbind)

Kwotasies is nodig op die vierde patroon aangesien dit 'n spasie bevat, wat die patroon van die aksie anders sou skei. Patrone met dieselfde optrede (soos die 3de en 4de) vereis weer die aksies. Dit kan vermy word deur regexp-stylpatrone te gebruik (sien hieronder). Meer inligting oor die vorming van wêreldstylpatrone kan gevind word in die Tcl-handleiding.

Regexp-stylpatrone volg die sintaksis gedefinieer deur Tcl se regexp (kort vir "gewone uitdrukking") opdrag. regexp patrone word bekendgestel met die vlag -re . Die vorige voorbeeld kan herskryf word deur 'n regexp as:

verwag (besig (sit besig \ n; exp_continue} -re "misluk | ongeldige wagwoord" abort time-out abort verbind)

Beide tipes patrone is "unanchored". Dit beteken dat patrone nie die hele string moet ooreenstem nie, maar kan die wedstryd enige plek in die tou begin en eindig (solank as wat al die ander ooreenstem). Gebruik ^ om die begin van 'n string te pas en $ om die einde te pas. Let daarop dat as u nie op die einde van 'n tou wag nie, u antwoorde maklik in die middel van die tou kan eindig, aangesien hulle van die geprojekteerde proses afkom. Terwyl die korrekte resultate nog steeds geproduseer word, kan die uitset onnatuurlik lyk. So word die gebruik van $ aangemoedig as jy die karakters presies kan beskryf aan die einde van 'n tou.

Let daarop dat in baie redakteurs die ^ en $ ooreenstem met die begin en einde van die lyne. Aangesien verwag egter nie lyngeoriënteerd is nie, stem hierdie karakters ooreen met die begin en einde van die data (in teenstelling met lyne) wat tans in die verwagte buffergrootte is. (Sien ook die aantekening hieronder oor "stelsel spysvertering.")

Die -ex vlag veroorsaak dat die patroon ooreenstem met 'n "presiese" string. Geen interpretasie van *, ^, ens is gemaak nie (alhoewel die gewone Tcl konvensies nog nagekom moet word). Presiese patrone is altyd unanchored.

Die -nocase- vlag veroorsaak dat hoofletters van die uitset vergelyk word asof hulle kleinletters bevat. Die patroon word nie beïnvloed nie.

Tydens die lees van uitvoer, kan meer as 2000 grepe vroeër grepe dwing om "vergete" te word. Dit kan verander word met die funksie match_max . (Let daarop dat buitensporige groot waardes die patroonpasser kan vertraag.) As patlist vol_buffer is, word die ooreenstemmende liggaam uitgevoer as match_max grepe ontvang is en geen ander patrone pas nie. Of die sleutelwoord full_buffer al dan nie gebruik word, word die vergete karakters geskryf om te verwag_out (buffer).

As patlist die sleutelwoord nul is , en nuls word toegelaat (via die delete_nulls- opdrag), word die ooreenstemmende liggaam uitgevoer as 'n enkele ASCII 0 ooreenstem. Dit is nie moontlik om 0 grepe deur glob of regexp patrone te pas nie.

As 'n patroon (of eof of full_buffer) ooreenstem, word enige ooreenstemmende en voorheen ongeëwenaarde uitset in die veranderlike expect_out (buffer) gestoor. Tot 9 regexp substring-wedstryde word gestoor in die veranderlikes expect_out (1, string) deur expect_out (9, string) . As die -indices- vlag voor 'n patroon gebruik word, word die begin- en eindindekse (in 'n vorm geskik vir lrange ) van die 10 stringe gestoor in die veranderlikes expect_out (X, begin) en expect_out (X, end) waar X 'n syfer, stem ooreen met die substring posisie in die buffer. 0 verwys na snare wat ooreenstem met die hele patroon en word gegenereer vir glob patrone sowel as regexp patrone. Byvoorbeeld, as 'n proses uitset van "abcdefgh \ n" geproduseer het, is die resultaat van:

verwag 'cd'

is asof die volgende stellings uitgevoer is:

stel expect_out (0, string) CD stel expect_out (buffer) abcd

en "efgh \ n" word in die uitvoerbuffer oorgebly. As 'n proses die uitset "abbbcabkkkka \ n" geproduseer het, is die resultaat van:

verwag -indices -re "b (b *). * (k +)"

is asof die volgende stellings uitgevoer is:

stel verwag_out (0, begin) 1 stel expect_out (0, einde) 10 stel expect_out (0, string) bbbcabkkkk stel expect_out (1, begin) 2 stel expect_out (1, einde) 3 stel expect_out (1, string) bb stel expect_out (2, begin) 10 stel expect_out (2, einde) 10 stel expect_out (2, string) k stel expect_out (buffer) abbbcabkkkk

en 'n \ n "word in die uitvoerbuffer oorgebly. Die patroon "*" (en -re ". *") Sal die uitvoerbuffer spoel sonder om enige uitset van die proses te lees.

Gewoonlik word die ooreenstemmende uitset weggegooi van Expect se interne buffers. Dit kan voorkom word deur 'n patroon met 'n -notransfer- vlag te voorskryf . Hierdie vlag is veral nuttig om te eksperimenteer (en kan afgekort word vir 'n gemak terwyl dit eksperimenteer).

Die kuit ID wat verband hou met die ooreenstemmende uitset (of eof of full_buffer) word in expect_out (spawn_id) gestoor.

Die- timeout- vlag veroorsaak dat die huidige verwagte bevel die volgende waarde as 'n time-out gebruik, in plaas van die waarde van die time-out-veranderlike te gebruik.

Standaard word patrone ooreenstem met uitset van die huidige proses, maar die -i vlag verklaar dat die uitset van die genoemde spawn_id-lys ooreenstem met enige volgende patrone (tot die volgende -i ). Die spawn_id-lys moet óf 'n geskeide lys van spawn_ids of 'n veranderlike wees wat verwys na so 'n lys spawn_ids.

Byvoorbeeld, die volgende voorbeeld wag vir "gekoppel" van die huidige proses, of "besig", "misluk" of "ongeldig wagwoord" van die spawn_id met die naam $ proc2.

verwag dat {-i $ proc2 besig is (sit besig \ n; exp_continue} -re "misluk | ongeldige wagwoord" abort time-out abort verbind)

Die waarde van die globale veranderlike any_spawn_id kan gebruik word om patrone te pas by enige spawnids wat met alle ander -i- vlae in die huidige verwagte opdrag genoem word. Die spawnid van 'n -i vlag met geen gepaardgaande patroon nie (dws onmiddellik gevolg deur 'n ander -i ) word beskikbaar gestel vir enige ander patrone in dieselfde verwagte opdrag wat met any_spawn_id geassosieer word .

Die -i- vlag kan ook 'n globale veranderlike noem, in welke geval die veranderlike vir 'n lys van kuit-ids gelees word. Die veranderlike is herlees wanneer dit verander. Dit bied 'n manier om die I / O-bron te verander terwyl die bevel in uitvoering is. Kospakkies wat op hierdie manier voorsien word, word 'indirekte' kuit ids genoem.

Aksies soos breek en voortgaan veroorsaak dat beheerstrukture (dws vir , proc ) op die gewone manier optree. Die opdrag exp_continue laat hom toe om voort te gaan uitvoer eerder as om terug te keer soos dit normaalweg sou wees.

Dit is handig om eksplisiete loops of herhaalde verwagte stellings te vermy. Die volgende voorbeeld is deel van 'n fragment om rlogin te outomatiseer. Die exp_continue vermy om 'n tweede verwagte verklaring te skryf (om weer die spoed te soek) as die rlogin 'n wagwoord vra.

verwag (wagwoord: {stewig-stuur stuur gebruiker 'wagwoord (vir $ gebruiker) op $ gasheer: "expect_user -re" (. *) \ n "send_user" \ n "stuur" $ expect_out (1 string) echo exp_continue} verkeerd {send_user \ "konneksie na gasheer misluk: $ expect_out (buffer)" exit "- re $ prompt}

Byvoorbeeld, die volgende fragment kan 'n gebruikersgids help om 'n interaksie wat alreeds outomaties is. In hierdie geval word die terminaal in rou modus ingeplaas. As die gebruiker "+" druk, word 'n veranderlike verhoog. As "p" gedruk word, word verskeie opbrengste na die proses gestuur, miskien om dit op een of ander manier te poke, en "ek" laat die gebruiker in wisselwerking met die proses en beheer effektief van die skrif af. In elk geval laat die exp_continue toe dat die huidige verwag patroonpatroon sal voortgaan nadat die huidige aksie uitgevoer is.

stert rou -echo verwag_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "stop" afrit}

By verstek herstel exp_continue die time-out timer. Die timer word nie weer aangeskakel nie, as exp_continue word genoem met die -continue_timer vlag.

expect_after [expect_args]
werk identies aan die expect_before behalwe dat as patrone van beide verwag en verwagte kan ooreenstem, word die verwagte patroon gebruik. Sien die expect_before opdrag vir meer inligting.

expect_background [expect_args]
neem dieselfde argumente as verwag , maar dit kom onmiddellik terug. Patrone word getoets wanneer nuwe insette kom. Die patroon time-out en standaard is betekenisloos om te verwag_background en word stilweg weggegooi. Andersins, gebruik die expect_background- bevel expect_before en expect_after patrone soos wat verwag word.

Wanneer expect_background- aksies geëvalueer word, word agtergrondverwerking vir dieselfde kuit-ID geblokkeer. Agtergrondverwerking word oopgesluit wanneer die aksie voltooi word. Terwyl agtergrondverwerking geblokkeer word, is dit moontlik om 'n (voorgrond) te verwag op dieselfde proef id.

Dit is nie moontlik om 'n verwagting uit te voer terwyl 'n expect_background oopgesluit word nie. expect_background vir 'n spesifieke kuit-id word uitgevee deur 'n nuwe expect_background met dieselfde kuit-ID te verklaar. Verklarende expect_background met geen patroon verwyder die gegewe spawn id van die vermoë om patrone in die agtergrond te pas.

expect_before [expect_args]
neem dieselfde argumente as verwag , maar dit kom onmiddellik terug. Patroon-aksie pare uit die mees onlangse expect_before met dieselfde kuit ID word implisiet bygevoeg aan enige volgende verwagte opdragte. As 'n patroon pas, word dit behandel asof dit in die verwagte bevel self gespesifiseer is en die geassosieerde liggaam uitgevoer word in die konteks van die verwagte bevel. As patrone van beide expect_before en verwag kan ooreenstem, word die expect_before- patroon gebruik.

As geen patroon gespesifiseer is nie, word die spawn id nie vir enige patrone nagegaan nie.

Tensy dit deur 'n -i- vlag oortree word, verwag patrone voordat dit aangepas is op die tyd wat die expect_before- bevel uitgevoer is (nie wanneer die patroon ooreenstem nie).

Die -info-vlag veroorsaak dat die huidige spesifikasies van watter patrone dit sal ooreenstem, terugbesorg. Standaard word dit aangemeld oor die huidige spawn-ID. 'N opsionele kuit ID spesifikasie kan gegee word vir inligting oor die kuit ID. Byvoorbeeld

expect_before-info -i $ proc

Hoogstens kan een spesifikasie vir kuitidentifikasie gegee word. Die vlag onderdruk direkte direkte kuitgedeeltes wat slegs van indirekte spesifikasies kom.

In plaas van 'n kuit ID-spesifikasie, sal die vlag "-all" veroorsaak dat "-info" op alle kuitidee verslag doen.

Die uitset van die -info vlag kan hergebruik word as die argument om te verwag.

expect_tty [expect_args]
is soos verwag, maar dit lees karakters uit / dev / tty (dws toetsaanslagen van die gebruiker). By verstek word lees in gekookte modus uitgevoer. Dus, lyne moet eindig met 'n opgawe om te verwag om dit te sien. Dit kan via stty verander word (sien die stty bevel hieronder).

expect_user [expect_args]
is soos verwag, maar dit lees karakters van stdin (dws toetsaanslagen van die gebruiker). By verstek word lees in gekookte modus uitgevoer. Dus, lyne moet eindig met 'n opgawe om te verwag om dit te sien. Dit kan via stty verander word (sien die stty bevel hieronder).

vurk
skep 'n nuwe proses . Die nuwe proses is 'n presiese afskrif van die huidige verwagtingsproses . Na sukses, gee vurk 0 na die nuwe (kind) proses terug en gee die proses- ID van die kindproses terug na die ouerproses. By mislukking (altyd as gevolg van gebrek aan hulpbronne, bv. Ruilspasie, geheue), gee vurk -1 na die ouerproses terug en word geen kindproses geskep nie.

Verkeerde prosesse verlaat via die uitgangsbevel , net soos die oorspronklike proses . Vurk prosesse word toegelaat om aan die loglêers te skryf. As u nie die ontbinding of deaktivering van die meeste prosesse deaktiveer nie, kan die resultaat verwarrend wees.

Sommige implementerings kan deur verskeie lesers en skrywers verwar word, selfs kortliks. Dus, dit is veiligste om te vurk voor spuitprosesse.

interaksie [string1 body1] ... [stringn [bodyn]]
gee beheer oor die huidige proses aan die gebruiker, sodat toetsaanslagen na die huidige proses gestuur word , en die stdout en stderr van die huidige proses word teruggestuur.

Stringliggaampies kan as argumente gespesifiseer word, in welke geval die liggaam uitgevoer word wanneer die ooreenstemmende string ingevoer word. (Standaard word die string nie na die huidige proses gestuur nie .) Die tolkbevel word aanvaar as die finale liggaam ontbreek.

As die argumente vir die hele interaktiewe stelling meer as een reël benodig, kan al die argumente "in 'n" ingedruk word "om te voorkom dat elke lyn met 'n terugslag gesluit word. In hierdie een geval sal die gewone Tcl vervangings plaasvind ten spyte van die hakies.

Byvoorbeeld, die volgende opdrag lopies interaksie met die volgende string-liggaamspare gedefinieer: Wanneer ^ Z gedruk word, is Verwag geskors. (Die reset- vlag herstel die terminaalmodus.) Wanneer ^ A gedruk word, sien die gebruiker "jy het 'n beheer-A getik en die proses is 'n ^ A gestuur. Wanneer $ gedruk word, sien die gebruiker die datum. Wanneer ^ C gedruk word, Verwag uitgange. As "foo" ingevoer word, sien die gebruiker "bar". Wanneer ~ ~ gedruk word, loop die verwagtende tolk interaktief.

stel CTRLZ \ 032 in wisselwerking met {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "jy het 'n beheer-A \ n"; stuur "\ 001"} $ {send_user "Die datum is [klok formaat [klok sekondes]]."} \ 003 afrit foo {send_user "bar"} ~~}

In string-liggame word stringe ooreenstem met die volgorde wat hulle as argumente genoem word. Strings wat gedeeltelik ooreenstem, word nie na die huidige proses gestuur nie in afwagting van die res wat kom. As karakters dan ingeskryf word sodat daar nie meer 'n wedstryd is nie, word slegs die deel van die tou gestuur na die proses wat nie moontlik 'n ander wedstryd kan begin nie. Dus, snare wat substrings van gedeeltelike ooreenkomste is, kan later ooreenstem, as die oorspronklike snare wat gepoog het om ooreen te kom, uiteindelik misluk.

Standaard is die toonsoort ooreenstem met geen wildkaarte nie . (In teenstelling hiermee gebruik die verwagte bevel standaard- patroonpatrone .) Die -ex- vlag kan gebruik word om patrone te beskerm wat andersins interaksievlae ooreenstem met dit. Enige patroon wat met 'n "-" begin, moet op hierdie manier beskerm word. (Alle snare wat begin met "-" word gereserveer vir toekomstige opsies.)

Die -e- vlag dwing die string om as 'n regexp-stylpatroon geïnterpreteer te word. In hierdie geval word ooreenstemmende substrings gestoor in die veranderlike interaksie, op dieselfde manier as wat die verwagte voorraad sy uitset in die veranderlike expect_out stoor . Die -indices vlag word ook ondersteun.

Die patroon eof stel 'n aksie voor wat op die einde van die lêer uitgevoer word. 'N Afsonderlike eofpatroon kan ook die output- vlag volg, in welke geval dit ooreenstem as 'n eof opgespoor word tydens die skryf van uitvoer. Die standaard eof aksie is "terugkeer", sodat interaksie eenvoudig opbrengste op enige EOF.

Die patroon time-out stel 'n time-out (in sekondes) voor en 'n aksie wat uitgevoer word nadat geen karakters vir 'n gegewe tyd gelees is nie. Die time-out patroon is van toepassing op die mees onlangse gespesifiseerde proses . Daar is geen standaard time-out nie. Die spesiale veranderlike "time-out" (gebruik deur die verwagte bevel) het geen invloed op hierdie tydsduur nie.

Byvoorbeeld, die volgende stelling kan gebruik word om outologout gebruikers wat nie vir 'n uur ingetik het nie, maar wat steeds gereelde stelsel boodskappe ontvang:

interaksie -invoer $ gebruiker_spawn_id time-out 3600 retour-output \ $ spawn_id

As die patroon die sleutelwoord nul is , en nuls word toegelaat (via die delete_nulls- opdrag), word die ooreenstemmende liggaam uitgevoer as 'n enkele ASCII 0 ooreenstem. Dit is nie moontlik om 0 grepe deur glob of regexp patrone te pas nie.

Voorskryf van 'n patroon met die vlag -printer veroorsaak dat die veranderlike interact_out (spawn_id) ingestel word op die spawnid wat ooreenstem met die patroon (of ew).

Aksies soos breek en voortgaan veroorsaak dat beheerstrukture (dws vir , proc ) op die gewone manier optree. Terugkeer veroorsaak egter dat interaksie terugkeer na sy oproeper, terwyl inter-terugkeer veroorsaak dat interaksie 'n opbrengs in sy oproeper veroorsaak. Byvoorbeeld, as "proc foo" interaksie genoem word wat dan die aksie inter_return uitgevoer het , sal proc foo terugkeer. (Dit beteken dat indien interaktiewe oproepe tolk interaktief tik terugkeer, sal die interaksie voortgaan, terwyl inter_return sal veroorsaak dat die interaksie na sy oproeper terugkeer.)

Tydens interaksie word rou modus gebruik sodat alle karakters aan die huidige proses oorgedra kan word. As die huidige proses nie werksterkte seine kry nie, sal dit stop as 'n stopsein gestuur word (by verstek ^ Z). Om dit weer te begin, stuur 'n voortgesette sein (soos deur "kill -ONT"). As jy regtig 'n SIGSTOP wil stuur na so 'n proses (by ^ Z), oorweeg dit om eerste te spuit en dan jou program te bestuur. Aan die ander kant, as jy 'n SIGSTOP wil stuur om Hom te verwag , skakel eers die tolk (miskien met behulp van 'n ontsnappingskarakter) en druk dan ^ Z.

Stringliggaampies kan as 'n kortskrif gebruik word om te verhoed dat die tolk betree word en die opdragte interaktief moet uitvoer. Die vorige terminale modus word gebruik terwyl die liggaam van 'n snaarliggaamspaar uitgevoer word.

Vir spoed word aksies standaard uitgevoer in rou modus. Die reset- vlag stel die terminaal terug na die modus wat dit gehad het voordat interaksie uitgevoer is (altyd gekookte modus). Let daarop dat karakters wat ingeskryf is wanneer die modus oorgeskakel word, dalk verlore gaan ('n ongelukkige kenmerk van die terminale bestuurder op sommige stelsels). Die enigste rede om te gebruik -reset is as jou aksie hang af van die gang in gekookte modus.

Die -choch- vlag stuur karakters wat ooreenstem met die volgende patroon terug na die proses wat hulle gegenereer het as elke karakter gelees word. Dit kan nuttig wees as die gebruiker terugvoer van gedeeltelik getikte patrone moet sien.

As 'n patroon echoed word, maar uiteindelik nie ooreenstem nie, word die karakters na die geprojekteerde proses gestuur . As die geprojekteerde proses hulle echo, sal die gebruiker die karakters twee keer sien. -Echo is waarskynlik slegs toepaslik in situasies waar die gebruiker onwaarskynlik is om nie die patroon te voltooi nie. Byvoorbeeld, die volgende uittreksel is van rftp, die rekursiewe-ftp script, waar die gebruiker gevra word om ~ g, ~ p of ~ l in te voer om die huidige gids rekursief te kry, te plaas of te lys. Dit is so ver weg van die normale ftp-opdragte dat die gebruiker dit waarskynlik nie sal volg nie ~ gevolg deur enigiets anders, behalwe foutief, in welke geval hulle waarskynlik net die resultaat sal ignoreer.

interaksie {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Die -nobuffer- vlag stuur karakters wat ooreenstem met die volgende patroon op die uitvoerproses soos karakters gelees word.

Dit is handig as u 'n program wil laat terugkeer na die patroon. Byvoorbeeld, die volgende kan gebruik word om te monitor waar 'n persoon skakel ('n Hayes-stylmodem). Elke keer as 'atd' gesien word, is die script logs die res van die lyn.

Pro lognumber {} {interaksie -nobuffer -re "(. *) \ r" terugstel stel $ log "[klokformaat [klok sekondes]]: skakel $ interact_out (1 string)"} interaksie -nobuffer "atd" lognumber

Tydens interaksie word vorige gebruik van log_user geïgnoreer. In die besonder, sal interaksie dwing om sy uitset te wees aangeteken (gestuur na die standaard uitvoer) aangesien dit veronderstel word dat die gebruiker nie blindelings wil interaksie nie.

Die -v vlag veroorsaak dat enige volgende sleutelliggaampies toegepas word op die uitset van die huidige proses . Dit kan nuttig wees, byvoorbeeld, wanneer u met hosters wat ongewenste karakters tydens 'n telnet sessie stuur, hanteer.

By verstek verwag die interaksie dat die gebruiker stdin skryf en die proses van die verwagte proses self lees. Die -u- vlag (vir "gebruiker") maak interaksie vir die gebruiker as die proses wat deur sy argument genoem word (wat 'n ID moet wees).

Dit laat toe dat twee nie-verwante prosesse saamgevoeg word sonder om 'n eksplisiete lus te gebruik. Om te help met die ontfouting, verwag diagnostiek altyd na stderr (of stdout vir sekere logging en debugging inligting). Om dieselfde rede sal die tolkbevel interaktief van stdin lees.

Byvoorbeeld, die volgende fragment skep 'n aanmeldproses. Dan bel die gebruiker (nie getoon nie), en verbind uiteindelik die twee saam. Natuurlik kan enige proses vervang word vir aanmelding. 'N Skulp, byvoorbeeld, sal die gebruiker toelaat om te werk sonder om 'n rekening en wagwoord te verskaf.

kuit login stel login $ spawn_id spawn tip modem # skakel terug na gebruiker # verbind gebruiker om aan te meld interaktiewe -u $ login

Om uitset na veelvuldige prosesse te stuur, lys elke kuit ID-lys wat voorafgegaan is deur 'n -uitvoer vlag. Inset vir 'n groep uitset kuit ids kan bepaal word deur 'n kuit ID lys voorafgevoer deur 'n- invoer vlag. (Beide -invoer en -uitvoer kan lyste in dieselfde vorm as die -i- vlag in die verwagte opdrag neem, behalwe dat any_spawn_id nie betekenisvol is in interaksie nie .) Alle volgende vlae en stringe (of patrone) is van toepassing op hierdie insette tot 'n ander - Invoer vlag verskyn. As geen -invoer verskyn, -uitvoer impliseer "-invoer $ gebruiker_spawn_id -output". (Net so, met patrone wat nie -input het nie .) As een -invoer gespesifiseer word, word dit oorskry $ user_spawn_id. As 'n tweede- invoer gespesifiseer word, word dit oorskry $ spawn_id. Bykomende inskrywingsvlae mag gespesifiseer word.

Die twee geïmpliseerde insette prosesseer standaard om hul uitsette as $ spawn_id en $ user_spawn_id (in omgekeerde volgorde) te hê. As 'n -invoer vlag verskyn met geen uitvoer vlag, word karakters uit die proses weggegooi.

Die -i- vlag stel 'n vervanging vir die huidige spawn_id voor wanneer geen ander -invoer- of -uitvoer- vlae gebruik word nie. A -i vlag impliseer 'n vlag.

Dit is moontlik om die prosesse wat met mekaar geinterakt word, te verander deur indirekte kuit ids te gebruik. (Indirekte kuit ids word beskryf in die afdeling oor die verwagte bevel.) Indirekte kuit ids kan gespesifiseer word met die -i, -u, -input, of -output-vlae.

tolk [args]
veroorsaak dat die gebruiker interaktief gevra word vir Verwagtings- en Tcl-opdragte. Die resultaat van elke opdrag word gedruk.

Aksies soos breek en voortgaan veroorsaak dat beheerstrukture (dws vir , proc ) op die gewone manier optree. Terugkeer veroorsaak dat tolk terugkeer na sy oproeper, terwyl inter-retour tolk veroorsaak om 'n opbrengs in sy oproeper te veroorsaak. Byvoorbeeld, as "proc foo" genoem tolk wat dan die aksie inter_return uitgevoer het , sal proc foo terugkeer. Enige ander opdrag veroorsaak dat tolk voortgaan om te vra vir nuwe opdragte.

Standaard bevat die spoed twee heelgetalle. Die eerste heelgetal beskryf die diepte van die evalueringstapel (dws hoeveel keer is Tcl_Eval genoem). Die tweede heelgetal is die Tcl geskiedenis identifiseerder. Die prompt kan gestel word deur 'n prosedure met die naam "prompt1" te definieer wie se terugkeerwaarde die volgende prompt word. As 'n verklaring oop kwotasies, parens, braces of hakies het, word 'n sekondêre prompt (standaard "+>") op newline uitgereik. Die sekondêre prompt kan gestel word deur 'n prosedure met die naam "prompt2" te definieer.

Tydens die tolk word gekookte modus gebruik, selfs al het die oproeper rou modus gebruik.

As stdin gesluit is, sal tolk terugkeer tensy die vlag van die vlag gebruik word, in welke geval die daaropvolgende argument aangevoer word.

log_file [args] [[-a] file]
As 'n lêernaam verskaf word, sal log_file 'n transkripsie van die sessie (begin op daardie punt) in die lêer opneem. log_file sal ophou om op te teken indien geen argument gegee word nie. Enige vorige loglêer is gesluit.

In plaas van 'n lêernaam, kan 'n Tcl-lêer-identifikasie verskaf word deur die -open of -opening- vlae te gebruik. Dit is soortgelyk aan die kuitbevel . (Kyk kuit vir meer inligting.)

Die -a- vlag kragte uitvoer om aangemeld te word wat onderdruk is deur die log_user bevel.

Die log_file- opdrag voeg by verstek by ou lêers in plaas van om hulle af te knippeer , sodat dit maklik kan wees om af te teken en op verskeie kere in een sessie. Om die lêers af te sny , gebruik die vlag-vlag.

Die -info vlag veroorsaak log_file om 'n beskrywing van die mees onlangse nie-inligtingsargumente te gee.

log_user-info | 0 | 1
Standaard word die dialoog stuur / verwag aangemeld om te stdout (en 'n logbestand as dit oop is). Die aanteken by stdout is gedeaktiveer met die opdrag "log_user 0" en word aangeskakel deur "log_user 1". Logging aan die logbestand is onveranderd.

Die -info- vlag veroorsaak dat log_user 'n beskrywing van die mees onlangse nie-inligtingsargumente ontvang.

match_max [-d] [-i spawn_id] [grootte]
definieer die grootte van die buffer (in grepe) wat intern gebruik word deur te verwag . Met geen grootte argument word die huidige grootte terugbesorg.

Met die -d vlag, is die standaard grootte ingestel. (Die aanvanklike standaard is 2000.) Met die -i- vlag, is die grootte vir die genoemde spawn-ID ingestel, anders is dit ingestel vir die huidige proses .

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
voer "program args" in plaas van die huidige verwagte program, wat eindig. 'N Blote koppelteken-argument dwing 'n koppelteken voor die bevelnaam asof dit 'n inskrywingsdop was. Alle spawnids is gesluit behalwe vir diegene wat as argumente genoem word. Hierdie is toegepas op die genoemde lêer identifiseerers.

Spawn_ids word gekarteer na lêer identifiseerers vir die nuwe program om te erf. Byvoorbeeld, die volgende reël skaak en laat dit beheer word deur die huidige proses - sê 'n skaakmeester.

oorlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id skaak

Dit is meer doeltreffend as "interaksie -u", maar dit bied die vermoë om geprogrammeerde interaksie te doen, aangesien die Verwagte proses nie meer in beheer is nie.

Let daarop dat geen beherende terminaal voorsien word nie. Dus, as jy standaard invoer ontkoppel of herbegin, sal programme wat werkbeheer (skulp, inskrywing, ens.) Doen, nie behoorlik funksioneer nie.

pariteit [-d] [-i spawn_id] [waarde]
definieer of pariteit behoue ​​of gestroop moet word van die uitset van geproeide prosesse. As die waarde nul is, word die pariteit gestroop, anders word dit nie gestroop nie. Met geen waarde argument nie, word die huidige waarde teruggestuur.

Met die -d vlag, is die standaardpariteitwaarde ingestel. (Die aanvanklike standaard is 1, dit wil sê, pariteit word nie gestroop nie.) Met die -i- vlag, word die pariteitswaarde vir die genoemde spawn-id gestel, anders is dit ingestel vir die huidige proses .

remove_nulls [-d] [-i spawn_id] [waarde]
definieer of nulke behoue ​​of verwyder word uit die uitset van geproede prosesse voordat patroon ooreenstem of stoor in die veranderlike expect_out of interact_out . As die waarde 1 is, word nulls verwyder. As die waarde 0 is, word nulls nie verwyder nie. Met geen waarde argument nie, word die huidige waarde teruggestuur.

Met die -d vlag, is die verstekwaarde ingestel. (Die aanvanklike standaard is 1, dit wil sê, nuls word verwyder.) Met die -i- vlag word die waarde vir die genoemde spawn-id gestel, anders is dit ingestel vir die huidige proses .

Of nie nuls verwyder word nie, sal verwag dat nulbytes na die log en stdout opgeteken sal word.

stuur [-flags] string
Stuur string na die huidige proses . Byvoorbeeld, die opdrag

stuur "hallo wêreld"

stuur die karakters, helloworld na die huidige proses . (Tcl sluit 'n printf- soort opdrag (genoem formaat ) wat arbitrêr komplekse snare kan bou.)

Karakters word dadelik gestuur, hoewel programme met lyngebufferde insette nie die karakters sal lees totdat 'n terugkeerkarakter gestuur word nie. 'N Retourkarakter word aangedui as "\ r".

Die - vlag dwing die volgende argument as 'n snaar eerder as 'n vlag. Enige string kan voorafgegaan word deur "-" of dit eintlik lyk soos 'n vlag. Dit bied 'n betroubare meganisme om veranderlike stringe te spesifiseer sonder om op te los deur diegene wat per ongeluk soos vlaggies lyk. (Alle snare wat begin met "-" word gereserveer vir toekomstige opsies.)

Die -i- vlag verklaar dat die string na die genoemde spawn_id gestuur word. As die spawn_id gebruiker_spawn_id is en die terminaal in die rou modus is, word nuwe lyne in die tou vertaal na terug-newline-opeenvolgings sodat dit lyk asof die terminaal in die gekookte modus was. Die -raw vlag skakel hierdie vertaling af.

Die -null- vlag stuur nul karakters (0 grepe). By verstek word een nul gestuur. 'N Heelgetal mag die -nul volg om aan te dui hoeveel nulde moet gestuur word.

Die breekvlag genereer 'n breekvoorwaarde . Dit maak net sin as die spawn-ID verwys na 'n tty-toestel wat oopgemaak word via 'spawn -open'. As jy 'n proses soos 'n wenk geproduseer het, moet jy die wenk van die wenk gebruik om 'n breek te genereer.

Die -s- vlagkragte moet as 'stadig' gestuur word, dus vermy die algemene situasie waar 'n rekenaar 'n invoerbuffer uitmaak wat ontwerp is vir 'n mens wat nooit dieselfde buffer sou uitmaak nie. Hierdie uitset word beheer deur die waarde van die veranderlike "send_slow" wat 'n twee element lys bevat. Die eerste element is 'n heelgetal wat die aantal grepe beskryf om atomies te stuur. Die tweede element is 'n reële getal wat die aantal sekondes beskryf waarvolgens die atoomversendings geskei moet word. Byvoorbeeld, "stel send_slow {10 .001}" dwing "stuur -s" om strings met 1 millisekondes tussen elke 10 karakters wat gestuur word, te stuur.

Die -h vlag kragte uitset gestuur word (ietwat) soos 'n mens eintlik tik. Menslike vertragings verskyn tussen die karakters. (Die algoritme is gebaseer op 'n Weibull-verspreiding, met wysigings wat by hierdie spesifieke toepassing pas.) Hierdie uitset word beheer deur die waarde van die veranderlike "send_human" wat 'n vyf element lys bevat. Die eerste twee elemente is die gemiddelde interarrival tyd van karakters in sekondes. Die eerste is standaard gebruik. Die tweede word gebruik by die einde van die woord, om die subtiele pouses wat soms by sulke oorgange voorkom, te simuleer. Die derde parameter is 'n mate van veranderlikheid waar .1 redelik veranderlik is, 1 is redelik veranderlik, en 10 is redelik onveranderlik. Die uiterstes is 0 tot oneindigheid. Die laaste twee parameters is onderskeidelik 'n minimum en maksimum interarrival tyd. Die minimum en maksimum word die laaste gebruik en "clip" die finale tyd. Die uiteindelike gemiddelde kan heel anders wees as die gegewe gemiddelde as die minimum en maksimum clip genoeg waardes.

As voorbeeld, emulgeer die volgende opdrag 'n vinnige en konsekwente tikster:

stel send_human {.1 .3 1 .05 2} stuur -h "Ek is honger. Kom ons eet middagete."

terwyl die volgende dalk meer geskik is vir 'n babelaas:

stel send_human {.4 .4 .2 .5 100} stuur -h "Goodd party lash night!"

Let daarop dat foute nie gesimuleer word nie, hoewel u foutkorrigeringsituasies self kan opstel deur foute en regstellings in 'n stuurargument in te sluit.

Die vlae vir die stuur van nul karakters, vir die stuur van breek, vir die dwing stadige uitset en vir menslike styl uitvoer is wedersyds eksklusiewe. Slegs die een wat laas gespesifiseer word, sal gebruik word. Verder kan geen string argument gespesifiseer word met die vlae vir die stuur van nul karakters of breek.

Dit is 'n goeie idee om vooraf die eerste aanstuur na 'n proses te stuur . verwag sal wag vir die proses om te begin, terwyl die stuur nie kan nie. In die besonder, as die eerste stuur voltooi word voordat die proses begin hardloop, loop jy die risiko om jou data te ignoreer. In situasies waar interaktiewe programme geen aanvanklike spoed bied nie, kan u vooraf met 'n vertraging soos volg stuur :

# Om te voorkom dat hackers wenke gee oor hoe om in te breek, # word hierdie stelsel nie gevra vir 'n eksterne wagwoord nie. # Wag vir 5 sekondes vir exec om telnet te maak. Very.secure.gov slaap 5 stuur wagwoord \ r

exp_send is 'n alias vir stuur. As jy Expectk of 'n ander variant van Verwagting in die Tk-omgewing gebruik, word die stuur deur Tk gedefinieer vir 'n heel ander doel. exp_send word voorsien vir versoenbaarheid tussen omgewings. Soortgelyke aliasse word voorsien vir ander Verwag se ander stuuropdragte.

send_error [-flags] string
is soos stuur , behalwe dat die uitset na stderr gestuur word eerder as die huidige proses .

send_log [-] string
is soos stuur , behalwe dat die string slegs na die logbestand gestuur word (sien log_file .) Die argumente word geïgnoreer indien geen loglêer oop is nie.

send_tty [-flags] string
is soos stuur , behalwe dat die uitvoer na / dev / tty eerder as die huidige proses gestuur word .

send_user [-flags] string
is soos stuur , behalwe dat die uitvoer na stdout gestuur word eerder as die huidige proses .

slaap sekondes
veroorsaak dat die skrif vir die gegewe aantal sekondes slaap . Sekondes mag 'n desimale getal wees. Onderbrekings (en Tk-gebeurtenisse as jy Expectk gebruik) word verwerk terwyl verwag slaap.

spawn [args] program [args]
skep 'n nuwe proses wat "program args" loop. Sy stdin, stdout en stderr is verwant aan Verwagting, sodat hulle gelees en geskryf kan word deur ander verwagtinge . Die verbinding word naby gebreek of as die proses self enige van die lêeridentifiseerders sluit.

Wanneer 'n proses deur kuit begin word, word die veranderlike spawnid ingestel op 'n beskrywer wat na daardie proses verwys . Die proses wat deur spawn_id beskryf word , word beskou as die "huidige proses ". spawn_id kan gelees of geskryf word, in effek wat werkbeheer bied.

user_spawn_id is 'n globale veranderlike wat 'n beskrywer bevat wat na die gebruiker verwys. Byvoorbeeld, wanneer spawn_id ingestel is op hierdie waarde, word verwag dat verwag word soos expect_user .

.I error_spawn_id is 'n globale veranderlike wat 'n descriptor bevat wat verwys na die standaardfout. Byvoorbeeld, wanneer spawn_id ingestel is op hierdie waarde, dien die optrede soos send_error op .

tty_spawn_id is 'n globale veranderlike wat 'n beskrywer bevat wat verwys na / dev / tty. As / dev / tty nie bestaan ​​nie (soos in 'n cron- , at- of batch script), dan is tty_spawn_id nie gedefinieer nie. Dit kan getoets word as:

as {{info fresh tty_spawn_id]} {# / dev / tty bestaan} anders {# / dev / tty bestaan ​​nie # waarskynlik in cron, joernaal of by script}

Kweek gee die UNIX- proses- ID terug. As geen proses ontgin word nie, word 0 teruggegee. Die veranderlike spawn_out (slaaf, naam) is ingestel op die naam van die PTY slaaf toestel.

By verstek evalueer kuit die bevelnaam en argumente. Die -noecho- vlag hou op om dit te doen.

Die -konsole- vlag veroorsaak dat konsole-uitset na die geprojekteerde proses herlei word . Dit word nie op alle stelsels ondersteun nie.

Intern gebruik 'n Pty, gelyktydig op dieselfde manier as die gebruiker se tty. Dit word verder geïnisieer sodat alle instellings "gesond" is (volgens stty (1)). As die veranderlike stty_init gedefinieer word, word dit in die styl van stoute argumente as verdere konfigurasie geïnterpreteer. Byvoorbeeld, "set stty_init raw" sal veroorsaak dat die terminale van die verdere proewe van die prosesse in rou modus begin. -nottikopie slaan die inisiatiewe gebaseer op die gebruiker se tty. -nottyinit slaan die "sane" initialisatie.

Gewoonlik neem die kuitjie min tyd om uit te voer. As jy agterkom dat jy 'n beduidende hoeveelheid tyd neem, raak dit waarskynlik ptys wat ingewig is. 'N Aantal toetse word uitgevoer op ptys om verstopings te voorkom met errant prosesse. (Dit duur 10 sekondes per wedged pty.) Running Verwag met die -d opsie sal wys of Expect baie ptys ervaar in vreemde state. As jy nie die prosesse waarop hierdie ptys aangeheg is, kan doodmaak nie, kan jy net herlaai.

As die program nie suksesvol geskep kan word nie, aangesien exec (2) misluk (bv. Wanneer die program nie bestaan ​​nie), sal 'n foutboodskap deur die volgende wisselwerking of verwagte opdrag teruggestuur word asof die foutboodskap as uitvoer uitgevoer en geproduseer is. Hierdie gedrag is 'n natuurlike gevolg van die implementering van kuit . Intern, kweekvurke, waarna die geproede proses nie met die oorspronklike Verwagtingsproses kan kommunikeer nie, behalwe deur kommunikasie via die spawnid.

Die -open vlag veroorsaak dat die volgende argument geïnterpreteer word as 'n Tcl-lêer-identifiseerder (dws deur oop geopen .) Die kuit-id kan dan gebruik word asof dit 'n geproefde proses was . (Die lêer identifiseerder moet nie meer gebruik word nie.) Hiermee kan u rou toestelle, lêers en pyplyne behandel as produseer prosesse sonder die gebruik van 'n Pty. 0 is terug om aan te dui daar is geen gepaardgaande proses nie . Wanneer die verbinding met die geprojekteerde proses gesluit is, is die TCL lêer-identifiseerder ook. Die vlaggie- vlag is soortgelyk aan -open behalwe dat -afloopopen veroorsaak dat die lêeridentifiseerder oopgelaat word, selfs nadat die kuit-ID gesluit is.

Die vlagvlag veroorsaak dat 'n Pty geopen word, maar geen proses het ontstaan ​​nie. 0 is terug om aan te dui daar is geen gepaardgaande proses nie . Spawn_id is soos gewoonlik ingestel.

Die veranderlike spawn_out (slaaf, fd) is ingestel op 'n lêer identifiseerder wat ooreenstem met die Pty slaaf. Dit kan gesluit word deur "close -slave" te gebruik.

Die vlag-vlag noem 'n sein wat geïgnoreer moet word in die proe . Andersins kry seine die standaardgedrag. Seine word genoem as in die trapopdrag , behalwe dat elke sein 'n aparte vlag benodig.

strass vlak
veroorsaak dat volgende stellings gedruk word voordat dit uitgevoer word. (Tcl se spoor opdrag spoor veranderlikes.) Vlak dui aan hoe ver in die oproepstapel om te spoor. Byvoorbeeld, die volgende opdrag lopies Verwag terwyl die eerste 4 vlakke van oproepe opgespoor word, maar nie onder dit nie.

verwag -c "strace 4" script.exp

Die -info vlag veroorsaak dat 'n beskrywing van die mees onlangse nie-inligtingsargumente gegee word.

stout args
verander terminaal modi soortgelyk aan die eksterne stty bevel.

By verstek word die beherende terminaal toeganklik. Ander terminale kan verkry word deur by te voeg: "Versoeke vir status gee dit terug as gevolg van die opdrag. As geen status aangevra word nie en die beheerterminale toeganklik is, word die vorige status van die rou en echo-eienskappe terugbesorg in 'n vorm wat later kan wees gebruik deur die opdrag.

Byvoorbeeld, die argumente rou of -gekook het die terminaal in rou modus. Die argumente - gaar of gaar, sit die terminaal in die kookmodus . Die argumente- echo en -echo stel die terminaal in echo- en noecho-modus onderskeidelik.

Die volgende voorbeeld illustreer hoe om tydelik uit te skakel. Dit kan gebruik word in ander outomatiese skrifte om die wagwoorde in hulle te verhoed. (Sien meer bespreking hieroor onder VERWAGTE HINTE hieronder.)

stty -echo send_user "Wagwoord:" expect_user -re "(. *) \ n" stel wagwoord $ expect_out (1, string) stout echo

stelsel args
gee args aan sh (1) as inset, net asof dit as 'n bevel van 'n terminaal getik is. Verwag wag totdat die dop eindig. Die terugkeerstatus van sh word op dieselfde manier hanteer as wat die terugvoerstatus van exec hanteer word.

In teenstelling met exec wat herleidings stdin en stdout na die script, voer die stelsel geen herleiding uit (anders as wat deur die tou self aangedui word). Dit is dus moontlik om programme te gebruik wat direk aan / dev / tty moet praat. Om dieselfde rede word die resultate van die stelsel nie in die logboek aangeteken nie.

tydstempel [args]
gee 'n tydstempel terug. Met geen argumente, is die aantal sekondes sedert die tydperk terugbesorg.

Die -format- vlag stel 'n string voor wat terugbesorg word maar met substitusies wat volgens die POSIX-reëls vir strftime gemaak is. Byvoorbeeld% a word vervang deur 'n verkorte weekdag naam (dws, Sat). Ander is:

% 'n verkorte weekdag naam% 'n volle weekdag naam% b verkorte maand naam% B volle maand naam% c datum tyd soos in: Wo Okt 6 11:45:56 1993% d dag van die maand (01-31% H uur (00-23)% I uur (01-12)% j dag (001-366)% m maand (01-12)% M minuut (00-59)% p of of pm% S sekonde (00-61) % u dag (1-7, Maandag is eerste dag van die week)% U week (00-53, eerste Sondag is eerste dag van week een)% V week (01-53, ISO 8601 styl)% w dag 6)% W week (00-53, eerste Maandag is eerste dag van week een)% x datum tyd soos in: Wo Okt 6 1993% X tyd soos in: 23:59:59% jaar (00-99) % Y jaar soos in: 1993% Z tydsone (of niks indien nie bepaalbaar nie) %% 'n kale persenteken

Ander% spesifikasies is ongedefinieerd. Ander karakters sal deur onaangeraak geslaag word. Slegs die C-plek word ondersteun.

Die vlag van die sekondes stel 'n paar sekondes voor sedert die tydsduur wat gebruik moet word as 'n bron waaruit jy kan formateer. Andersins word die huidige tyd gebruik.

Die -gmt vlag kragte tydstempel uitvoer die GMT tydsone te gebruik. Met geen vlag word die plaaslike tydsone gebruik nie.

val [[bevel] seine]
veroorsaak dat die gegewe opdrag uitgevoer word op toekomstige ontvangs van enige van die gegewe seine. Die opdrag word uitgevoer in die globale omvang. As bevel nie afwesig is nie, word die seinaksie terugbesorg. As opdrag die string SIG_IGN is, word die seine geïgnoreer. As opdrag die string SIG_DFL is, word die seine tot die stelsel standaard. seine is óf 'n enkele sein of 'n lys van seine. Seine kan gespesifiseer word numeries of simbolies soos per sein (3). Die voorvoegsel "SIG" mag weggelaat word.

Met geen argumente (of die argument-nommer), trap die terugkeer die sein nommer van die trap bevel wat tans uitgevoer word.

Die kodekode gebruik die terugkeerkode van die opdrag in plaas van watter kode Tcl op die punt was om terug te keer wanneer die opdrag oorspronklik begin.

Die -interp vlag veroorsaak dat die opdrag geëvalueer word deur die tolk aktief te maak op die oomblik dat die opdrag begin loop, eerder as wanneer die lokval verklaar is.

Die -name- vlag veroorsaak dat die opdrag-opdrag die seinnaam van die trapopdrag wat tans uitgevoer word, terugstuur.

Die -max- vlag veroorsaak dat die opdrag-opdrag die grootste seinnommer wat ingestel kan word, teruggee.

Byvoorbeeld, die opdrag "trap {send_user" Ouch! "} SIGINT" sal druk "Ouch!" elke keer as die gebruiker druk op ^ C.

By verstek, SIGINT (wat gewoonlik gegenereer kan word deur te druk ^ C) en SIGTERM veroorsaak Verwag om te verlaat. Dit is as gevolg van die volgende val, wat standaard geskep is wanneer verwag word.

val afrit {SIGINT SIGTERM}

As jy die -D-vlag gebruik om die debugger te begin, is SIGINT herdefinieer om die interaktiewe debugger te begin. Dit is as gevolg van die volgende val:

val {exp_debug 1} SIGINT

Die debugger-val kan verander word deur die omgewingsveranderlike EXPECT_DEBUG_INIT te stel na 'n nuwe trapopdrag.

U kan natuurlik beide van hierdie opsies ignoreer deur slegs opdragte op te laai. In die besonder, as jy jou eie "trap exit SIGINT" het, sal dit die debugger trap verontagsaam. Dit is handig as jy wil voorkom dat gebruikers die debugger hoegenaamd nie kry nie.

As jy jou eie val op SIGINT wil definieer, maar nog steeds op die debugger val wanneer dit gebruik word, gebruik:

as {! [exp_debug]} {val mystuff SIGINT}

Alternatiewelik kan jy met 'n ander sein na die debugger val.

val sal jou nie toelaat dat jy die aksie vir SIGALRM ignoreer nie, aangesien dit intern gebruik word om te verwag . Die opdrag verbreek stel SIGALRM na SIG_IGN (ignoreer). U kan dit herbenut sodra u dit tydens die daaropvolgende spoedopdragte deaktiveer.

Sien sein (3) vir meer inligting.

wag [angs]
vertragings totdat 'n geproefde proses (of die huidige proses indien niemand genoem word nie) beëindig.

wag gewoonlik gee 'n lys van vier heelgetalle. Die eerste heelgetal is die pid van die proses waarop gewag is. Die tweede heelgetal is die ooreenstemmende spawn id. Die derde heelgetal is -1 indien 'n bedryfstelselfout plaasgevind het, of 0 andersins. As die derde heelgetal 0 was, is die vierde heelgetal die status wat deur die geprojekteerde proses teruggekeer word. As die derde heelgetal -1 was, is die vierde heelgetal die waarde van errno wat deur die bedryfstelsel gestel word. Die globale veranderlike foutkode is ook ingestel.

Bykomende elemente mag aan die einde van die terugkeerwaarde verskyn uit wag . 'N Alternatiewe vyfde element identifiseer 'n klas inligting. Tans is die enigste moontlike waarde vir hierdie element CHILDKILLED. In die geval is die volgende twee waardes die C-styl seinnaam en 'n kort teksbeskrywing.

Die -i- vlag verklaar die proses om te wag wat ooreenstem met die genoemde spawn_id (NIE die proses- ID nie). Binne 'n SIGCHLD-hanteerder is dit moontlik om te wag vir enige geproede proses deur die spawn-ID te gebruik.

Die -noue vlag veroorsaak dat die wag onmiddellik terugkom met die aanduiding van 'n suksesvolle wag. Wanneer die proses uitgaan (later), sal dit outomaties verdwyn sonder dat daar 'n duidelike wag nodig is.

Die wagopdrag kan ook gebruik word, wag vir 'n vurkproses met die argumente "-i -1". In teenstelling met die gebruik daarvan met gekweekte prosesse, kan hierdie opdrag te eniger tyd uitgevoer word. Daar is geen beheer oor watter proses geoes word nie. Die terugkeerwaarde kan egter vir die proses- ID nagegaan word.

BIBLIOTEKE

Verwag, weet outomaties oor twee ingeboude biblioteke vir die verwagte skrifte. Hierdie word gedefinieer deur die dopgehou wat in die veranderlikes exp_library en exp_exec_library genoem word. Albei is bedoel om nutlêers te bevat wat deur ander skrifte gebruik kan word.

exp_library bevat argitektuur onafhanklike lêers. exp_exec_library bevat argitektuur afhanklike lêers. Afhangende van jou stelsel, kan albei dopgehou heeltemal leeg wees. Die bestaan ​​van die lêer $ exp_exec_library / cat-buffers beskryf of u / bin / cat buffers by verstek.

PRETTY-PRINTING

'N Vgrind-definisie is beskikbaar vir mooi drukwerk. Skrips verwag . Gestel die vgrind definisie wat voorsien is van die Verwagting verspreiding korrek geïnstalleer is, kan u dit gebruik as:

vgrind -lexpect lêer

VOORBEELDE

Dit is baie nie duidelik hoe om alles saam te voeg wat die manblad beskryf nie. Ek moedig u aan om die voorbeelde te lees en uit te probeer in die voorbeeldgids van die Verwagting- verspreiding. Sommige van hulle is regte programme. Ander is bloot illustrasies van sekere tegnieke, en natuurlik, 'n paar is net vinnige hacks. Die installeer lêer het 'n vinnige oorsig van hierdie programme.

Die verwagte vraestelle (sien SIEN OOK) is ook nuttig. Alhoewel sommige vraestelle sintaksis gebruik wat ooreenstem met vorige weergawes van Verwagting, is die gepaardgaande rasionale steeds geldig en gaan dit baie meer besonderhede as hierdie manblad.

voorbehoude

Uitbreidings kan bots met verwag se opdrag name. Byvoorbeeld, stuur word gedefinieer deur Tk vir 'n heeltemal ander doel. Om hierdie rede is die meeste van die verwagte opdragte ook beskikbaar as "exp_XXXX". Opdragte en veranderlikes wat begin met "exp", "inter", "spawn" en "timeout" het nie aliasse nie. Gebruik die uitgebreide bevel name as u hierdie versoenbaarheid tussen omgewings benodig.

Verwag, neem 'n eerder liberale siening van omvang. In die besonder, veranderlikes wat gelees word deur opdragte spesifiek vir die verwagte program, sal eers van die plaaslike bestek gesoek word, en indien nie gevind nie, in die globale omvang. Byvoorbeeld, dit verhoed die noodsaaklikheid om "globale time-out" te plaas in elke prosedure wat jy skryf wat gebruike verwag . Aan die ander kant is veranderlikes wat geskryf is, altyd in die plaaslike omvang (tensy 'n "globale" opdrag uitgereik is). Die mees algemene probleem wat dit veroorsaak, is wanneer spawn uitgevoer word in 'n prosedure. Buite die prosedure bestaan spawn_id nie meer nie, dus die geprojekteerde proses is nie meer toeganklik nie bloot as gevolg van omvangsbepaling. Voeg 'n "globale spawn_id" by so 'n prosedure.

As u nie die multispawning vermoë kan aktiveer nie (dws u stelsel ondersteun nie seleksie nie (BSD *. *), Poll (SVR> 2), of iets wat ekwivalent is). Verwag sal slegs 'n enkele proses op 'n slag kan beheer. Probeer in hierdie geval nie spawn_id te stel nie , en moenie prosesse uitvoer via exec terwyl 'n geprojekteerde proses aan die gang is nie. Verder sal u nie op dieselfde tyd van verskeie prosesse (insluitende die gebruiker as een) kan verwag nie.

Terminale parameters kan 'n groot uitwerking op skrifte hê. Byvoorbeeld, as 'n skrif geskryf is om te kyk vir eggo, sal dit misdra as die echo af is. Om hierdie rede, Verwag kragte die normale terminaal parameters. Ongelukkig kan dit dinge vir ander programme onaangenaam maak. As 'n voorbeeld, wil die emacs-dop die "gewone" kartering verander: newlines word gekarteer na nuwe lyne in plaas van karre-retournommers, en echoing is afgeskakel. Dit laat 'n mens toe om emacs te gebruik om die invoerlyn te wysig. Ongelukkig kan verwag dit nie moontlik raai nie.

U kan versoek dat Verwag nie die verstekstelling van terminaal parameters oorskry nie, maar dan moet u baie versigtig wees wanneer u skrifte vir sulke omgewings skryf. In die geval van emakse, vermy afhangende van dinge soos echoing en end-of-line mapping.

Die opdragte wat argumente aanvaar het, het in 'n enkele lys ingebring (die verwagtinge en wisselwerking ) gebruik 'n heuristiese om te besluit of die lys eintlik een of meer argumente is. Die heuristiek kan slegs in die geval misluk wanneer die lys eintlik 'n enkele argument verteenwoordig wat veelvuldige ingebedde \ n's bevat met nie-blankekaartjies tussen hulle. Dit blyk onwaarskynlik te wees, maar die argument "-nobrace" kan gebruik word om 'n enkele argument te dwing om as 'n enkele argument hanteer te word. Dit kan moontlik gebruik word met masjiengegenereerde Verwagte kode. Net so, -brace dwing 'n enkele argument om as veelvoudige patrone / aksies te hanteer.

BUGS

Dit was regtig aanloklik om die program "seks" te noem (vir "Smart EXec" of "Send-Expect"), maar goeie sin (of dalk net Puritanisme) het die oorhand gekry.

Op sommige stelsels, wanneer 'n dop gesaai word, kla dit om nie toegang tot die tty te kry nie, maar in elk geval loop dit. Dit beteken jou stelsel het 'n meganisme vir die verkryging van die beherende tty wat verwag nie weet nie. Vind asseblief wat dit is, en stuur hierdie inligting terug na my.

Ultrix 4.1 (ten minste die nuutste weergawes hier) beskou tydstande van bo 1000000 wat gelykstaande is aan 0.

Digitale UNIX 4.0A (en waarskynlik ander weergawes) weier om ptys toe te ken as jy 'n SIGCHLD-handler definieer. Sien subsidie ​​bladsy vir meer inligting.

IRIX 6.0 hanteer nie Pty regte korrek nie, sodat dit as 'n poging om 'n Pty te gebruik wat voorheen deur iemand anders gebruik is, toegepas word. Opgradeer na IRIX 6.1.

Telnet (geverifieer slegs onder SunOS 4.1.2) hang as TERM nie gestel is nie. Dit is 'n probleem onder cron, by en in cgi skrifte, wat nie TERMO definieer nie. U moet dus eksplisiet stel - na watter tipe is dit gewoonlik irrelevant. Dit moet net op iets gestel word! Die volgende is waarskynlik voldoende vir die meeste gevalle.

stel env (TERM) vt100

Wenk (verifieer slegs onder BSDI BSD / OS 3.1 i386) hang as SHELL en HOME nie ingestel is nie. Dit is 'n probleem onder cron , by en in cgi skrifte, wat nie hierdie omgewing veranderlikes definieer nie. U moet dus eksplisiet stel - na watter tipe is dit gewoonlik irrelevant. Dit moet net op iets gestel word! Die volgende is waarskynlik voldoende vir die meeste gevalle.

stel env (SHELL) / bin / sh stel env (TUIS) / usr / local / bin

Sommige implementerings van ptys is ontwerp sodat die kern enige ongeleesde uitvoer na 10 tot 15 sekondes weggooi (die werklike getal is implementeringsafhanklik) nadat die proses die lêerbeskrywer gesluit het. Verwag dus programme soos

kuitdatum slaap 20 verwag

sal misluk. Om dit te vermy, doen nie-interaktiewe programme met exec eerder as kuit . Terwyl sulke situasies denkbaar is, het ek in die praktyk nooit 'n situasie ervaar waar die finale uitset van 'n werklik interaktiewe program as gevolg van hierdie gedrag verlore gaan nie.

Aan die ander kant gooi Cray UNICOS ptys enige ongeleesde uitvoer onmiddellik nadat die proses die lêerbeskrywer gesluit het. Ek het dit aan Cray gerapporteer en hulle werk aan 'n oplossing.

Soms word 'n vertraging vereis tussen 'n vinnige en 'n reaksie, soos wanneer 'n tty-koppelvlak UART-instellings verander of ooreenstem met baadrate deur te kyk na begin / stop-bisse. Gewoonlik is dit alles nodig om vir 'n tweede of twee te slaap. 'N meer robuuste tegniek is om te probeer totdat die hardeware gereed is om insette te ontvang. Die volgende voorbeeld gebruik beide strategieë:

stuur "spoed 9600 \ r"; slaap 1 verwag {timeout {send "\ r"; exp_continue} $ prompt}

trap-kode sal nie werk met enige opdrag wat in Tcl se gebeurtenislus, soos slaap, sit nie. Die probleem is dat Tcl die terugkeerkodes van async-gebeurtenishanteerders weggooi. 'N oplossing is om 'n vlag in die valkode te stel. Kontroleer dan die vlag direk na die opdrag (dws, slaap).

Die expect_background bevel ignoreer-timeout argumente en het geen konsep van timeouts in die algemeen.

& # 34; EXPECT HINTS & # 34;

Daar is 'n paar dinge oor verwag dat dit nie-intuïtief kan wees. Hierdie gedeelte poog om sommige van hierdie dinge aan te spreek met 'n paar voorstelle.

'N Algemeen verwagte probleem is hoe om skulpaanvullings te herken. Aangesien dit verskillend aangepas word deur verskillende mense en verskillende skulpe, kan portable outomatisering rlogin moeilik wees sonder om die spoed te ken. 'N Redelike konvensie is om gebruikers 'n reëlmatige uitdrukking te stoor wat hulle vinnige (veral die einde daarvan) in die omgewingsveranderlike EXPECT_PROMPT beskryf. Kode soos die volgende kan gebruik word. As EXPECT_PROMPT nie bestaan ​​nie, het die kode steeds 'n goeie kans om korrek te funksioneer.

stel vinnige "(% | # | $ $ $ $); # standaardprompt vang {stelprompt $ env (EXPECT_PROMPT)} verwag -re $ prompt

Ek moedig jou aan om te skryf, verwag patrone wat die einde van wat jy verwag om te sien, verwag. Dit vermy die moontlikheid om 'n vraag te beantwoord voordat die hele ding gesien word. Daarbenewens kan jy dalk vrae beantwoord voordat jy dit heeltemal sien. As jy vroeg antwoord, kan jou antwoord in die middel van die vraag verskyn. Met ander woorde, die gevolgde dialoog sal korrek wees, maar kyk roer.

Die meeste vrae sluit 'n spasie-karakter aan die einde. Die prompt van ftp is byvoorbeeld 'f', 't', 'p', '>' en. Om aan hierdie versoek te voldoen, moet jy rekening hou met elk van hierdie karakters. Dit is 'n algemene fout om nie die leë in te sluit nie. Plaas die leë in eksplisiet.

As jy 'n patroon van die vorm X * gebruik, sal die * ooreenstem met al die uitset ontvang vanaf die einde van X tot die laaste ding wat ontvang is. Dit klink intuïtief, maar kan ietwat verwarrend wees omdat die frase "laaste ding wat ontvang is" kan wissel afhangende van die spoed van die rekenaar en die verwerking van I / O deur die kern en die toestelbestuurder.

In die besonder, mense is geneig om te sien program uitset kom in groot stukke (atoom) wanneer in die meeste programme produseer uitset een lyn op 'n slag. As dit die geval is, kan die * in die patroon van die vorige paragraaf slegs ooreenstem met die einde van die huidige reël alhoewel daar meer voorkom, want op die tydstip van die wedstryd was dit al die uitset wat ontvang is.

verwag het geen manier om te weet dat verdere uitset kom tensy jou patroon spesifiek daarvoor verantwoordelik is nie.

Selfs afhangende van lyngeoriënteerde buffering is onverstandig. Nie net maak programme seldsaam beloftes oor die soort buffering wat hulle doen nie, maar die stelsel se spysverteringstelsel kan uitsetlyne breek sodat lyne op oënskynlike ewekansige plekke breek. Dus, as jy die laaste paar karakters kan uitdruk wanneer jy patrone skryf, is dit verstandig om dit te doen.

As jy wag op 'n patroon in die laaste uitset van 'n program en die program stuur iets anders in plaas, sal jy dit nie met die time-out navraag kan opspoor nie. Die rede hiervoor is dat verwag nie tydsduur sal wees nie - in plaas daarvan sal dit 'n aanduiding kry. Gebruik dit eerder. Nog beter, gebruik albei. Op die manier as die lyn ooit rondbeweeg word, hoef jy nie die lyn self te wysig nie.

Newlines word gewoonlik omgeskakel na koerierretters, lynvoedingsreekse wanneer u die terminale bestuurder uitvoer. As jy dus 'n patroon wil hê wat die twee lyne eksplisiet pas, byvoorbeeld, printf ("foo \ nbar"), moet jy die patroon "foo \ r \ nbar" gebruik.

'N Soortgelyke vertaling vind plaas wanneer u van die gebruiker lees, via expect_user . In hierdie geval, wanneer u op terugkeer druk, sal dit na 'n nuwe lyn vertaal word. As verwag, word dit dan oorgedra na 'n program wat sy terminaal na rou modus (soos telnet) stel, daar gaan 'n probleem wees, aangesien die program 'n ware opbrengs verwag. (Sommige programme is eintlik vergewensgesind omdat hulle outomaties nuwe liedjies aan opbrengste sal vertaal, maar die meeste doen nie.) Ongelukkig is daar geen manier om uit te vind dat 'n program sy terminaal in rou-modus plaas nie.

Eerder as om nuwe lyne handmatig te vervang met opbrengste, is die oplossing om die bevel "stout rou" te gebruik, wat die vertaling sal stop. Let egter daarop dat dit beteken dat jy nie meer die gekookte lynredigeerfunksies sal kry nie.

Interaksie implisiet stel jou terminaal na rou modus sodat hierdie probleem nie sal ontstaan ​​nie.

Dit is dikwels nuttig om wagwoorde (of ander privaat inligting) in Skripsies te wag. Dit word nie aanbeveel nie, aangesien enigiets wat op 'n rekenaar gestoor word, vatbaar is vir toegang tot enigeen. So, interaktief vra vir wagwoorde van 'n script is 'n slimmer idee as om dit letterlik in te sluit. Nietemin, soms is sulke inbedding die enigste moontlikheid.

Ongelukkig het die UNIX-lêersisteem geen direkte manier om skrifte te skep wat uitvoerbaar maar onleesbaar is nie. Stelsels wat setgid-skripskripte ondersteun, kan dit indirek soos volg simuleer:

Skep die verwagte skrip (wat die geheime data bevat) soos gewoonlik. Maak sy toestemmings 750 (-rwxr-x ---) en behoort aan 'n betroubare groep, dit wil sê 'n groep wat dit mag lees. Indien nodig, skep 'n nuwe groep vir hierdie doel. Maak dan 'n / bin / sh-skrip met toestemmings 2751 (-rwxr-s - x) wat deur dieselfde groep as voorheen besit word.

Die resultaat is 'n skrif wat deur enigeen uitgevoer en gelees kan word. Wanneer dit aangevra word, word dit die Skagte verwag .

& # 34; Sien ook & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: 'n Tcl-gebaseerde Toolkit vir die automatisering van interaktiewe programme" deur Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"Verwag: Die Onbeheerbare Toepassings van Interaktiwiteit" deur Don Libes, Verrigtinge van die Somer 1990 USENIX Konferensie, Anaheim, Kalifornië, 11 tot 15 Junie 1990.
. Ek verwag dat die stelseladministrasietake outomaties geautomatiseerd word deur Don Libes, Proceedings van die 1990 USENIX Large Installation Systems Administration Conference, Colorado Springs, Colorado, 17-19-19 Oktober.
.I "Tcl: 'n Embeddable Command Language" deur John Ousterhout, Verrigtinge van die Winter 1990 USENIX Konferensie, Washington, DC, 22-26 Januarie 1990. Ek verwag: "Skripte vir die beheer van interaktiewe programme" deur Don Libes, Rekenaarstelsels , Vol. 4, No. 2, Universiteit van Kalifornië Pers Joernale, November 1991. Ek "Interpretasie toetsing en ooreenstemming toets interaktiewe programme", deur Don Libes, Verrigtinge van die somer 1992 USENIX Konferensie, pp. 135-144, San Antonio, TX, 12-15 Junie, 12 Junie 1992. Ek "Kibitz - sluit verskeie interaktiewe programme saam", deur Don Libes, Sagteware - Praktyk & Ervaring, John Wiley & Sons, Wes-Sussex, Engeland, Vol.

23, nr 5, Mei 1993. Ek is 'n Debugger vir Tcl Toepassings, deur Don Libes, Proceedings van die 1993 Tcl / Tk Workshop, Berkeley, CA, 10-11-11, 1993.

OUTEUR

Don Libes, Nasionale Instituut van Standaarde en Tegnologie

ERKENNINGS

Dankie aan John Ousterhout vir Tcl, en Scott Paisley vir inspirasie. Danksy Rob Savoye vir Expect se outokonfigurasie kode.

Die GESKIEDENIS-lêer dokumenteer baie van die evolusie van verwag . Dit maak interessante lees en kan u verdere insig gee aan hierdie sagteware. Dankie aan die mense wat daarin genoem word, wat my foutoplossings gestuur het en ander hulp verleen het.

Ontwerp en implementering van Verwagting is gedeeltelik betaal deur die Amerikaanse regering en is dus in die publieke domein. Die skrywer en NIST wil egter krediet hê as hierdie program en dokumentasie of gedeeltes daarvan gebruik word.