De Linux / Unix kommando ferwacht

Ferwacht is in programma dat oerienkomt nei oare ynteraktive programma's neffens in skript. Nei it skript begrypt Ekspekt wat kin wurde fan in programma ferwachte en wat de goeie antwurd wêze moat. In ynterpretearre taal biedt twingende en hege nivo kontrolstrukturen om it dialooch te rjochtsjen. Dêrnjonken kin de brûker kontrôle kontrolearje en direksjoneel ynteraktearje as jo wolle, nei't it kommando kontrolearje nei it skript.

Expectk is in mingfoarm fan Ekspert en Tk. It behannelet krekt lykas Ekspect en Tk's winsk. Ferwacht kin ek direkt yn C of C ++ brûkt wurde sûnder Tcl.

De namme "Ekspekt" komt fanút it idee fan fergunning / ferwachte folchoarders popularisearre troch uucp, kermit en oare modemkontrogramma's. Jo kinne lykwols oars as uucp ferwachtsje, sadat it kin as gebrûk fan brûkersnivo mei elke programma en taak yn 'e gedicht útfierd wurde. Ferwachtet kin tagelyk mei ferskate programma's prate.

Wat kin ferwachtsje kinne

Bygelyks hjir binne wat dingen dy't it kommando ferwachtsje kinne dwaan:

Der binne in ferskaat oan reden wêrom't de shell dizze taken net útfiere kin. Alle binne mooglik mei ferwachting.

Yn it algemien is Ekspert nuttich foar it programmearjen fan programma dy't fermelding tusken programma en brûker nedich is. Alles dat nedich is dat de ynteraksje kin programmatysk karakterisearre wurde. Ferwachting kin ek kontrôle jaan oan de brûker sûnder dat it programma kontrolearre wurdt. Lykwols, de brûker kin elk momint op it skript kontrolearje.

Gebrûk

Ferwiderje lês cmdfile foar in list mei kommando's om út te fieren. Ferwachting kin miskien ymplisite opsysteem wurde op systemen dy't de # stypje! Notysje troch it skript te markearjen as útfierber en meitsje de earste line yn it skript:

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

Fansels moat it paad beskiedend wurde beskôgje wêr't Ekspect libbet. / usr / local / bin is gewoan in foarbyld.

De flagge -c befettet in kommando om foar elk yn it skript útfierd wurde. It kommando moat sjoen wurde om te foarkommen dat se troch it shell te brekken binne. Dizze opsje kin meardere kearen brûkt wurde. Meardere kommando's kinne útfierd wurde mei in single -c troch it te trenen mei semikolons. Kommando's wurde útfierd yn 'e oarder dy't se ferskine. Wannear't Expectk brûkt wurdt dizze opsje as kommando bepaald.

De -d flag jout in pear diagnostyske útfier, dy't primêre ynterne aktiviteit fan kommando's rapporteart, lykas ferwachting en ynteraktyf. Dizze flagge hat deselde effekt as "exp_internal 1" oan it begjin fan in Skriptútfange, plus de ferzje fan Ekspekt is gedrukt.

De -D flag makket in ynteraktive debugger. In integerwearde moat folgje. De debugger sil kontrôle nimme foardat de neikommende Tcl-proseduere as de wearde net-nul is of as in ^ C gedrukt is of in breakpoint opnij is, of in oare passende debugger kommando ferskynt yn it skript. Wannear't Expectk brûkt wurdt dizze opsje as - Debug.

De -f flag prestearret in bestân wêr't jo befetsje lêze. De flagge sels is opsjoneel as it allinich nuttich is by it brûken fan de #! Notaasje, sadat oare arguminten op 'e kommandorigel levere wurde kinne. Wannear't Expectk brûkt wurdt dizze opsje as -file.

Standert is it befetsje triem yn it ûnthâld lêzen en útfierd yn syn gehiel. It is wolris winsklik dat jo triemmen ien line lêze op in stuit. Om jo wizigingen op te slaan, kinne jo de -b flagge brûke. Wannear't Expectk brûkt wurdt dizze opsje as -buffer oantsjutte.

As de snaar "-" wurdt as in triemnamme levert, wurdt standert ynfier lans ynsteld. Brûk "./-" om te lêzen fan in triem dat eins "-" neamd wurdt.

De flagge -i feroarsaket ynteraktyf opfrege foar kommando's ynstee fan it lêzen fan in bestân. Ferfanger wurdt beëinige fia it útfierkommando of op EOF. De -i flagge wurdt oannommen as gjin kommando-bestân noch -c brûkt wurdt. Wannear't Expectk brûkt wurdt dizze opsje as ynteraktyf.

- kin brûkt wurde om it ein fan 'e opsjes te beheinen. Dit is handich as jo in opsje-as-argumint foar jo skript trochjaan wolle, sûnder dat troch Ekspert ynterpretearre wurdt. Dit kin gebrûk makke wurde yn 'e #! line om gjin flinke betsjutting te fertsjinjen troch Ekspert. Bygelyks, de folgjende sil de oarspronklike arguminten ynklusyf de skriptnam yn 'e fariabele argv litte .

#! / usr / local / bin / ferwachtsje -

Tink derom dat de gewoane getopt (3) en útfiere (2) konvinsjes moatte bepaald wurde by it tafoegjen fan arguminten nei de #! rigel.

De triem $ exp_library / expect.rc wurdt automatysk as present oanwêzich, útsein it -N flag is brûkt. (Wannear't Expectk brûkt wurdt dizze opsje as -NORC oantsjutte.) Dêrnei is de triem ~ / .expect.rc automatysk sertifikaat, behalve de -n flagge wurdt brûkt. As de omjouwingsfariabele DOTDIR definiearre is, wurdt it behannele as in triemtafel en .expect.rc wurdt lêzen fan dêr. Wannear't Expectk brûkt wurdt dizze opsje as -norc oantsjutte. Dit sourcing komt allinich nei it útfieren fan -C-flaggen.

-v feroarsake De ferwachting fan it ferwiderjen nûmer en útgong. De oerienkommende flagge yn Ekspectk, dy't lange flaggenamme brûkt, is -ferzje.

Opsjonele args wurde yn in list oanlein en bewarre yn 'e fariabele nammen argv en. argc wurdt inisjalisearre foar de lingte fan argv.

Argv0 is definiearre om de namme fan it skript of binêr te wêzen as gjin skript brûkt wurdt. Bygelyks de folgjende printsje de namme fan it skript en de earste trije arguminten:

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

Kommando's

Ferwachtet gebrûk fan Tool Command Language. Tcl jout kontrôle flux (as, foar, brek), ekspresje evaluaasje en ferskate oare funksjes lykas recursion en proseduere definysje. Kommando's hjir brûkt, mar net definieare (set, as, exec) binne Tcl-kommando's. Ferwiderje stipe ekstra kommando's. Sûnder oare oantsjuttings krijden kommando's de lege string werom.

Kommando's wurde alfabetysk lizzend sadat se fluch lizze kinne. Mar nije brûkers kinne lykwols makliker begjinne om te begjinnen troch it lêzen fan 'e beskriuwingen fan oprop, ferstjoeren, te ferwachtsjen en te ynterakke, yn dy folchoarder.

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

slút de ferbining mei it aktive proses . De measte ynteraktive programma's sille EOF op har stin en útgong fine; sadat gewoan meast ticht is om it proses te deadzjen. De -i flagge ferklearret it proses om oerienkomst te sluten oan de neamde spawn_id.

Beide ferwachtsje en ynteraksje sille sjen as it hjoeddeistige proses útfiert en ymplisearret in ticht, mar as jo it proses trochbliuwe, sizze, "exec kill kill pid", moatte jo dúdlik rjochtsje .

De flagge -onexec bepaalt oft de opjaan id is yn elke nije opnommen prosessen sluten of as it proses oergien is. Om in opspring-ID iepen te setten, brûk de wearde 0. In net-nul-integer-wearde makket de opslach yn elke nije prosessen sletten.

De flagge -slave slúte de slave dy't ferbûn is mei de oplaach id. As de ferbining sletten is, wurdt de slave automatysk sluten as it noch iepen is.

Nawol of de ferbining is implicitly of explicitly sluten, moat jo wachtsje neame om de oerienkommende kernel proses te heljen. It tichte kommando hjit wachtsjen om't der gjin garânsje is dat it sluten fan in prosesferbining it feroarsaket.

debug [[-now] 0 | 1]

Kontrolearret in Tcl-debugger wêrtroch jo troch ferklearrings stappe kinne en breakpoints setten.

Mei gjin arguminten wurdt in 1 weromjûn as de debugger net rint, oars wurdt in 0 weromjûn.

Mei in argumint wurdt de debugger úteinsetten. Mei in argument 0 wurdt de debugger stoppe. As in argumint foarôfhannele wurdt troch de -ny-flagge, wurdt de debugger fuortdaliks begon. Oars wurdt de debugger begon mei de kommende Tcl-statement.

It kommando-debugel feroaret gjin traps. Fergelykje dit om te begjinnen Begjin mei de -D flag.

It kommando-ferbining ferbelt in fergroeid proses fan it terminal . It bliuwt op 'e eftergrûn. It proses wurdt jûn oan in eigen prosesgroep. Standert I / O is omlaat nei / dev / null .

It folgjende fragmint brûkt trening foar it fuorthellen fan it skript op 'e eftergrûn.

as {{fork]! = 0} ôfslút ôfslute. . .

It folgjende skript lêze in wachtwurd en rint dan in programma elke oere dy't eltse kear as in wachtwurd begjint. It skript fersoarget it wachtwurd, sadat jo allinich it type ynfiere moatte.

send_user "wachtwurd? \" expect_user -re "(. *) \ n" foar {} 1 {} {if {[fork]! = 0} {sliepte 3600; trochslach} skiede priv_prog ferwiderje wachtwurd: send "$ expect_out ( 1, string) \ r ". . . exit}

In foardiel foar it brûken fan 'e skelpen asynchroone prosesfunksje (&) is ûndertekene (&) is dat ferwachte kinne de terminalparameters foardat de ôfsluting bewarre en letter se nei nije ptys tapasse. Mei & Ferwacht hat net in kans om de parameters fan de terminal te lêzen, omdat it terminal no al ferbûn is mei de tiid ferwachtset Kontrôle.

ôfslach [-opts] [status]

oarsaken ferwachtsje om út te gean of oars te meitsjen om dat te dwaan.

De -onexit flag laket it folgjende argumint as brûkt wurde as útgongspartner. Sûnder argumint wurdt de aktive útgongsperson weromjûn.

De flagge -noexit feroarsaket te ferwachtsjen om te ferwiderjen, mar stoppe fan koarte termyn werom nei it bestjoeringssysteem. De brûker-befeilige útgongspartner rint lykas Expect's eigen ynterne handlers. Gjin fierdere ferwachte kommando's moatte útfierd wurde. Dit is handich as jo wurkje ferwachtsje mei oare Tcl-útwreidings. De hjoeddeistige interpreter (en haadfenster as yn 't Tk-omjouwing) bliuwt sa dat oare Tcl-útwreidingen opnij kinne opjaan. As de útgong fan 'e útfining wer opnij is (lykwols kin dit foarkomme), wurde de handlers net ferwidere.

Nei it útgean, wurde alle ferbinings nei spannende prosessen sluten. Closure sil as EOF fûn wurde troch spannende prosessen. It útgean nimt gjin oare hannelingen fierder wat de normale _exit (2) proseduere docht. Dêrmei kinne spannende prosessen dy't net kontrolearje foar EOF kinne trochgean. (In ferskaat oan betingsten is wichtich om te bepalen, lykas bygelyks wat sinjaal in ferrjochte proses wurde stjoerd, mar dizze binne systeem-ôfhinklik, typysk dokuminteare ûnder útgong (3).) Spûnte prosessen dy't trochgean wurde ferfolle troch init.

status (of 0 as net oantsjutte) wurdt weromjûn as de útgongstatus fan " Ekspert" . Utgong is implicitly útfierd as it ein fan it skript berikt is.

Exp_Continue [-kontinue_timer]
It kommando exp_continue kin ferwachtsje dat it trochgean kin trochgean as it weromkommt as it normaal soe. As standert wurdt eks-kontrôle de tiidtiidtiid weromset . De flagge -kontinint_timer befetsje de timer net werombetelle. (Sjoch ferwachtsje foar mear ynformaasje.)

Exp_internal [-f triem] wearde
feroaret fierder kommando's om diagnostyske ynformaasje ynternasjonaal te stjoeren nei Ekspert nei stderr as wearde is net-nul. Dizze útfier is útskeakele as de wearde is 0. De diagnostykynformaasje befettet elke karakter dy't ûntfongen is, en elke besykjen is makke om de aktuele útfier te passen tsjin de patroanen.

As de opsjele triem oanbean wurdt, wurdt alle normale en útbrekkingsútfier yn dizze triem skreaun (ûnôfhinklik fan de wearde wearde ). Elk foarôfgeande diagnoseútfier bestân is sluten.

De flagge -info feroaret eks-ynterne om in beskriuwing fan de lêste resinte not-info-arguminten werom te jaan.

Exp_open [args] [-i spawn_id]
jout in Tcl-triem-identifier werom dy't de orizjinele oplaach id is. De triemkenner kin dan brûkt wurde as as it iepene is troch Tcl's iepen kommando. (De opdracht id soe net langer brûkt wurde. In wachtsjen moat net útfierd wurde.

De -leaveopen- flagge ferlit de opmaak id foar tagong iepenje troch Ekspertkommando's. In wachtsjen moat útfierd wurde op 'e punt id.

Exp_pid [-i spawn_id]
jout de prozese-id werom as it hjoeddeistich begonende proses is. As de -i- flagge brûkt wurdt, komt de pid werom oan dy fan de opjûne triem-id.

Exp_send
is in alias foar ferstjoeren .

Exp_send_error
is in alias foar send_error .

Exp_send_log
is in alias foar send_log .

Exp_send_tty
is in alias foar send_tty .

Exp_send_user
is in alias foar send_user .

Exp_version [[-exit] ferzje]
is brûkber foar it garjen dat it skript kompatibel is mei de aktuele ferzje fan Ekspert.

Mei gjin arguminten wurdt de aktuele ferzje fan Ekspect weromjûn. Dizze ferzje kin dan yn jo skript kodearre wurde. As jo ​​eins wite dat jo gjin funksjes fan resinte ferzjes brûke, kinne jo in eardere ferzje opjaan.

Ferzjes besteane út trije nûmers, skieden troch punten. Earst is it wichtige nûmer. Skripten skreaun foar ferzjes fan Ekspert mei in ferskillende wichtige nûmer sille hast wis net wurkje. Exp_version jout in flater werom as de grutte getallen net oerien binne.

Twadde is it minne nûmer. Skripten skreaun foar in ferzje mei in gruttere minder nûmer dan de aktuele ferzje kin ôfhinklik wêze fan wat nije funksje en kin net útfiere. Exp_version jout in flater werom as de grutte nûmers oerienkomme, mar it skript minder nûmer is grutter as dat fan 'e útfierende ferwachte .

Tredde is in nûmer dy't gjin diel hat yn 'e ferzje fan fergelykjen. It wurdt lykwols opset as de ferifikaasje fan it fertsjinwurdigjen fan sertifikaten op elke manier feroare wurdt, lykas troch ekstra dokumintaasje of optimisaasje. It wurdt op elke nije minder ferzje op 0 werom set.

Mei de -exit flagge, ferwachtet de ferwidering in flater, en ferwachtet as de ferzje is fanút datum.

ferwachtsje [[-opts] pat1 body1] ... [-opts] patn [bodyn]
Wachtt oant ien fan 'e patroanen it útfier fan in spannende proses oerienkomt, in bepaalde tiidperioade is passe, of in ein-ferdiel is sjoen. As it lêste lichem leech is, kin it wegere wurde.

Patterns út it lêste kommandum fan expect_before wurde implicitly brûkt foar elke oare patroanen. Patterns fan it lêste ferwachtend efterkommende kommando wurde implicitly brûkt nei alle oare patroanen.

As de arguminten nei de folsleine ferwachtingsferklearring mear as ien line negearje, dan kinne alle arguminten "ynsteld wurde" yn ien om sadwaande elk line mei in efterkant te stopjen. Yn dat iene gefal sil de gewoane Tcl-substitúsjes nettsjinsteande de puzels komme.

As in patroan it keyword is, dan wurdt it oerienkommende lichem útfiert op 'e ein fan' e bestân. As in patroan is it tiidstip foar keyword, wurdt it oerienkommende lichem útfierd op termyn. As der gjin tapassing fan 'e timeout brûkt wurdt, wurdt in ymplisite null-aksje útfierd op termyn. De standerttiidperioade is 10 sekonden mar kin set wurde, bygelyks op 30, troch it kommando "settiid 30". In trochgeande tiidlimte kin oanjûn wurde troch de wearde -1. As in patroan is it standerttaal foar keyword, wurdt it oerienkommende lichem útfierd op beide terminen of ein-of-bestân.

As in patroanen oerienkomt, dan wurdt it oerienkommende lichem útfierd. Ferwachte jout it resultaat fan it lichem werom (of de lege string as gjin patroanen oanpast). Yn it gefal dat meardere patroanen oerienkomme, wurdt de earste dy't brûkt wurdt foar it selektearjen fan in lichem.

Elke kear as nije útfier komt, wurdt it fergelike mei elke patroan yn 'e oarder dy se opnommen wurde. Sa kinne jo besykje foar it ûntbrekken fan in wedstriid troch it lêste patroan wat te garandearjen, lykas in prompt. Yn situaasjes wêr't gjin inkelde promoasje is, moatte jo tiidlimyt brûke (krekt as jo wolle as jo in manuaal ynteraktyf binne).

Patterns wurde oanjûn op trije wizen. Standert binne patroanen as spesifisearre as Tcl 's string-oerienkomst . (Sa'n patroanen binne ek ferlykber mei C-shell reguliere útdrukkingen dy't meastentiids neamd wurde as "glob" patroanen). De flagge -g kin miskien wurde brûkt om beskermen te beskermjen dy't oars kinne ferwachtsje flaggen fan dat dwaan. Alle patroanen dy't begjinne mei in "-" moatte dizze manier beskerme wurde. (Alle stringen begjinne mei "-" binne reservearre foar takomstige opsjes.)

Bygelyks, it folgjende fragmint sjocht nei in súksesfol logint. (Tink derom dat ôfbrutsen wurdt as in proseduere foar oaren yn it skript definiearre.)

ferwachtsje {busy {set busy \ n; Exp_Continue} mislearre "ûnjildich wachtwurd" ôfbrekke ôfbrekke ôfbrekke ôfbrekke}

Kursussen binne nedich op it fjirde patroan, omdat it in romte befettet, wat oars soe it patroan fan 'e aksje ôfsûnderje. Patterns mei deselde aksje (lykas de 3e en 4e) ferwachtsje de werjeften opnij. Dit kin foarkomme mei it brûken fan regexp-stylpatroanen (sjoch hjirûnder). Mear ynformaasje oer it meitsjen fan glob-stylmuster kin fûn wurde yn it hantlieding fan Tcl.

Regexp-stylpatroanen folgje it syntaksje dat troch Tcl's regexp definiearre is (koart foar "reguliere ekspresje") kommando. Regexp-patroanen binne yntrodusearre mei de flagge -re . It foarige foarbyld kin wergebrûkt wurde mei in regexp as:

ferwachtsje {busy {set busy \ n; Exp_Continue} -re "mislearre | ûnjildich wachtwurd" ôfbrekke tiidtiid ôfbrutsen ferbûn}

Beide soarten fan patroanen binne "ûnbewust". Dit betsjut dat patroanen net de folsleine string passe, mar kinne de wedstriid oeral yn 'e string begjinne en beëinigje (sa lang as alles oanjout). Brûk '^ om it begjin fan in string te passen, en $ om it ein te passen. Tink derom dat as jo net wachtsje op it ein fan in string, kinne jo antwurden maklik yn 'e midden fan' e snaar einigje, lykas se opnommen binne út it ferrinnende proses. Hoewol it produkt fan korrekte resultaten kin de útfier unnaturaal sjen. Dêrtroch wurdt it gebrûk fan $ oanbean as jo de tekens krekt beskriuwe kinne oan it ein fan in string.

Tink derom dat yn in soad bewurkers de ^ en $ oer it begjin en ein fan 'e linen oerienkomme. Om't lykwols gjin line rjochte is, passe dizze karakters it begjin en ein fan 'e gegevens oer (yn tsjinstelling ta linen) op it stuit yn' e ferwachtende oerienkommende puffer. (Sjoch ek de notysje hjirûnder op "systeem-fersmoarging.")

De flagge -ex ferwacht it patroanen as in "krekte" tekenrige. Gjin ynterpretaasje fan *, ^, etc wurdt makke (hoewol de usual Tcl-konvenanten noch beoardiele wurde). Algemiene patroanen binne altyd unhandige.

De flagge -nocase feroaret haadletters fan 'e útfier nei fergelykjen as as se lytse letters binne. It patroan is net beynfloede.

By it lêzen fan output kinne mear as 2000 bytes kinne earder bytes twinge om "fergetten" te wurden. Dit kin feroare wurde mei de funksje match_max . (Tink derom dat oerlissende grutte wearden de patroanen opnimme.) As patlist is full_buffer , wurdt de oerienkommende lokaasje útfierd as match_max bytes ûntfongen en gjin oare patroanen hawwe oanjûn. Of oft it full_buffer- kaaiwurd brûkt wurdt, wurde de fergetten ferwizings skreaun oan ferwachtsje (puffer).

As patlist is it kaaiwurd nul , en nulden binne tastien (fia it befetsje remove_nulls ), wurdt it oergeunstige lichem útfierd as in inkele ASCII 0 oerienkommt. It is net mooglik om 0 bytes oer glob of regexp-patroanen te passen.

As jo ​​in tekenrige (of eof of full_buffer) oanmeitsje, wurdt alle oerienkommende en earder ûnpost útfier ynsteld yn 'e variable ferwachting (buffer) . Oant 9 regexp-substring-wedstriden wurde bewarre yn de variables ferwachting (1, string) fia expect_out (9, string) . As de -indices flag brûkt wurdt foardat in patroan is, wurde de begjinnende en einigde indices (yn in foarm foar passende rang ) fan 'e 10 strings bewarre yn de variables ferwachting (X, start) en ferwachting (X, ein) wêr't X in stifting, oerienkomt mei de substringposysje yn 'e puffer. 0 ferwiist nei stringen dy't oerienkomme mei it hiele patroan en wurdt generearre foar glob-patroanen lykas regexp-patroanen. Bygelyks as in proses output fan "abcdefgh \ n" produkt hat, it resultaat fan:

ferwachtsje "cd"

is as de folgjende útsûndering útfierd wie:

Set wait_out (0, string) cd set expect_out (buffer) abcd

en "efgh \ n" is yn 'e útfier buffer ferlitten. As in proses de útfier "abbbcabkkkka \ n" makke, is it resultaat fan:

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

is as de folgjende útsûndering útfierd wie:

set wait_out (0, start) 1 set expect_out (0, ein) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, ein) 3 set expect_out (1, string) bb set waitout (2, start) 10 set expect_out (2, ein) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

en "in \ n" is yn 'e útfier buffer ferlitten. It patroan "*" (en -re ". *") Sil de útfier-puffer flústelje sûnder mear output út it proses te lêzen.

Normaal is de oerienkommende útfier út 'e ynterne puffer ferwidere. Dit kin foarkommen wurde troch it prefixearjen fan in patroanen mei de -notransfer flagge. Dizze flagge is benammen nuttich yn te eksperiminearjen (en kin ôfkoarte wurde foar "-not" foar befoardering ûnder it eksperiminearjen).

De oplaach id is ferbûn mei de oerienkommende útfier (of eof of full_buffer) wurdt opslein yn expect_out (spawn_id) .

De -timeout flag laket it aktuele ferwacht kommando om de folgjende wearde te brûken as in tiidslimyt ynstee fan it brûken fan de wearde fan de tiidmoarger.

Standert binne patroanen oerienkomme mei de útfier fan 'e aktive prozess, lykwols de -i flagge ferklearret de útfier fan de neamde spawn_id-list mei elk folgjende patroanen (oant de neikommende -i ). De spawn_id-list moat wêze as in willekeppele list fan spawn_ids of in fariabele referinsje mei sokke list fan spawn_ids.

Bygelyks, it folgjende foarbyld waacht foar "ferbûn" fan it aktive proses, of "drok", "mislearre" of "ûnjildich wachtwurd" fan 'e spawn_id neamd troch $ proc2.

ferwachtsje {-i $ proc2 beset {set beset \ n; Exp_Continue} -re "mislearre | ûnjildich wachtwurd" ôfbrekke tiidtiid ôfbrutsen ferbûn}

De wearde fan 'e globale fariabele any_spawn_id kin brûkt wurde om patroanen oer te passen mei elke spawn_ids dy't nammentlik binne mei alle oare -e flaggen yn it aktuele ferwacht kommando. De spawn_id fan in -e flagge mei gjin assosjearre patroanen (dus folge fuortendaliks troch in oar -i ) wurdt beskikber steld oan oare oare patroanen yn deselde ferwacht kommando dy't ferbûn is mei any_spawn_id.

De flagge -i kin ek in globale fariabele neame yn hokker gefal de fariabele is lêzen foar in list fan opnamen. De fariabele is fergees as it feroaret. Dit soarget in manier foar feroaring fan de I / O boarne, wylst it kommando yn útfiering is. Spawn-ids dy't dizze manier soene wurde neamd "yndirekte" opnamen.

Aksjes lykas brek en fuorrestruktuerstrukturen (dęr, foar proc ) behannelje op 'e gewoane manier. It kommando exp_continue kin ferwachtsje dat it trochgean kin trochgean as it weromkommt as it normaal soe.

Dit is nuttich foar it foarkommen fan eksplisite loops of repetearret ferwachtingen. It folgjende foarbyld is in ûnderdiel fan in fragmint om automatisearjende rlogin te automatisearjen. De eks-kontrôle ferwachtet dat jo in twadde ferwachtsjende deklaraasje skriuwe (nei de prompt nei te sykjen) as de rlogin opfreget foar in wachtwurd.

ferwachtsje {password: {stty-echo send_user "wachtwurd (foar $ brûker) op $ host:" expect_user -re "(. *) \ n" send_user "\ n" ferstjoere "$ expect_out (1, string) \ r" stty echo exp_continue} incorrect {send_user "unjildich wachtwurd of akkount \ n" exit} timeout {send_user "ferbining nei $ host timed út \ n" exit} eof {send_user \ "ferbining mei host mislearre: $ expect_out (buffer)" exit} re $ prompt}

Bygelyks it neikommende fragmint kin in brûker helpe mei in ynteraksje dy't al hielendal automatisearre is. Yn dit gefal wurdt it terminal yn 'e rûte modus set. As de brûker "+" drukket, wurdt in fariant opsetten. As "p" drukke wurdt, wurde ferskate returns nei it proses stjoerd, faaks om it op ien of oare manier te pokearjen, en "i" liedt de brûker ynteressearje mei it proses, en effektyf stekt de kontrôle út it skript. Yn elk gefal jout de eks-kontrôle de aktuele ferwachting om troch te stjoeren fan patroanen nei it útfieren fan de aktuele aksje.

stty raw -echo expect_after {-i $ user_spawn_id "p" {stjoerde \ r \ r \ r "; Exp_Continue} "+" {in fo foo; exp_continue} "i" {interact; Exp_Continue} "quit" exit}

Standert is res_continue de tiidtiidtiid weromset . De timer is net opnij starte, as exp_continue wurdt neamd mei de -continue_timer flagge.

[p.
wurket identysk mei de ferwachting ~ útsein dat as as patroanen fan beide ferwachtsje en ferwachtsje_after kinne oerienkomme, wurdt it ferwachte patroan brûkt. Sjoch it kommando expect_before foar mear ynformaasje.

ferwachtsje [back_args]
nimt deselde arguminten as ferwachtsje , lykwols giet it fuortendaliks werom. Patterns wurde besprutsen as jo nije ynput arrivearje. De ôfbyldingtiid en standert binne sûnder ferwidere nei expect_background en wurde stil fuortsmiten. Oarspronklik begjint it ferwachting fan ' e weromkommende ferwachting ferwachting fan' e ferwachting en ferwachting neigeraden as ferwachts .

As expected_background aksjes evaluearre wurde, wurdt eftergrûnferwurking foar deselde spawn-id bewarre. Eftergrûnferwurking is blokkearre as de aksje foltôget. Wylst de eftergrûnferwurking blokkearre is, is it mooglik om in (foargrûn) te ferwachtsjen op deselde publike id.

It is net mooglik om in ferwachting út te fieren , wylst in ferwachting_blêd is blokkearre. It ferwachtsjen fan eftergrûn foar in bepaalde oprop id is fuortsmiten troch in nije ferwachting werom te meitsjen mei deselde spawn id. It ferklearjen fan expect_background mei gjin patroan fuortsmiten de opjûne tredde id fan 'e mooglikheid om patroanen op' e eftergrûn te passe.

expect_before [herkingsargels]
nimt deselde arguminten as ferwachtsje , lykwols giet it fuortendaliks werom. Pattern-aksje-pairs fan 'e nijste ferwachting_ foar foarkommen mei deselde spawn-id wurde implicitly tafoege oan alle folgjende kommando's ferwachtsje . As in patroan oerienkomt, wurdt it behannele as as it ynfierd waard yn it ferwachtkommando sels, en it assosjearre lichem wurdt útfierd yn 't kontekst fan it ferwacht kommando. As patroanen fan beide ferwachting ~ foar en ferwachtsje kinne oerienkomme, wurdt it expect_before- patroan brûkt.

As der gjin bepaalde patroon is oanjûn, wurdt de rol id net kontrolearre foar elke patroanen.

Untbrekke troch in -e flagge, ferwachtsje_ foar foardielen oerienkomst tsjin de opjûne id definieare yn 'e tiid dat it kommando expect_before útfierd is (net as it patroan oanpast wurdt).

De flagge -info laket expect_before om de aktuele spesjaliteit werom te jaan fan wat patroanen it oerienkomt. Standert is it berjocht oer de aktuele oprop id. In opsjonele spawn-id-specifikaasje kin jûn wurde foar ynformaasje oer dy ûntginnings-id. Bygelyks

wait_before -info -i $ proc

Op 'e measte ien spawn id specification kin jûn wurde. De flagge - yndirekte fergrieme direkte spawn-eids dy't allinich út indirekte spesifikaasjes komme.

Yn stee fan in spelling-id-specifikaasje sil de flagge "-al" "-info" feroarsaakje om alle rapportaazjes te rapportearjen.

De útfier fan 'e -info flag kin brûkt wurde as argumint foar ferwachting.

expect_tty [expect_args]
is lykas ferwachtsje, mar it lêzen tekens fan / dev / tty (dus it toetseboerd fan 'e brûker). Standert is it lêzen útfierd yn kocht modus. Sa moatte de rigels ende moatte mei in weromkomming om har te ferwachtsjen om se te sjen. Dit kin troch stty feroare wurde (sjoch it stiest befetsje hjirûnder).

expect_user [u005e]
is lykas ferwachtsje, mar it lêzen tekenjen fan stdin (dus it toetseboerd fan 'e brûker). Standert is it lêzen útfierd yn kocht modus. Sa moatte de rigels ende moatte mei in weromkomming om har te ferwachtsjen om se te sjen. Dit kin troch stty feroare wurde (sjoch it stiest befetsje hjirûnder).

foarke
ûntstiet in nij proses . It nije proses is in krektlyk eksimplaar fan it hjoeddeiske ferwachtsproses . Op it súkses bringt gabel 0 werom nei it nije (bern) proses en jout de proses- ID fan it bern proses werom nei de âlderproses. Op fluggens (allinich troch mishanneling fan middels, bygelyks de opmaakromte, ûnthâld), gout de weromkommende -1 werom nei it âlderproses, en gjin bernproses is ûntstien.

Forkearde prozes ferlitte fia it útfierkommando , krekt as it orizjinele proses . Ferkearde prosessen kinne tastien wurde nei de log-bestannen. As jo ​​de measte fan 'e prosessen net debuggen of ynlogd meitsje, kin it resultaat miskien wêze.

Guon pty-ymplementaasjes kinne ferwiderje wurde troch meardere lêzers en skriuwers, ek op it stuit. Dêrtroch is it safier foar gabel foar spanningsprosessen.

ynterakt [string1 body1] ... [stringn [bodyn]]
jout de kontrôle fan it aktive proses oan de brûker, sadat de toetsoarten nei it aktive proses stjoerd wurde , en de stdout en stederr fan it aktuele proses wurde weromjûn.

String-bodypearen kinne as arguminten oanjûn wurde, yn hokker gefal wurdt it lichem útfierd as de oerienkommende string ynfierd is. (Standert is de tekenrige net stjoerd nei it aktive proses .) It kommando fan it interpreter wurdt feroare, as it lêste lokaasje ûntbrekt.

As de arguminten foar de folsleine ynteraksearje freegje mear as ien line, dan kinne alle arguminten "yn 'e rêch" yn ien wurde soene wurde om gjin line te begjinnen mei in backslash. Yn dat iene gefal sil de gewoane Tcl-substitúsjes nettsjinsteande de puzels komme.

Bygelyks, it kommende kommando ferdwiert ynterakke mei de neifolgjende string-lokaaspaers definiearre: As ^ Z wurdt drukke, wurdt Ekspakt bewarre. (De -reset flagg restore de terminal modus.) As A ^ gedrukt wurdt, sjocht de brûker "jo hawwe in kontrole-A" en it proses wurdt in ^ A stjoerd. As $ druk is, sjocht de brûker de datum. As C ^ gedrukt wurdt, ferwachtet er út. As "foo" ynfierd wurdt, sjocht de brûker "bar". Wannear ~~ gedrukt wurdt, laitsje de Expect- oersetter ynteraktyf.

Set CTRLZ \ 032 ynterakt {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "jo hawwe in kontrole-A \ n" typearre; Stjoer "\ 001"} $ {send_user "De datum is [klokfoarm [klok sekonden]]."} \ 003 exit foo {send_user "bar"} ~~}

Yn string-lichemsparren wurde stringen oerienkomme yn 'e oarder dat se as arguminten neamd binne. Strings dy't diels oerienkomme wurde net nei it aktive proses stjoerd yn 'e oanhâlding fan' e oare weromkomst. As persoanen dus ynfierd wurde dat der net mear in match kin wêze, allinich it diel fan 'e snaar wurde stjoerd nei it proses dat net in oare wedstriid kin begjinne. Sa kinne stringen dy't substrings fan parsjele wedstriden binne mei-elkoar pleatse, as de orizjinele tekeningen dy't besykje te passen te wêzen, úteinlik mislearre.

Standert is string oerienkomst krekt sûnder wyld kaarten . (Hjirtroch is it ferwachtkommando gebrûk fan glob-styl-ôfbyldings standert.) De -ex flagge kin brûkt wurde om beskermen te beskermjen dy't mooglik oanjaan kinne fan flags fanwege it dwaan. Alle patroanen dy't begjinne mei in "-" moatte dizze manier beskerme wurde. (Alle stringen begjinne mei "-" binne reservearre foar takomstige opsjes.)

De flagge fan 'e sektrekket de string om as in regexp-stylmuster te ynterpretearje. Yn dit gefal binne passende substrings opsjoneele yn 'e fariabele interact-út lykas de wize ferwachte dat de útfier yn' e ferhege ferwachting is . De -indices flag is lykwols stipe.

It patroan ef stribbet in aksje dy't útfiert wurdt as ein-of-bestân. In aparte eof- pattern kin ek de -útfier- flagge folgje yn hokker gefal it oanjûn is as in eof ûntdutsen wurdt by it útfieren fan output. De standert eofakt is "weromkommend", sadat ynteraksje ienfâldich weromkommt nei alle EOF.

De ôfbyldingtiid yntrodusearret in tiidslimyt (yn sekonden) en aksje dy't útfiert wurdt neidat gjin tekens foar in bepaalde tiid lêzen binne. It tiidmjittingsmoadel jildt foar it lêsten fan it lêste oantsjutte proses Der is gjin standerttiid. De spesjale fariabele "timeout" (brûkber troch it ferwacht kommando) hat gjin ynfloed op dizze tiidlim.

Bygelyks de folgjende deklaraasje kin brûkt wurde om autologen te brûken brûkers dy't gjin inkelde oeren nûmere hawwe, mar dy't hieltyd faak systeemsynstallaasjes krije:

interact -input $ user_spawn_id timeout 3600 return -output \ $ spawn_id

As it patroan is it kaaiwurd nul , en nulden binne tastien (fia it befetsje remove_nulls ), wurdt it oerienkommende lichem útfierd as in single ASCII 0 oerienkommt. It is net mooglik om 0 bytes oer glob of regexp-patroanen te passen.

It prefearjen fan in patroanen mei de flagge- frijheid feroaret de fariabele interact_out (spawn_id) te setten oan de spawn_id dy't it patroanen (of eof) oandwaan.

Aksjes lykas brek en fuorrestruktuerstrukturen (dęr, foar proc ) behannelje op 'e gewoane manier. Wolwêzen werom bringt ynterakt om werom te gean nei syn oprop, wylst inter_return ynterakt makket om in weromkomming yn syn oprop te feroarjen. Bygelyks as "proc foo" ynterakt hjitte, dy't doe de aksje ynterpretearje , wurdt foech werom fooien . (Dit betsjut dat as ynteractearje fan petearen ynterpretearje ynteraktyf typearjende weromreis sil de ynteraksje ferwachtsje om fierder te gean, wylst inter_return de ynterakt feroarsake om werom te gean nei syn oprop.)

Yn 't ynteraksje wurdt roze modus brûkt om alle personaazjes fia it aktive proses passe te wurden. As it hjoeddeiske proses gjin buroblêdsignalen fynt, sil it stopje as it in stoppelsignat is (standert ^ Z). Om it op 'e nij te meitsjen, stjoer in fierdere sinjalte (lykas troch "kill -CONT"). As jo ​​in SIGSTOP echt nei sa'n proses stjoere wolle (troch ^ Z), besykje it spawning csh earst en dan it programma út. Oan 'e oare kant, as jo in SIGSTOP wolle ferwachtsje , ferwiderje jo earst in interpreter (miskien troch in fluchtoets te brûken), en druk dan op ^ Z.

String-korpertypen kinne brûkt wurde as skermje om foar te kommen dat jo de interpreter yntsjinne hawwe en kommando's ynaktyf útfiere. De eardere terminalemodus wurdt brûkt as it lichem fan in string-lokaalpaar útfierd wurdt.

Foar fluggens wurkje aksjes yn standert modus troch standert. De -reset- flagel ferwacht de terminal yn 'e modus dat it foardat in ynterakt is foltôge (unyk, kocht modus). Tink derom dat tekens ynfierd wurde as de wiziging wizige is ferlern gien (in ûngelokkige eigenskip fan 'e terminaltriem op guon systemen). De iennichste reden om te brûken -reset is as jo hanneling hinget ôf te rinnen yn 'e cooked mode.

De -echo flagge ferstjoert perselen dy't it folgjende tekenbalke passe by it proses dat se oanmakke hawwe as elke karakter lêzen wurdt. Dit kin handich wêze as de brûker feedback fan diels te typen hat.

As in patroan echoed is, mar úteinlik net oerienkommt, wurde de personaazjes stjoerd nei it ferrinnende proses . As it opnommen proses dêrtroch foarkaakt, sil de brûker de tekens twa kear sjogge. -echo is wierskynlik allinich te passen yn sitewaasjes dêr't de brûker net wierskynlik it patroan net foltôge. Bygelyks, it folgjende ekspert is fan rftp, it rekursyf-ftp-skript, wêrtroch de brûker yndrukke is om ~ g, ~ p, of ~ l te gean, om it aktive triem te rekreaasjen, te fertsjen, te pleatsen of te listjen. Dit binne sa fier fuort fan 'e normale ftp-kommando's, dat de brûker net wierskynlik is ta te typen ~ negeare wat oars, útsein miskien, yn hokker gefal, sille se wierskynlik allinich it resultaat bewarje.

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

De -nobuffer flagge ferstjoert perselen dy't it folgjende tekenbalke passeare nei it útfieringsproses as tekens wurde lêzen.

Dit is nuttich as jo in programma repetearje wolle op it patroan. Bygelyks kin de folgjende brûkt wurde om te kontrolearjen wêr't in persoan dialoart is (in Hayes-styl modem). Elke kear as "atd" is sjoen it skript log de rest fan de line.

\ log "{interact -nobuffer -re" (. *

Troch ynterakt wurdt it eardere gebrûk fan log_user bewarre. Benammen ynterakt sil syn útfier krêft wurde (bewarre wurde nei de standertútfier) ​​om't it oanpast is dat de brûker gjin blêd ynteressearje wol.

De flagge -o feroarsake alle folgjende kaaipod-pairs dy't tapast wurde foar de útfier fan it aktive proses . Dit kin handich wêze, bygelyks by it omgean mei hosts dy't ûnwillekeurige karakters stjoere by in telnet sesje.

Standert is it interaktyf fan ' e brûker it skriuwen fan stdin en it lêzen fan it Ekspect- proses sels te lêzen. De flagge -u (foar "brûker") makket ynteraksje foar de brûker yn te sykjen as it proses dat troch syn argumint neamd is (dat moat in spûnde id wêze moatte).

Dit soarget foar twa unûntwerpende prosessen te kombinearjen sûnder in eksplisite rigel te brûken. Om te helpen yn debuggen, ferwachtsje Diagnostyk altyd nei stderr (of stdout foar bepaalde logging- en debugging-ynformaasje). Foar deselde reden wurdt it kommando- interpreter ynteraktyf lêzen fan stdin.

Bygelyks, it folgjende fragmint skeaket in loginproses. Dan dialoart de brûker (net werjûn), en ferstean litte beide mei elkoar. Fansels kin elk proses ynsteld wurde foar oanmelding. In shell, bygelyks, soe de brûker besykje te wurkjen sûnder in akkount en wachtwurd te leverjen.

spawn login set login $ spawn_id spawn tip modem # dial werom nei brûker # ferbining brûker ynloggen interact -u $ ynloggen

Om de útfier nei meardere prozesses te stjoeren, listje elk rapportlistlist foar in prefak fan in -útfier- flagge. Input foar in groep útfier-útdrukkingsdielen kin bepaald wurde troch in spawn-id-list foar in prefaze fan in -ynfierflagge . ( Saw-ynput en -útput kin lûden yn deselde foarm as de -e flagge yn it kommando ferwachtsje , útsein dat any_spawn_id is net betsjuttend yn ynteract.) Alle folgjende flaggen en stringen (of patroanen) tapasse op dizze ynfier oant in oare - Ynfier flagge ferskynt. As der gjin- ynput ferskynt, -útput betsjut "-ynput $ user_spawn_id -output". (Lykas mei patroanen dy 't gjin- ynfoe hawwe .) As ien- ynfoezje spesifisearre, it oerskriuwt $ user_spawn_id. As in twadde ynfier opjûn is, it oerskriuwt $ spawn_id. Oanfoljende ynfier- flaggen kinne oanjûn wurde.

De twa implike ynfierprosessen standert standert om har útfieringen as $ spawn_id en $ user_spawn_id (yn reverse) neamd. As in ynfier- flagge ferskynt mei gjin -útfier- flagge, wurde tekens fan dat proses ôfslein .

De flagge -i befettet in ferfanging foar de aktuele spawn_id as gjin oare ynfier- of útfierflaggen brûkt wurde. A -i flagge betsjut in -e flagge.

It is mooglik om de prosessen te feroarjen dy't ynterakke wurde mei troch yndirekte yndirekte opdielen. (Yndirekte spawn-eids wurde beskreaun yn 'e seksje oer de kommando fan ferwachting.) Yndirekte spawn-eids kinne spesifisearre wurde mei de -i, -u, -input, of -output flaggen.

interpreter [args]
feroarsaket de brûker ynteraktyf opfrege foar Befestigings- en Tcl-kommando's. It resultaat fan elke kommando is bedreaun.

Aksjes lykas brek en fuorrestruktuerstrukturen (dęr, foar proc ) behannelje op 'e gewoane manier. Wolwêzen feroaret tolken om werom te reitsjen nei syn oprop, wylst inter_return it interpreter bewurket om in weromkomming yn syn oprop te litten. Bygelyks, as "proc foo" neamde interpreter dy't de aksje ynterkrekte doe útfierd, soe foech werom foardat . Elk oare kommando docht ta interpreter om troch te kommen foar nije kommando's.

Standert stiet de prompt om twa inallen. De earste ynteger beskriuwt de djipte fan 'e evaluaasje-stap (dus, hoefolle kearen Tcl_Eval neamd wurdt). De twadde ynteger is de Tcl skiedniskenner. De prompt kin set wurde troch it definiearjen fan in proseduere dy't 'prompt1' hjit, waans weromkommende wearde de kommende promoasje wurdt. As in ferklearring iepenpunt hat, parens, pylken, of klokken, wurdt in twadde sekonden (troch standert "+>") útjûn op nijeline. De sekondêre opsje kin set wurde troch it definiearjen fan in prosedure mei "prompt2".

Yn 't interpreter wurdt gekocht modus brûkt, ek as de syn antwurd brûkt roze modus.

As stdin sletten is, sil tolemer weromkomst wurde as it -ef flag brûkt wurdt, yn hokker gefal it opfolgjende argumint opnommen wurdt.

log_file [args] [[-a] triem]
As in triemnamme bean wurdt, sille log_file in transkript fan 'e sesje opnimme (begjinnend op dat punt) yn de triem. log_file sil opnij stopje as gjin argumint jûn wurdt. Elke foarige logtriem is sluten.

Yn stee fan in filename kin in Tcl- triemkenner beskikber steld wurde troch de -open of -leaveopen- flaggen te brûken. Dit is fergelykber mei it opjaan . (Sjoch foar mear ynfo.)

De -a flagge ferdrach de útfier dy't oanmeld is dat troch it Befêstigje log_user ûnderdrukt waard.

Standert is it kommando log_file oan âlde bestannen taheakke as it ferfangen fan dizze, foar it befeiligjen fan it ynloggen fan jo opnij en meardere kearen yn ien sesje. Om triemmen te ferwurkjen, brûke jo de -noappend flag.

De flagge -info laket log_file om in beskriuwing fan de lêste resinte not-info arguminten werom te jaan.

log_user-info | 0 | 1
Standert is it ferstjoeren / ferwachtsje dialooch logged as stdout (en in logfile as iepen). De logging to stdout is útskeakele troch it kommando "log_user 0" en wer opnij troch "log_user 1". It loggen yn it lochbestân is net wizige.

De flagge-ynfo laket log_user om in beskriuwing fan de lêste resinte not-info arguminten werom te jaan.

match_max [-d] [-i spawn_id] [grutte]
definiearret de grutte fan de buffer (yn bytes) ynterne gebrûk troch te ferwachtsjen . Mei gjin argumintgrutte wurdt de aktuele grutte weromjûn.

Mei de -d flagge wurdt de standertgrutte ynsteld. (De earste standert is 2000.) Mei de -i flagge wurdt de grutte ynsteld foar de namme rûn id, oars wurdt it ynsteld foar it aktive proses .

overlay [- # spawn_id] [- # spawn_id] [...] programma [args]
útfiert "programma args" yn plak fan it aktueel programma " Ekspert ", dy't ôfslacht. In flugge argumint krigen in binde foar it kommando-namme as wie it in ynlochshell. Alle spawn_ids binne sletten útsletten foar dejingen dy't as arguminten neamd wurde. Dizze wurde mapd op de nammen triembehearder.

Spawn_ids wurde mapdere nei triembehearder foar it nije programma om te erfenjen. Bygelyks, de folgjende line rint sjaak en jout it troch te kontrolearjen troch it aktive proses - siz, in skealmaster.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id skaak

Dit is effisjinter as "interact -u", mar it makket it fermogen om programmearre ynteraksje te dwaan, om't it ferwachtsproses net mear yn kontrôle is.

Tink derom dat gjin kontrolearjende terminal oanbean wurdt. As jo ​​de standertynfier ferwiderje of opnij oanmeitsje, programma's dy't taakkontrôle (shells, ynloggen, etc) wurkje net goed.

parity [-d] [-i spawn_id] [wearde]
definiearret oft parityt behannele wurde moat of ôfstutsen wurde fan 'e útfier fan' e spannende prosessen. As wearde is nul, parity is ôfset, oars wurdt it net ôfstutsen. Mei gjin wearde argumint wurdt de aktuele wearde weromjûn.

Mei de -d flagge wurdt de standert paritywet ynsteld. (De earste standert is 1, dus, pariteit is net ôfstutsen.) Mei de -i flagge wurdt de paritytwearde ynsteld foar de namme rûn id, oars wurdt it ynsteld foar it aktive proses .

remove_nulls [-d] [-i spawn_id] [wearde]
definiearret oft nulnen bewarre binne of útfierd binne fan 'e útfier fan' e spannende prosessen foardat it patroanen oanpast of yn it variable reservearje of ferwachtsje . As wearde is 1, wurde nulsen fuortsmiten. As wearde is 0, nulden wurde net fuorthelle. Mei gjin wearde argumint wurdt de aktuele wearde weromjûn.

Mei de -d flagge wurdt de standertwearde ynsteld. (De earste standert is 1, dus, nul is fuortsmiten.) Mei de -i flagge wurdt de wearde ynsteld foar de namme rûn id, oars wurdt it ynsteld foar it aktive proses .

Of of net nulnen binne fuortsmiten, sil Ereks nul bytes opjaan oan it log en stdout.

stjoere [-flaggen] string
Sendt string nei it aktive proses . Bygelyks it kommando

Stjoer "hallo wrâld \ r"

Stjoer de karakters, helloworld nei it aktive proses . (Tcl befettet in printf-like kommando (neamd formaat ) dy't arbitrêr komplekse stringen bouwe kin.)

Lettertypen wurde fuortstjoerd, hoewol programma's mei line-buffered ynfier lêze de tekens net lêze oant in weromkommend karakter stjoerd wurdt. In weromkommend karakter wurdt oanjûn "\ r".

De flagge ferliest it folgjende argumint om te interpretearjen as in string as in flagge. Eltse snoek kin foarôfgeand wêze fan "-" of as it net eins liket as in flagge. Dit leveret in betrouwensmechanisme om fariabele stringen te jaan, sûnder dat útdrukt wurdt troch dyjingen dy't ûngelok as flaggen sjen. (Alle stringen begjinne mei "-" binne reservearre foar takomstige opsjes.)

De -i flagge ferklearret dat de stam wurde stjoerd nei de neamde spawn_id. As de spawn_id brûk is user_spawn_id , en it terminal is yn rauwe modus, wurde nije linen yn 'e tekenrige oersetten nei weromkommende syllen soenen se ferskine as de terminal wie yn cooked modus. De flagge -woe skeakelet dizze oersetting.

De -null flagel stjoert nul-tekens (0 bytes). Standert is ien nul stjoerd. In integer kin de -nul folgje om oan te jaan hoefolle nulls stjoere.

De -breakflater generearret in breakbrekstân. Dit allinne betsjuttet as de opjaan-id ferwize nei in tty-apparaat geöffene fia "spawn -open". As jo ​​in proses lykas tip hawwe, hawwe jo gebrûk fan tip-konvention foar it meitsjen fan in brek.

De flagge laket de útfier om "stadich" te stjoeren, dus de mienskiplike situaasje te foarkommen wêrtroch in kompjûter in ynput-puffer útmakket dy't ûntwurpen is foar in minske dy't gjin deselde puffer koe . Dizze útfier wurdt behearske troch de wearde fan de fariabele "send_slow" dy't in twa elemint list nimt. It earste elemint is in ynteger dy't it oantal bytes beskriuwt om atomysk te stjoeren. It twadde elemint is in echte nûmer dat it oantal sekonden beskriuwt wêrby't de atomyske stjoerder skieden wurde moat. Bygelyks, "set_slow {10 .001} set" soe "send-s" twinge om strings mei 1 millisekond yn te stjoeren tusken elke 10 tekens dy't ferstjoerd binne.

De -h flag krijt útfier omút te litten (in gewicht) as in minske dy't eins typearret. Persoanlike ferlies ferskine tusken de personaazjes. (De algoritme is basearre op in Weibull-ôfdieling, mei wizigingen foar dizze bepaalde applikaasje.) Dizze útfier wurdt behearske troch de wearde fan 'e variable "send_human" dy't in fiif elemint list nimt. De earste twa eleminten binne gemiddelde ynterarrival tiid fan tekens yn sekonden. De earste wurdt standert brûkt. De twadde wurd brûkt by wurdendingen, om de subtile pauses te simulearjen dy't gelegenheid by sokke transysjes foarkomme. De tredde parameter is in mjitting fan ferfarskens wêr 't 1 feroare is, 1 is ferstannich fariabele, en 10 is hiel invariabele. De ekstremmen binne 0 oant ynfinityf. De lêste twa parameters binne respektivelik in minimale en maksimale ynterarrivaltiid. De minimale en maksimale wurde lêste brûkt en "klipje" de lêste tiid. De ultimative gemiddelde kin hielendal ôfwike fan 'e gegevens oerienkomst as de minimale en maksimale klip genôch wearden is.

As foarbyld, emigrearret de folgjende kommando in flugge en konsistint typist:

set sendhuman {.1 .3 1 .05 2} stjoer -h "Ik haw hongerje, lit ús lunch dwaan."

wylst de neifolgjende binne gaadliker nei in kjeld:

set sendhuman {.4 .4 .2 .5 100} stjoere -h "Goodd partij lash nacht!"

Taljochting: flater is net simulearre, hoewol jo kinne ferkearssekritsyske situaasjes sels ynstelle troch ynbrekken fan fekânsen en korrizjearingen yn in stjoer argumint te meitsjen.

De flaggen foar it stjoeren fan nulele tekens, foar it stjoeren fan breaks, om it stadige útfier te ferstrutsjen en foar it útstel fan 'e minsklike styl binne weidzjes eksklusyf. Allinich de lêste oantsjutte wurdt brûkt. Fierder kin gjin stringargumint oanjûn wurde mei de flaggen foar it ferstjoeren nul-teken of brekken.

It is in goede idee om de earste te stjoeren nei in proses troch in ferwachting . ferwachtsje sil wachtsje op it proses om te begjinnen, wylst se stjoere kin net. Benammen as de earste stjoer foar it begjinnen fan it proses foltôge, dan rjochtsje jo it risiko dat jo jo gegevens negeare hawwe. Yn situaasjes dêr't ynteraktive programma 's gjin earste prompt oanbiede, kinne jo foarôfgeande ferstjoere troch in ferfal as yn:

# Om foarkommen fan hackers hintsjes oer hoe te brekken, # dit systeem freget net foar in eksterne wachtwurd. # Wacht foar 5 sekonden foar útfiere om kompleet telnet tige fêst te meitsjen

Exp_send is in alias foar ferstjoeren. As jo ​​Expectk brûke of in oare fariant fan Ekspert yn 't Tk-omjouwing, stjoere is troch Tk definieare foar in folslein oare doel. Exp_send wurdt foar kompatibiliteit tusken omjouwings oanbean. Fergelykbere aliases wurde foar oare oare ferstjoeren fan 'e berjochten fertsjintwurdige.

send_error [-flaggen] string
is as stjoer , útsein dat de útfier nei sterdr wurde stjoerd as it aktive proses .

send_log [-] string
is as ferstjoere , útsein dat de tekenrjocht allinich nei de logfile ferstjoerd wurdt (sjoch log_file .) De arguminten wurde bewarre as der gjin log triem iepen is.

send_tty [-flaggen] string
is as stjoere , útsein dat de útfier ferstjoert is / dev / tty as it aktive proses .

send_user [-flaggen] string
is as stjoere , útsein dat de útfier nei stdout stjoerd wurdt as it aktive proses .

sliepe sekonden
feroaret it skript om te sliepen foar it opjûne oantal sekonden. Sekonden kinne in desimaal nûmer wêze. Interrupten (en Tk-eveneminten as jo brûke Expectk) wurde ferwidere as ferwachtet sliept.

spawn [args] programma [args]
ûntstiet in nij proses dat "programa args" útfiert. It stdin, stdout en stderr binne ferbûn mei Ekspekt, sadat se lêzen wurde en skreaun wurde troch oare ferfarsk- kommando's. De ferbining is brutsen troch ticht of as it proses sels elk fan 'e triembehearder slút.

Wannear't in proses begon is troch opheljen, wurdt de fariabele spawn_id ynsteld oan in descriptor dy't ferwize nei dy proses . It proses beskreaun troch spawn_id wurdt beskôge as 'hjoeddeistich proses '. spawn_id kin lêzen of skreaun wurde, yn wurking fan jobkontrôle .

user_spawn_id is in globale fariabele mei in descriptor dy't ferwize nei de brûker. Bygelyks, as spawn_id op dizze wearde set wurdt, ferwachtsje gedachten as expect_user .

Ik error_spawn_id is in globale fariabele wêryn in descriptor is dy't ferwiisd nei de standert fout. Bygelyks, as spawn_id op dizze wearde stelt, ferstjoere jo it ferstjoeren as send_error .

tty_spawn_id is in globale fariabele mei in descriptor dy't ferwiist nei dev / tty. As / dev / tty bestiet net (lykas yn in cron, at, of bart skript), dan is tty_spawn_id net definiearre. Dit kin wurde besprutsen as:

as {{info vars tty_spawn_id]} {# / dev / tty} oars {# / dev / tty bestiet net # wierskynlik yn cron, batch, of yn skript}

spawn jout de UNIX- proses id. As der gjin proses is, wurdt 0 weromjûn. De fariabele spawn_out (slave, namme) wurdt ynsteld op de namme fan it pty-slave-apparaat.

Standert stiet de opmaak de kommando-namme en arguminten. De -noecho flagge stopet út 'e docht.

De flagge fan console feroarsake konsole-útfier omlaat wurde te litten nei it opnommen proses . Dit wurdt net stipe op alle systemen.

Yntern, brûkte pûde in pty, ymplisearret deselde manier as de tty's brûker. Dit is fierder ynitialisearre sadat alle ynstellings "sane" binne (neffens stty (1)). As de fariabele stty_init definiearre is, wurdt it ynterpretearre yn 'e styl fan stty arguminten as fierdere konfiguraasje. Bygelyks, "sette stty_init rûge" sille fierder útwreide farsteande triemmen yn 'e rûte starte. -nottycopy skip de ynitialisaasje basearre op it tty's brûker. -nottyinit skip de "sane" ynstallaasje.

Gewoanlik sprekt de oplieding net in soad tiid om út te fieren. As jo ​​opsjes bepale dat in tekenrige tiid nedich is, dan wurdt it wierskynlik op plysjes te finen dy't wekke wurde. In oantal testen wurde op plysjes rinne om beperking mei ferwiderjende prosessen te foarkommen. (Dit nimme 10 sekonden per wedged pty.) Running Wa't mei de -d- opsje sil sjen litte as Expect in protte ptys yn 'e strange status stiet. As jo ​​de prozessen net oanmeitsje, wêrnei't dizze plysjes oanbean wurde, kin jo inkelde rekursje wêze om te ferfangen.

As programma net mei súkses útskeakele wurde om't exec (2) net slagget (bygelyks as programma net bestiet), sil in flater berjocht weromjûn wurde troch de kommende ynterakt of kommando te ferwachtsjen as as programma foltôge waard en de foutmelding as útfier makke. Dit gedrach is in natuerlike konsekwinsje fan 'e ymplemintaasje fan' e romp . Yn it ynternasjonaal spoaiende fekken, wêrnei't it spannende proses gjin manier hat om te kommunisearjen mei it orizjinele Waaksproses , útsein troch kommunikaasje fia de spawn_id.

De flagge -open feroarsaket it folgjende argument om te ynterpretearje as in tcl-triem-identifier (dus, troch wer iepenbiere .) De opdracht-id kin dan brûkt wurde as it in ferrûn proseduere wie . (De triembehearder moat net langer brûkt wurde.) Dit kin jo rûge apparaten, triemmen en pipelines behannelje as spannende prosessen sûnder in pty te brûken. 0 is weromjûn om oan te jaan dat der gjin assosjearre proses is . Wannear't de ferbining mei it spannende proses sluten is, sa is de Tcl triembehearder. De flagge -leaveopen is fergelykber mei -open, útsein dat -leaveopen feroarsake de triembehearder iepen te litten sels nei de opdracht id is sluten.

De lege flagge feroaret in pty om te iepenjen, mar gjin proseduere ûntstiet. 0 is weromjûn om oan te jaan dat der gjin assosjearre proses is . Spawn_id stiet as gewoan.

De fariabele spawn_out (slave, fd) wurdt ynsteld oan in triemkenner dy't oerienkomt mei de pty-slave. It kin sluten wurde mei "slach -slave".

De flagge -ignore nimt in sinjaal dat yn 'e rûnte proses ignorearre wurde . Oars wurde de sinjalen de standertgedrach krije. Seldsjes wurde neamd as yn it trapbehear , útsein dat elke sinjaal in aparte flagge freget.

straatnivo
feroaret nei folgjende ferklearrings te printsjen foardat it útfierd is. (Tcl's spoarkommandant sprekt fariabelen.) Nivo jout oan hoe hoe fier yn 'e oprop stap wurdt nei spoaren. Bygelyks, it folgjende kommando lûkt Ekspekt, wylst de earste 4 nivo's opnij kontrolearje, mar gjin ûnderste dat.

ferwachtsje -c "strace 4" script.exp

De flagge-ynfo laket straf om in beskriuwing fan de lêste resinte not-info arguminten werom te jaan.

stty args
feroare terminal-moden lykas it ekstern stty-kommando.

Standert is it kontrolearjen terminal tagong. Oare terminalen kinne tagonklik wurde troch te ferwiderjen "Requests for status weromkomme as resultaat fan it kommando. As der gjin status frege wurdt en de kontrolearjende terminal tagong is, wurdt de foarige status fan de rûge- en echo-attributen weromjûn yn in formulier dy't letter kin wurde brûkt troch it kommando.

Bygelyks de arguminten dy't rau of kocht sette it terminal yn 'e rûte modus. De arguminten - jo of kocht sette de terminal yn kocht modus. De arguminten echo en -echo sette it terminal yn respon en noecho modus respektivelik.

It folgjende foarbyld illustratearret hoe't tydlik it echojen útsette sil. Dit kin brûkt wurde yn oarspronklike automatyske skripts om mis te gebrûk fan wachtwurden yn harren. (Sjoch mear diskusje oer dit ûnder EXPECT HINTS hjirûnder.)

stty -echo send_user "Wachtwurd:" expect_user -re "(. *) \ n" set wachtwurd $ expect_out (1, string) stty echo

system args
jout args oan sh (1) as ynput, krekt as as it typearre wie as kommando fan in terminal. Ferwachtt waakst oant de shell beendet wurdt. De weromkomstestatus fan sh wurdt behannele sa't dyselde eftergrûn ha dat de rjochterstatus behannelet.

Yn tsjinstelling mei eksekúsje dy't stdin en stdout nei it skript trochferwizearret, stjoert it systeem gjin omlaat (oars as it oanjûn troch de string sels). Sa is it mooglik om programma's te brûken dy't streekrjocht moatte prate mei / dev / tty. Om deselde reden binne de resultaten fan it systeem net opnommen yn 't log.

timestamp [args]
jout in timestamp werom. Mei gjin arguminten is it oantal sekonden sûnt de perioade weromjûn.

De flagge -format pleatst in string dy't weromjûn is mar mei substitúsjes makke neffens de POSIX-regels foar strftime. Bygelyks% a wurdt ferfongen troch in ôfwikselde wykeinamme (sa, Sat). Oare binne:

% in ôfkoarte wearde fan 'e dei% A In folsleine namme fan de dei% b ôfkardearre moanneName B folsleine moanneName c Datum-tiid as yn: Wed 6 oktober 11:45:56 1993% d dei fan' e moanne (01-31% h oere (00-23)% I oere (01-12)% j dei (001-366)% m moanne (01-12)% M minút (00-59)% p am of pm% S twadde (00-61) % u dei (1-7, moandei is earste dei fan 'e wike)% U wike (00-53, earste snein is earste dei fan wike ien)% V wike (01-53, ISO 8601 styl) 6)% W wike (00-53, earste moandei is de earste dei fan 'e wike ien)% x datum as yn: ma 6 okt 1993% X tiid as yn: 23:59:59% y jier (00-99) % Y jier as yn: 1993% Z tiidzone (of neat as net fêststelle) %% in blank persint teken

Oare% spesifikaasjes binne net definieare. Oare karakters wurde troch ûnberikber trochjûn. Allinnich de C-locale wurdt stipe.

De flagge -second yntrodusearret in oantal sekonden sûnt de perioade as boarne brûkt wurd fan it formaat. Oars, wurdt de aktuele tiid brûkt.

De -gmt flag makket timestamp output om de GMT- timezone te brûken. Mei gjin flagge wurdt de lokale tiidsône brûkt.

trap [[kommando] -signalen]
feroarsake it opjûne kommando om útfierd wurde te kinnen op takomstige ûntfangst fan ien fan 'e opjûne sinjalen. It kommando wurdt útfierd yn 'e globale omfang. As kommando net falt, wurdt de sinjaal aksje weromjûn. As kommando is de snaar SIG_IGN, wurde de sinjalen ignorearre. As kommando is de tekenrige SIG_DFL binne de sinjalen resultaat foar de standert systeem. sinjalen binne as ien inkeld sinjaal of in list fan sinjalen. Signalen kinne numerike of symboalysk as per sinjalte (3) spesifisearre wurde. It prefix "SIG" kin wegere wurde.

Mei gjin arguminten (of argument -number) jout de trap de sinjaalnûmer werom fan it trapkommando dat op it stuit dien wurdt.

De -code flag brûkt it weromkommenskoade fan it kommando yn plak fan hokker koade Tcl joech om werom te gean as it kommando oarspronklik útein sette.

De flagge -interp feroarsake it kommando om te evaluearjen mei de ynterpret dy't aktyf is yn 'e tiid dat it kommando begon wie as doe't de falle ferklearre waard.

De flagge fan 'e nammen feroarsake it trapkommando om de sinjaalnammen fan it trapkommando werom te finnen dat no útfierd wurdt.

De flagge -maks feroaret it trapkommando om it grutste sinjaalnûmer werom te jaan dat kinne ynsteld wurde.

Bygelyks, it kommando "trap {send_user" Ouch! "} SIGINT" sil drukke "Ouch!" elke kear de brûker drukket ^ C.

Standert is SIGINT (dy't normaal genereard wurde kin troch druk op C) en SIGTERM-ferwachting te ferwachtsjen om út te gean. Dit is dus de folgjende trap, dy't standert makke wurdt as Begint begjint.

trapútút {SIGINT SIGTERM}

As jo ​​de -D flag brûke om de debugger te begjinnen, wurdt SIGINT werfine om de interaktive debugger te begjinnen. Dit is dus de folgjende trap:

trap {exp_debug 1} SIGINT

De debugger-trap kin feroare wurde troch de omjouwingsfariabele EXPECT_DEBUG_INIT te setten nei in nije trapbehear.

Jo kinne fansels ek dizze beide gewoanwei oerskriuwe troch taheakke kommando's ta te stipe nei jo skript. Benammen as jo jo eigen "trapútgong SIGINT" hawwe, sille dit de debugger trap oerskriuwe. Dit is handich as jo brûke wolle dat de brûkers fan 'e debugger hielendal komme.

As jo ​​jo eigen trap op SIGINT definiearje wolle, mar jo wolle de debugger noch hannelje as it rint, brûk dan:

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

Alternatyf kinne jo de debugger mei in oar sinjaal falle.

Trap lit jo de aksje foar SIGALRM net oerskriuwe lykas dizze ynterne brûkt wurdt nei Ekspekt . De kommando-ferbining befettet SIGALRM oan SIG_IGN (ignoreren). Jo kinne dizze opnij ferlernich wêze as jo it útskeakelje foar de folgjende opsommingsbehearders.

Sjoch in sinjaal (3) foar mear ynfo.

wacht [args]
Verzorgt oant in spannende proses (of it hjoeddeistige proses as nimmen neamd wurdt) terminearret.

Wacht gewoan werom as in list fan fjouwer integers. De earste ynteger is de pid fan it proses dat wachte waard. De twadde ynteger is de oerienkommende oprop id. De tredde ynteger is -1 as in mislearre systeembehearder misdien is of 0 oars. As de tredde integer wie 0, dan is de fjirde ynteger de status dy't weromjûn wurdt troch de opnommen proses . As de tredde ynteger wie -1, de fjirde ynteger is de wearde fan errno ynsteld troch it bestjoeringssysteem. De globale fariabele errorCode is ek ynsteld.

Oanfoljende eleminten kinne ferskine op 'e ein fan' e weromkommende wearde fan wachtsjen . In fakultatyf fyfde elemint identifisearret in klasse fan ynformaasje. Op it stuit is de ienige mooglike wearde foar dit elemint CHILDKILLED, yn hokker gefal de neikommende twa wearden binne de C-styl-symnynnamme en in koart tekstual beskriuwing.

De -i flag ferklearret it proses om te wachtsjen te wizen mei de neamde spawn_id (NOT de proses id). Binnen in SIGCHLD-handlers is it mooglik om te wachtsjen op in spannende proses troch it gebrûk fan de oprop id -1.

De flagge -nowait feroaret de wachtwurker fuortendaliks werom mei de yndikaasje fan in suksesfolle wacht. Wannear't it proses útfiert (letter) sil it automatysk ferdwine sûnder de needsaak foar in eksplisite wachttiid.

It kommando wachtsjen kin ek warskôge wurde foar in fergroeid proses mei de arguminten "-i -1". Oars as it gebrûk mei spandere prosessen kin dit kommando op elts momint útfierd wurde. Der is gjin kontrôle oer hokker proses ûntfongen is. De weromkommende wearde kin lykwols kontrolearre wurde foar it proses id.

LIBRARIES

Ferwissigje jo automatysk oer twa ynboude biblioteken foar Skript eksportearje. Dizze wurde bepaald troch de triemtafels dy't yn 'e ferwizings exp_library en exp_exec_library neamd binne. Beide wurde bedoeld om brûkende triemmen te befetsje dy't brûkt wurde troch oare skripts.

exp_library befettet arsjitekte-ûnôfhinklike triemmen. Exp_exec_library befettet arsjitektuer-ôfhinklike bestannen. Ofhinklik fan jo systeem kinne beide mappen folslein leech wêze. It bestean fan it bestân $ exp_exec_library / cat-buffers beskriuwt of as jo / bin / kat buffers standert binne.

PRETTY-PRINTING

In definysje-definysje is beskikber foar moaie print- ferwachte skripts. Asjebleaft de fjerde definysje dy 't jo oanfreget mei de ferwachtingferzje is goed ynstalleare, kinst it brûke as:

vgrind -expect file

EXAMPLES

It is in protte net te sjen hoe't elkoar elkoar pleatst dat de manpage beskriuwt. Ik stimulearje jo om de foarbylden te lêzen en út te probearjen yn 'e foarbyldverzorging fan' e ferwachtingferkear . Guon fan har binne echte programma's. Oaren binne gewoanlik yllustratyf fan gewoane techniken, en fansels, in pear binne gewoan fluch hakken. De triem INSTALLO hat in flugge oersicht fan dizze programma's.

De ekspekt papieren (sjoch SEE ALSO) binne ek nuttich. Wylst inkele papieren gebrûk meitsje fan syntaksis dy't earder ferwizings fan Expect binne, binne de begeliedende rationales noch jildich en gean yn in soad detail mear as dizze man-side.

CAVEATS

Taheaksels kinne kollidearje mei begjinsnammen fan Expect. Bygelyks, ferstjoeren wurdt definiearre troch Tk foar in folslein oare doel. Om dy reden binne de measte fan de kommando's ferwachte ek beskikber as "exp_XXXX". Kommando's en fariabelen begjinne mei "exp", "inter", "spawn", en "timeout" hawwe gjin aliasen. Brûk de ferwidere kommandonammen as jo dizze kompatibiliteit nedich hawwe tusken environmeningen.

Ferwachts nimt in frij liberale besjen fan it skopjen. Hjirtroch wurde fariabelen lêzen troch kommunikaasjes dy't spesifyk binne foar it Expect- programma wurde socht as earste fan 'e lokale omfang, en as net fûn, yn' e globale omfang. Sa ferwytet dit bygelyks de needsaak om 'globale tiidlimyt' yn elke proseduere te meitsjen dy't jo skriuwe dat ferwachtet . Oan 'e oare kant binne skreaune fariabelen altyd yn' e lokale omfang (útsein in "globale" kommando útjûn). It meast foarkommende probleem is dat oarsaak as der rûn wurdt yn in proseduere útfiert. Bûten de proseduere is spawn_id net langer bestean, sadat it spannende proses net mear tagelyk berikber is fanwege it skopjen. Foegje in "global spawn_id" ta sa'n proseduere.

As jo ​​de multyfunksje net ynskeakelje kinne (bgl. Jo systeem stelt noch gjin seleksje (BSD *. *), Poll (SVR> 2), noch wat lykweardich), sil Expect allinich in ien kear op it stuit kontrolearje. Yn dat gefal, probearje net spawn_id , noch moatte jo prosessen troch útfieren útfiere, wylst in ferromming proses útfiert. Fierder kinne jo net mear kinne fan meardere prosessen (lykas de brûker as ien) te ferwachtsjen .

Terminalparameters kinne in grut effekt hawwe op skripten. Bygelyks, as in skript skreaun is om te sjen nei it echojen, sil it misbehave wêze as it echoing útskeakele is. Om dy reden, ferwachtsje de ferfangende parameter parametriêre standertparameters. Spitigernôch kin dit dingen ûngedien meitsje foar oare programma's. As foarbyld wol de emacs-shell de "gewoane" mappen feroarje: nije linen wurde mapd nei nije-linen ynstee fan winkels-weromlizzende nije-linen, en it echoing is útskeakele. Dit kin ien brûk meitsje fan emacs om de ynfierline te bewurkjen. Spitigernôch kin it ferwachtsje dat net mooglik sizze.

Jo kinne freegje om te freegjen De standertynstelling fan terminalparameters net te bewarjen, mar jo moatte dan gewoan omtinken wêze as jo skripts skriuwe foar sokke omjouwing. Yn it gefal fan emacs, ferminderje ôfhinklik fan dingen lykas echoings en ôfslutende mappen.

De kommando's dy't arguminten akseptearre waarden yn in ienige list (de farianten ferwachtsje en ynterakt ) brûke in heuristysk om te besluten as de list in feit is ien argumint of in protte. De heuristyk kin allinich yn it gefal falle as de list eins in inkele argumint fertsjintwurdt dy't meardere ynbêde \ n is mei net-whitespace tekens tusken har. Dit liket genôch ûnbetrouwber te wêzen, lykwols kin it argument "-nobrace" brûkt wurde om in inkele argumint te twingen om as ien argumint te behanneljen. Dit kin foarkommen wurde mei masine-generearre ekspertoade. Lykwols, -romte draacht in inkele argumint om te handen as meardere patroanen / aksjes.

BUGS

It wie echt genôch om it programma "seks" te neamen (foar "Smart EXec" of "Sende-Ekspekt"), mar in goeie betsjutting (of miskien krekt puritanisme).

Op guon systemen, as in shell útset wurdt, klagt it net om tagong te krijen ta de tty, mar rint lykwols. Dit betsjut dat jo systeem in meganisme hat om it kontrolearjen fan tty te ferwachtsjen, dy't ferwachtet net oer. Besykje it wat it is en stjoer dizze ynformaasje werom nei my.

Ultrix 4.1 (op syn minst de lêste ferzjes hjir omhinne) beskôget tiidferhalen fan boppe 1000000 om as 0 te lykweard te wêzen.

Digitale UNIX 4.0A (en wierskynlik oare ferzjes) wegerje om pyt te te foegen as jo in SIGCHLD-handlers bepale. Sjoch opjaan side foar mear ynfo.

IRIX 6.0 behannelet net pty-tagongsrjochten goed, sadat As Expect besykje in pty dy't eartiids troch in oaren oars brûkt wurdt te foegen, it mislearret. Upgrade nei IRIX 6.1.

Telnet (ferwachte allinich ûnder SunOS 4.1.2) hinget as TERM net ynsteld is. Dit is in probleem ûnder cron, by en yn cgi skripten, dy't TERM net bepale. Sa moatte jo it eksplisyt opsette - nei hokker type is meast irrelevant. It moat gewoan wat oanpast wurde! De folgjende wierskynlik foldie foar de measte gefallen.

set env (TERM) vt100

Tip (ferwachte allinich ûnder BSDI BSD / OS 3.1 i386) hinget as SHELL en HOME net ynsteld binne. Dit is in probleem ûnder cron , by en yn cgi skripten, dy't dizze omjouwende fariabelen net definiearje. Sa moatte jo se explicit ynstelle - nei hokker type is meast irrelevant. It moat gewoan wat oanpast wurde! De folgjende wierskynlik foldie foar de measte gefallen.

Set env (SHELL) / bin / sh set env (HOME) / usr / local / bin

Guon ymplementaasjes fan pytys binne ûntworpen sadat de kernel in ûngelikense útfier nei 10 oant 15 sekonden jout (it echte nûmer is útfierend ôfhinklik) neidat it proses de triem-descriptor sluten hat. Sa ferwachtsje programma's lykas

spawn date sliep 20 ferwachtsje

sil mislearre. Om dit te foarkommen, ophelje net ynteraktive programma's mei útfier as e- post . Hoewol sokke situaasjes binne yn te sizzen, yn 'e praktyk haw ik noait in situaasje oanfallen dêr't de definitive útfier fan in wier ynteraktyf programma ferlern waard troch dit gedrach.

Oan 'e oare kant fertsjinje Cray UNICOS-pytysis in unregelmjittige output fuort fuort nei it proses is de triem descriptor sluten. Ik haw dit rapportearre oan Cray en se wurkje op in beheining.

Somtiden is in ferfal nedich tusken in prompt en in antwurd, lykas wannear in tty-ynterface feroaret yn UART-ynstellingen of oerienkommende baardoaten troch te sykjen foar start / stop-bits. Meastal is dit alhiel nedich om in twadde of twa te sliepen. In robústere technyk is om te retearjen oant de hardware klear is om ynput te krijen. It folgjende foarbyld brûkt beide strategyen:

stjoer "rapper 9600 \ r"; sliepe 1 ferwachtsje {timeout {ferstjoere "\ r"; Exp_Continue} $ prompt}

Trap-koade sil net wurkje mei in kommando dat sit yn Tcl's evenemint loop, lykas sliep. It probleem is dat yn 'e barren fan' e barren, Tcl de weromreis-coden út async-event-handlers. In omslach is om in flagge yn 'e trapkoade te setten. Dêrnei kontrolearje de flagge fuortendaliks nei it kommando (dus sleep).

It kommando-ferwachting fan 'e ferwachting ignoret - -twaart arguminten en hat gjin konsept fan terminen yn algemien.

& # 34; EXPECT HINTS & # 34;

Der binne in pear dingen oer Ekspekt dat kin net-yntuityf wêze. Dizze seksje besiket in pear fan 'e dingen te bewegen mei in pear suggestjes.

In mienskiplike ferwachting probleem is hoe't jo de shell-oanfraach erkennen. Om't dizze oarspronklik oanpast wurde troch ferskillende minsken en ferskillende skelpen, kin portabel automatisearring rlogin dreech wêze sûnder de promoasje te witten. In ridlik konvinsje is om brûkers in regelmjittige ekspresje te besjen dy't harren prompt beskriuwt (benammen it ein fan dizze) yn de omjouwingsfariabele EXPECT_PROMPT. Koade lykas de folgjende kin brûkt wurde. As EXPECT_PROMPT net bestiet, hat de koade noch altyd in goede kâns om korrekt te wurken.

Set prompt "(% | # | \\ $) $"; # standert prompt catch {set prompt $ env (EXPECT_PROMPT)} ferwachtsje -re $ prompt

Ik stimulearje jo om ferwachtingen oan te skriuwen , dy't de ein oanjaan fan wat jo ferwachtsje om te sjen. Dit beweecht de mooglikheid om in fraach te beantwurdzjen foar it gesicht fan it hiele ding. Dêrneist kinne jo tagelyk fragen kinne beantwurdzje foardat se se folslein sjen, as jo antwurde, kinne jo antwurd yn 'e midden fan' e fraach weromkomme. Mei oare wurden, de resultaat fan 'e dialooch is korrekt, mar sjoch skrambelje.

De measte prompts jouwe in romte karakter oan 'e ein. Bygelyks, de prompt fan ftp is 'f', 't', 'p', '>' en. Om dizze promo te passen, moatte jo rekkenje foar elke fan dizze tekens. It is in mienskiplik flater om de lege net op te nimmen. Lege de blank yn eksplisyt.

As jo ​​in patroan fan it formulier X * brûke, sil it * alle útfier fan 'e ein fan X oant it lêste ûntfangen ûntfange. Dit klinkt ynduitysk mar kin miskien miskien wêze, om't de útspraak "lêste dingen ûntfangen" kin ôfhinklik fan de snelheid fan 'e kompjûter en de ferwurking fan I / O sawol troch de kernel en de apparaat.

Benammen de minske sjogge de programma-útfier te finen yn grutte rompen (atomysk), as yn 'e wurklikheid de measte programma's in ien rige produsearje op ien kear. Assuming dit is it gefal, de * yn it patroan fan it foarige paragraaf kin allinich it ein fan 'e hjoeddeiske line oantsjutte, alhoewol liket it mear, om't op' e tiid fan 'e wedstriid dat alle útfiering wie dy't ûntfongen wie.

ferwachtsje hat gjin manier om te witten dat in fierdere útfier komt as jo jo patroan spesifyk akkount hat.

Sels lykwols ôfhinklik fan line-orientearre buffering is ûnsichtber. Net allinich meitsje programma's selden beloften oer it type pufferjen dat se dogge, mar systeem ûngeduer kin de útfieringslinen brekke, sadat de linen op ferskate willekeurige plakken brekke. As jo ​​dan de lêste persoanen fan in prompt ekspresje as it skriuwen fan patroanen is, is it wize om dat te dwaan.

As jo ​​in tekenrige wachtsje yn 'e lêste output fan in programma en it programma jout wat oars, dan kinne jo dat net kinne mei it tiidwurden foar keyword. De reden is dat ferwachtsje sil gjin tiidlim wêze - ynstee dêrfan sil in eindindekking krije. Brûk dit ynstee. Sels better, brûke beide. Op dy manier as dizze line ea omhelle wurdt, moatte jo de line sels net bewurkje.

Nijlines wurde normaal konvertearre yn wikseling werom, linefeed-sequins as output troch de terminaltafer. As jo ​​wolle dat in tekenrige is dat explicit de twa rigels is, fanôf sizze printf ("foo \ nbar"), moatte jo it patroan "foo \ rbar" brûke.

In ferlykbere oersetting komt as it lêzen fan de brûker, fia expect_user . Yn dat gefal, as jo drukke op 'e weromkomst, sil it oerset wurde oan in nije line. As it ferwachtsert dan giet dat dan nei in programma dat syn terminal nei rôze modus (lykas telnet) stelt, sil der in probleem wêze, lykas it programma in werklik weromkomt. (Guon programma's fertsjinje yndie dat se automatysk nije linen oerslaan om werom te jaan, mar it measte net.) Leauwe is der gjin manier om te finen dat in programma syn terminal yn rauwe modus set.

Ynstee fan manuell ferfangend nije linen mei weromreis, is de oplossing it kommando "stty raw" te brûken, dat de oersetting stoppe sil. Notysje lykwols dat dit betsjuttet dat jo net mear de cooked-line-editing-funksjes krije.

ynterakt ynteritiske jo terminal nei rûte modus sadat dit probleem dan net ûntstean sil.

It is faak brûk om wachtwurden (of oare privee ynformaasje) te bewarjen yn Skriptopsoarten . Dit is net oan te reden omdat alles wat bewarre is op in kompjûter is oanfallend om tagong te krijen troch elkenien. Sa is in ynteraktyf petear foar wachtwurden út in skript in smarter idee as it letterlik ynbringst. Dochs, soms is sokke ynbettingen de ienige mooglikheid.

Spitigernôch hat it UNIX-bestânsysteem gjin direkte manier om skripts te meitsjen dy't útfierber binne, mar net lêsber. Stelsels dy't stipende skulpskripten stypje kinne yndirekt simpelearje sa as folgjend:

It skript eksportearje (dat de geheime gegevens befettet as gewoan. Meitsje de tagongsrjochten om 750 (-rwxr-x ---) en besykje in fertroude groep, dus in groep dy't it lêze kin. As dat nedich is, meitsje in nije groep foar dat doel. Nim dan in / bin / sh skript mei tagongsrjochten 2751 (-rwxr-s-x) eigendom fan deselde groep as foarich.

It resultaat is in skript dat kin útfiert wurde (en lêze) troch elkenien. As jo ​​oproppe, rint it Skript eksporteel .

& # 34; SEE ALSO & # 34;

Tcl (3), libexpect (3)
"Untdekken fan it begjin: In Tcl-basearre toolkit foar it automatisearjen fan ynteraktive programma's" troch Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly en Associates, 1995.
"ferwachtsje: Hoe't dy ûnkontraalbere pas fan interaktiviteit" troch Don Libes, útfieringen fan 'e simmers 1990 USENIX-konferinsje, Anaheim, Kalifornje, 11-15 juny 1990.
Ik brûkte ferwachting foar it automatisearjen fan systemadministraasje-taken fan Don Libes, útfiering fan 'e Konfiguraasjekonferinsje fan' e Feriene Steaten fan 'e Amerikaanske Uny, Colorado Springs, Colorado, 17-19 oktober 1990.
I "Tcl: An Embeddable Command Language" fan John Ousterhout, Proceedings of the Winter 1990 USENIX-konferinsje, Washington, DC, 22-26 juni 1990. Ik "ferwachtsje: Skripten foar kontrolearje fan interaktyf programma's" troch Don Libes, Computing Systems , Vol. 4, No. 2, University of California Press Journals, novimber 1991..Ie "Regression Testing en Konformance Testing Interactive Programmes", troch Don Libes, Proceedings fan 'e Simmertiid 1992 USENIX Konferinsje, pp. 135-144, San Antonio, TX, 12-15 juni 1992, ik "Kibitz - ferbining mei meardere ynteraktive programma's tegearre", troch Don Libes, Software - Practice & Experience, John Wiley & Sons, West Sussex, Ingelân, Vol.

23, nûmer 5, maaie 1993.I "Debugger foar Tcl Applikaasjes", troch Don Libes, Proceedings fan 'e Tcl / Tk Workshop, Berkeley, CA, 10-11 desimber 1993.

SKRIUWER

Don Libes, Nasjonaal Ynstitút foar Standards and Technology

ACKNOWLEDGMENTS

Mei tank oan John Ousterhout foar Tcl, en Scott Paisley foar ynspiraasje. Mei tank oan Rob Savoye foar it autokonfiguraasjekoade fan Expect.

It HISTORY triem dokumentet in protte fan 'e evolúsje fan ferwachting . It makket in nijsgjirrige lêzing en kin jo jo mear ynsjoch jaan oan dizze software. Mei tank oan de minsken dy't yn 't neamd binne, dy't my bugfixes stjoere en oare help joegen.

Untwerp en ymplemintaasje fan Ekspekt waard dielde troch it Amerikaanske regear en is dêrom yn it publike domein. De skriuwer en NIST wolle lykwols kredyt as dat programma en dokumintaasje of dieltsjes fan har brûkt wurde.