Linux / Unix naredba očekuje

Očekujte je program koji govori drugim interaktivnim programima prema skripti. Nakon skripte, Expect zna što se može očekivati ​​od programa i kakav bi trebao biti točan odgovor. Tumačeni jezik pruža razgranate i visoku razinu kontrolnih struktura za usmjeravanje dijaloga. Osim toga, korisnik može izravno preuzeti kontrolu i komunicirati, a nakon toga vraća kontrolu na skriptu.

Expectk je mješavina Expect i Tk. Ponaša se baš kao i očekivanje i Tkova želja. Očekivanje se također može koristiti izravno u C ili C + + bez Tcl.

Ime "Očekuj" dolazi od ideje send / expect sljedova koje populariziraju uucp, kermit i drugi modemski programi kontrole. Međutim, za razliku od uucp, Expect se generalizira tako da se može pokrenuti kao naredba na razini korisnika s bilo kojim programom i zadatkom na umu. Očekujte može istodobno razgovarati s nekoliko programa.

Što očekivati ​​mogu učiniti

Na primjer, ovdje su neke stvari koje očekuje naredba može učiniti:

Različiti su razlozi zbog kojih školjka ne može obavljati te zadatke. Sve su moguće s očekivanjem.

Općenito, očekuje se korisno za izvođenje bilo kojeg programa koji zahtijeva interakciju između programa i korisnika. Sve što je potrebno je da se interakcija može karakterizirati programski. Očekujte također mogu vratiti kontrolu korisniku bez zaustavljanja programa koji se kontrolira. Slično tome, korisnik može vratiti kontrolu na skriptu u bilo kojem trenutku.

upotreba

Očekivano čita cmdfile za popis naredbi koje treba izvršiti. Očekuje se da se mogu implicitno pozivati ​​na sustave koji podržavaju #! označavanje skripte kao izvršne i izradu prve crte u skripti:

#! / usr / local / bin / očekujete -f

Naravno, put mora točno opisati gdje očekuje život. / usr / local / bin je samo primjer.

-c zastava predodređuje naredbu koja će se izvršiti prije bilo kojeg u skripti. Naredba treba citirati kako bi spriječila razbijanje školjke. Ova se opcija može upotrebljavati više puta. Višestruke naredbe mogu se izvršiti s jednim -c odvajanjem točaka s točkama. Naredbe se izvršavaju redoslijedom kojim se pojavljuju. Kada koristite Expectk, ova opcija je navedena kao -command.

-d zastava omogućuje određeni dijagnostički output, koji prvenstveno izvještava o internoj aktivnosti naredbi kao što su očekivanja i interakcije. Ova zastava ima isti učinak kao "exp_internal 1" na početku skripte Očekuje, a verzija očekuje se.

D-flag omogućuje interaktivan program za ispravljanje pogrešaka. Potrebno je slijediti cijeli broj. Program za otklanjanje pogrešaka preuzima kontrolu prije sljedećeg postupka Tcl ako je vrijednost nulte ili ako se pritisne tipka ^ C ili se prekine točka, ili se u skripti pojavi druga odgovarajuća naredba za ispravljanje pogrešaka. Kada koristite Expectk, ta je opcija navedena kao - Debug.

-f zastava predfazira datoteku iz koje treba čitati naredbe. Zastava sama po sebi je opcija jer je korisna samo kada koristite #! , tako da ostali argumenti mogu biti isporučeni u naredbenom retku. Kada koristite Expectk, ova opcija je specificirana kao -file.

Prema zadanim postavkama, datoteka zapovijedanja se čita u memoriju i izvršava u cijelosti. Ponekad je poželjno čitati datoteke jednu liniju odjednom. Da bi se arbitrarnim datotekama prisilili na rješavanje na ovaj način, koristite tipku -b. Kada koristite Expectk, ta je opcija navedena kao -puffer.

Ako se niz "-" isporučuje kao naziv datoteke, umjesto toga se očitava standardni unos. Koristite "./-" za čitanje iz datoteke koja je zapravo nazvana "-".

Zastava -i uzrokuje očekivati ​​da će interaktivno potaknuti naredbe umjesto da ih čitaju iz datoteke. Zahtjev se prekida putem izlazne naredbe ili EOF-a. Pretpostavlja se da -i zastava ne koristi se naredba niti -c. Kada koristite Expectk, ova opcija je specificirana kao -interaktivna.

- može se upotrijebiti za ograničavanje kraj opcija. To je korisno ako želite proslijediti argument koji je sličan opcijama vašoj skripti bez da ga pretpostavlja tumačenje. To se može korisno staviti u #! line kako bi se spriječilo bilo kakvo značenje tumačenja koje očekuje Expect. Na primjer, sljedeće će ostaviti izvorne argumente uključujući naziv skripte u varijabli argv .

#! / usr / local / bin / očekujemo -

Imajte na umu da uobičajene konvencije getopt (3) i execve (2) moraju biti promatrane kada dodate argumente #! crta.

Datoteka $ exp_library / expect.rc dobiva se automatski ako je prisutna, osim ako se ne koristi oznaka -N. (Kada koristite Expectk, ova opcija je navedena kao -NORC.) Odmah nakon toga, datoteka ~ / .expect.rc dobiva se automatski, osim ako se ne koristi -n oznaka. Ako se definira varijabla okruženja DOTDIR, ona se tretira kao direktorij, a od njega se očita .expect.rc. Kada koristite Expectk, ova opcija je navedena kao -norc. Ovaj izvor dolazi samo nakon izvršavanja bilo kakvih -c flagova.

-v uzrokuje Očekujte da ispisujete njegovu verzijsku broj i izlaz. Odgovarajuća zastava u Expectku, koja koristi duga imena zastavica, jest -verzija.

Izborni argumenti konstruirani su u popis i pohranjeni u varijabli pod nazivom argv i. argc je inicijaliziran na duljinu argv.

Argv0 je definiran kao ime skripte ili binarno ako se ne koristi skripta. Na primjer, slično ispisuje ime skripte i prva tri argumenta:

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

naredbe

Očekujte pomoću alata za upravljanje naredbama. Tcl omogućuje kontrolu protoka (ako, za, break), procjenu ekspresije i nekoliko drugih značajki kao što je definicija rekurzije i procedure. Naredbe koje se ovdje koriste ali nisu definirane (set, if, exec) su Tcl naredbe. Očekujte podržava dodatne naredbe. Ako nije drugačije navedeno, naredbe vraćaju prazan niz.

Naredbe su navedene abecednim redom kako bi se brzo locirale. Međutim, novi korisnici mogu lakše započeti čitanjem opisa mrijesta, slanja, očekivanja i interakcije, u tom redoslijedu.

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

zatvara vezu s trenutnim postupkom . Većina interaktivnih programa će detektirati EOF na svom stdinu i izlazu; tako se obično dovodi do toga da je dovoljno ubijen. Zastava -i izjavljuje da se postupak zatvara u skladu s imenom spawn_id.

Oba očekuju i interakcija će otkriti kada trenutni proces izađe i implicitno zatvoriti, ali ako ubijate taj proces , recimo "exec kill $ pid", trebate izričito nazvati blizu .

Zvona -onexec određuje je li ikra mrijesta zatvoren u bilo kojem novom procesu proizvodnje ili ako je proces prekriven. Da biste ostavili otvor za spašavanje id, upotrijebite vrijednost 0. Vrijednost cijelog nula od nule prisvaja spawn zatvoren u bilo kojem novom procesu.

Zastava -lave zatvara rob povezan s ID-om mrijesta. Kada je veza zatvorena, rob se automatski zatvara i ako je još uvijek otvoren.

Bez obzira je li veza zatvorena implicitno ili eksplicitno, trebali biste nazvati i pričekajte kako biste riješili odgovarajući procesni nastavak kernela. Blokna naredba ne poziva čekanje jer nema jamstva da će zatvaranje procesne veze dovesti do izlaska.

ispravljanje pogrešaka [[-now] 0 | 1]

kontrolira Tcl debugger koji vam omogućuje da korak po izjavama i postaviti breakpoints.

Bez argumenata, 1 se vraća ako debugger ne radi, inače se vraća 0.

Uz jedan argument, započinje debugger. S argumentom 0, debugger je zaustavljen. Ako 1 argument prethodi -nova zastava, debugger se odmah pokreće. Inače, debugger započinje sljedećom Tcl izjavom.

Naredba za uklanjanje pogrešaka ne mijenja zamke. Usporedite ovo s početkom očekujte s oznakom -D.

Naredba za odspajanje odspoji zupčanik iz terminala . Nastavlja se prikazivati ​​u pozadini. Procesu se daje vlastita procesna skupina. Standardni I / O preusmjeren je na / dev / null .

Sljedeći fragment upotrebljava odspajanje kako bi nastavio prikazivati ​​skriptu u pozadini.

ako {[fork]! = 0} izlazi odspojite. , ,

Sljedeća skripta čita lozinku, a zatim pokreće program svaki sat koji zahtijeva lozinku svaki put kada se pokrene. Skripta pruža lozinku tako da ga morate upisati samo jednom.

(slanje) lozinku? \ "expect_user -re" (. *) \ n "za {} 1 {} {ako {[fork]! = 0} {sleep 3600; continue} odspojite spawn priv_prog očekuju Lozinka: pošalji" $ expect_out 1, string) \ r ". , , Izlaz }

Prednost korištenja odspajanja preko asinkronog procesa (&) ljuske je da očekuje da mogu spremiti parametre terminala prije odspajanja, a zatim ih kasnije primijeniti na nove ptys. Sa &, Expect nema priliku pročitati parametre terminala jer je terminator već odspojen do vremena koje očekuje primanje kontrole.

izlaz [-opts] [status]

uzrokuje Izlazak ili se na drugi način pripremite za to.

Zastava -onexit uzrokuje da se sljedeći argument koristi kao izlazni rukovatelj. Bez argumenata, trenutni izlazni rukovatelj se vraća.

-nova zastava uzrokuje očekivati da se pripremi za izlazak, ali se ne zaustavi od stvarnog vraćanja kontrole na operacijski sustav. Pokreće se korisnički definirani izlazni rukovatelj, kao i vlastiti interni rukovatelji tvrtke Expect. Nijedna daljnja očekivana naredba ne bi trebala biti izvršena. Ovo je korisno ako radite Pretpostavljam s drugim proširenjima Tcl. Trenutni tumač (i glavni prozor ako je u Tk okruženju) ostaju tako da ostali Tcl ekstenzije mogu očistiti. Ako se očekuje izlazak Expecta (no to se može dogoditi), rukovatelji se ne preusmjeravaju.

Nakon izlaska, sve su veze na izgrađene procese zatvorene. Zatvaranje će biti otkriveno kao EOF po izgrađenim procesima. izlaz ne poduzima nikakve druge radnje izvan onoga što radi normalni postupak _exit (2). Dakle, generirani procesi koji ne provjeravaju EOF mogu nastaviti s radom. (Različiti uvjeti važni su za određivanje, na primjer, koji signali će biti poslan procesuiranog procesa, ali to ovisi o sustavu, obično dokumentirano iza izlaza (3).) Spawnirani procesi koji se nastavljaju izvoditi bit će naslijeđeni init.

status (ili 0, ako nije navedeno) vraća se kao izlazni status očekuje . izlaz se implicitno izvršava ako se dosegne kraj skripte.

exp_continue [-continue_timer]
Naredba exp_continue omogućuje očeku sebe da nastavi izvršavati umjesto da se vrati kao što bi inače normalno. Prema zadanim postavkama exp_continue vraća vremensko ograničenje vremena. Zastava -continue_timer sprječava ponovno pokretanje timera. (Pogledajte očekujte za više informacija.)

exp_internal [-f datoteku] vrijednost
uzrokuje daljnje naredbe za slanje dijagnostičkih podataka unutar očekivanja za stderr ako vrijednost nije nula. Ovaj izlaz je onemogućen ako je vrijednost 0. Dijagnostički podaci uključuju svaki zaprimljeni znak, a svaki pokušaj usklađivanja trenutnog izlaza s obrascima.

Ako se opcionalna datoteka isporuči, sva normalna izlaza i ispravljanje pogrešaka zapisuju se na tu datoteku (bez obzira na vrijednost vrijednosti ). Bilo koja prethodna dijagnostička izlazna datoteka zatvorena je.

The -info flag uzrokuje exp_internal da vrati opis najnovijih neupotrećenih argumenata.

exp_open [args] [-i spawn_id]
vraća identifikator Tcl datoteke koji odgovara izvornom ID-u spawn. Taj identifikator datoteke može se upotrijebiti kao da je otvorena pomoću Tcl otvorene naredbe. (ID mrijesta više se ne smije koristiti. Čekanje ne smije biti izvršeno.

Zastava -leaveopen ostavlja otvoreni otvor za pristup putem Expect naredbi. Čekanje mora biti izvršeno na datumu mrijesta.

exp_pid [-i spawn_id]
vraća ID procesa koji odgovara trenutno pokrenutom postupku. Ako se koristi -i zastavica, vrati se pid, odgovara onom datiranog ID-a spawn.

exp_send
je pseudonim za slanje .

exp_send_error
je pseudonim za send_error .

exp_send_log
je pseudonim za send_log .

exp_send_tty
je pseudonim za send_tty .

exp_send_user
je pseudonim za send_user .

exp_version [[-exit] inačica]
korisno je za osiguranje da skripta bude kompatibilna s trenutnom verzijom očekuje.

Bez argumenata vraća se trenutačna verzija očekivanja . Ova inačica može se zatim kodirati u vašoj skripti. Ako znate da ne upotrebljavate značajke nedavnih verzija, možete odrediti neku stariju verziju.

Verzije se sastoje od tri broja odvojene točkama. Prvi je najveći broj. Skripte napisane za inačice Expect s drugim većim brojem gotovo sigurno neće funkcionirati. exp_version vraća pogrešku ako se glavni brojevi ne podudaraju.

Drugi je manji broj. Skripte napisane za verziju s većim brojem od trenutne verzije mogu ovisiti o nekoj novoj značajci i možda se neće pokrenuti. exp_version vraća pogrešku ako se glavni brojevi podudaraju, ali skriptni manji broj je veći od onog koji se odnosi na očekivati .

Treći je broj koji ne igra nikakvu ulogu u usporedbi verzije. Međutim, ona se povećava kada se izmijeni očekivana distribucija softvera na bilo koji način, kao što je dodatna dokumentacija ili optimizacija. Vraća se na 0 na svaku novu manju verziju.

Uz -exit zastavu, očekuje ispisuje pogrešku i izlazi ako je verzija zastarjela.

očekivati ​​[[-opts] pat1 body1] ... [-opts] patn [bodyn]
čeka dok jedan od uzoraka ne odgovara izlazu istog procesa, određeno vremensko razdoblje je prošlo ili se vidi krajnja datoteka. Ako je posljednje tijelo prazno, može se izostaviti.

Obrasci najnovije očekivane prije naredbe implicitno se upotrebljavaju prije bilo kojih drugih obrazaca. Obrasci najnovije naredbe wait_after implicitno se koriste nakon bilo kojih drugih obrazaca.

Ako argumenti za čitavu očekivanu izjavu zahtijevaju više od jednog retka, svi se argumenti mogu "podupirati" u jednu kako bi se izbjeglo ukidanje svakog retka uz povratni unos. U ovom slučaju, uobičajene Tcl zamjene će se pojaviti unatoč braces.

Ako je uzorak ključna riječ eof , odgovarajuće tijelo izvršava se nakon završetka datoteke. Ako je uzorak vremena za ključne riječi, odgovarajuće tijelo izvršava se nakon isteka vremena. Ako se ne koristi timeout timeout, implicitna nullna akcija izvršava se nakon isteka vremena. Zadani vremenski period je 10 sekundi, ali može biti postavljen, primjerice na 30, pomoću naredbe "set timeout 30". Beskonačno vremensko ograničenje može se označiti s vrijednošću -1. Ako je obrazac ključna riječ, odgovarajuće tijelo izvršava se nakon isteka vremena ili kraja datoteke.

Ako se uzorak podudara, tada se izvršava odgovarajuće tijelo. očekuje da vraća rezultat tijela (ili praznog niza ako se ne podudara uzorak). U slučaju da se više uzoraka podudara, prvo se pojavljuje za odabir tijela.

Svaki put kad novi output stigne, uspoređuje se sa svakim uzorkom u redoslijedu na kojem su navedeni. Dakle, možete testirati na odsutnost podudaranja stvaranjem posljednjeg obrasca koji će se pojaviti nešto sigurno, poput upita. U situacijama u kojima nema upita, morate koristiti vremensko ograničenje (baš kao i ako biste ručno trebali stupiti u interakciju).

Obrasci su navedeni na tri načina. Prema zadanim postavkama, uzorci se navode kao kod naredbe za podudaranje stringa Tcl. (Takvi obrasci također su slični regularnim izrazima C-ljuske obično nazvanim "glob" obrasci). Zastavica -gl može se koristiti za zaštitu uzoraka koji bi inače odgovarali očekivanim zastavama. Svi obrasci koji počinju s "-" trebaju biti zaštićeni na ovaj način. (Svi nizovi koji počinju s "-" rezervirani su za buduće mogućnosti.)

Na primjer, sljedeći fragment traži uspješnu prijavu. (Imajte na umu da se pobačaj pretpostavlja da je postupak definiran drugdje u skripti.)

očekuje {busy {stavlja zauzet \ n; exp_continue} nije uspjela obustaviti "nevaljanu lozinku" prekid vremena prekida prekinuti vezu}

Citati su nužni na četvrtom uzorku budući da sadrži prostor koji bi inače odvojio obrazac od akcije. Obrasci s istom radnjom (kao što su treći i četvrti) zahtijevaju ponovno unos akcija. To se može izbjeći pomoću regexp-stila (vidi dolje). Dodatne informacije o oblikovanju uzoraka glob-stila mogu se naći u priručniku Tcl.

Regexp-stilski obrasci slijede sintaksu definiranu Tclovim regexp (kratica za naredbu "regularni izraz"). regexp uzorci se uvode sa zastavicom -re . Prethodni primjer može se prepisati koristeći regexp kao:

očekuje {busy {stavlja zauzet \ n; exp_continue} "nije uspjelo" nevažeća zaporka "prekidanje prekida prekida prekidanje veze}

Oba tipa uzoraka su "angažirana". To znači da uzorci ne moraju odgovarati cijelom nizu, ali mogu započeti i završiti utakmicu bilo gdje u nizu (sve dok se sve podudara). Koristite ^ da odgovaraju početku niza, a $ da odgovara kraju. Imajte na umu da, ako ne čekate kraj niza, vaši odgovori mogu lako završiti usred niza, budući da se odzvanjaju od istog procesa. Iako još uvijek proizvodi točne rezultate, izlaz može izgledati neprirodno. Dakle, potičemo korištenje $ ako točno možete opisati znakove na kraju niza.

Imajte na umu da u mnogim urednicima ^ i $ odgovaraju početku i kraju redaka. Međutim, budući da očekivanje nije orijentirano na liniju, ti se znakovi podudaraju s početkom i krajem podataka (za razliku od linija) koji se trenutačno nalaze u očekivanom međuspremniku. (Također pogledajte dolje navedenu napomenu o "probavnom sustavu".)

Zastava -ex uzrokuje da uzorak bude podudaran kao "točan" niz. Nema interpretacije *, ^, itd. (Iako se uobičajene konvencije Tcl moraju još uvijek promatrati). Točni obrasci su uvijek nepovezani.

Zastava s naznakom uzrokuje da se velika slova izlaza uspoređuju kao da su mali znakovi. Ne utječe na uzorak.

Dok čitate izlaz, više od 2000 bajtova može prisiliti ranije bajtove da budu "zaboravljeni". To se može promijeniti s funkcijom match_max . (Imajte na umu da prevelike vrijednosti mogu usporiti podudaranje uzoraka.) Ako je popis datoteka puni_pribor , odgovarajuće tijelo izvršava se ako su primljene bajke match_max i da se nijedan drugi obrazac ne podudara. Bez obzira upotrebljava li se ključna riječ full_buffer , zaboravljeni znakovi napisani su za expect_out (buffer).

Ako je patlist ključna riječ null , a dopušteni su nullovi (putem naredbe remove_nulls ), odgovarajuće tijelo se izvršava ako se podudara jedan ASCII 0. Nije moguće podudarati 0 bajta pomoću glob ili regexp obrasca.

Nakon podudaranja uzorka (ili eof ili full_buffer), bilo koji odgovarajući i prethodno neusporediv izlaz se sprema u varijablu expect_out (buffer) . Do 9 regexp podnožja podudaranja se spremaju u varijable expect_out (1, string) kroz expect_out (9, string) . Ako se oznaka "indeksi" upotrebljava prije uzorka, početni i završni indeksi (u obliku prikladnom za raspored ) od 10 žica pohranjeni su u varijablama expect_out (X, start) i expect_out (X, kraj) gdje je X znamenka, odgovara položaju podnožja u međuspremniku. 0 se odnosi na žice koje odgovaraju cijelom uzorku i generiraju se za glob obrasce kao i regexp uzorke. Na primjer, ako je proces izradio output "abcdefgh \ n", rezultat je:

očekujte "cd"

je kao da su izvršene sljedeće izjave:

set expect_out (0, niz) cd set expect_out (buffer) abcd

i "efgh \ n" ostaje u izlaznom spremniku. Ako je proces producirao izlaz "abbbcabkkkka \ n", rezultat je:

očekuju-indeksi -re "b (b *). * (k +)"

je kao da su izvršene sljedeće izjave:

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

i \ n "ostaje u izlaznom međuspremniku. Uzorak "*" (i -re ". *") Ispire izlazni međuspremnik bez očitavanja bilo kakvog izlaza iz procesa.

Uobičajeno, usklađeni izlaz biva odbačen iz Expectovih unutarnjih pufera. To se može spriječiti prefiksom obrasca s oznakom -notransfer . Ova je zastava osobito korisna u eksperimentiranju (i može se skratiti na "-not" zbog praktičnosti prilikom eksperimentiranja).

ID mrijeste povezan s odgovarajućim izlazom (ili eof ili full_buffer) pohranjen je u expect_out (spawn_id) .

Zastava za timeout uzrokuje trenutnu očekivanu naredbu da upotrijebi sljedeću vrijednost kao vremensko ograničenje umjesto da koristi vrijednost vremenske varijable.

Prema zadanim postavkama uzorci se podudaraju s izlazom iz trenutnog procesa, ali -i zastavica izjavljuje da će izlaz iz imenovanog popisa spawn_id biti podudaran s bilo kojim sljedećim obrascima (do sljedećeg -i ). Popis spawn_id trebao bi biti odvojeni popis od spawn_ids ili varijabla koja se odnosi na takav popis spawn_ids.

Na primjer, sljedeći primjer čeka "povezano" s trenutačnim postupkom ili "zauzet", "nije uspjelo" ili "nevažeća lozinka" iz spawn_id nazvanog $ proc2.

očekuje {-i $ proc2 zauzet {stavlja promet \ n; exp_continue} "nije uspjelo" nevažeća zaporka "prekidanje prekida prekida prekidanje veze}

Vrijednost globalne varijable any_spawn_id može se upotrijebiti za usklađivanje uzoraka s bilo kojim spawn_idovima koji su imenovani sa svim ostalim -i oznakama u trenutačnoj očekivanoj naredbi. The spawn_id iz -i zastavice bez pridruženog uzorka (tj. Odmah nakon drugog -i ) dostupna je bilo kojem drugom obrascu u istoj očekivnoj naredbi povezanoj s any_spawn_id.

Zastava -i također može nazvati globalnu varijablu, u kojem se slučaju čitaju varijabla za popis ID-ova spawnova. Varijabla se ponovno čita kad god se mijenja. To omogućuje način mijenjanja I / O izvora dok je naredba u izvršenju. Spawn ID-ovi koji se pružaju na ovaj način nazivaju se "neizravnim" identičnim mrijestama.

Radnje kao što su prekid i nastavak uzrokuju kontrolu struktura (tj. Za proc ) da se ponašaju na uobičajeni način. Naredba exp_continue omogućuje očeku sebe da nastavi izvršavati umjesto da se vrati kao što bi inače normalno.

To je korisno za izbjegavanje eksplicitnih petlji ili ponovljenih očekivanih izjava. Sljedeći primjer je dio ulomka za automatizaciju rlogina. Exp_continue izbjegava pisati drugu očekivanu izjavu (ponovo potražiti upit) ako rlogin traži lozinku.

očekuje {Lozinka: {stty-echo send_user "lozinka (za $ korisnika) na $ host:" expect_user -re "(. *) \ n" send_user "\ n" pošalji "$ expect_out (1, string) \ r" echo {send_user \ "veza s hostom nije uspjela: $ expect_out (buffer)" izlaz} - izlaz} eof exp_continue} pogrešan {send_user "nevažeća lozinka ili račun \ n" exit} timeout {send_user " re $ prompt}

Na primjer, sljedeći fragment može pomoći korisničkom vodiču interakcije koja je već potpuno automatizirana. U tom slučaju, terminal je stavljen u sirovom modu. Ako korisnik pritisne "+", varijabla se povećava. Ako pritisnete "p", procesu se šalje nekoliko vraća, možda da je pokriju na neki način, a "ja" omogućuje korisniku da komunicira s postupkom, učinkovito ukrade nadzor iz skripte. U svakom slučaju, exp_continue dopušta trenutni očekivati nastavak podudaranja uzoraka nakon izvršenja trenutne radnje.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "quit" izlaz}

Prema zadanim postavkama, exp_continue vraća vremensko ograničenje vremena. Timer se ne pokreće, ako se exp_continue zove zastavom -continue_timer .

expect_after [expect_args]
funkcionira jednako očekivanjem prije, osim ako se uzorci oba očekuju i očekuju da će se uskladiti, koristi se očekivani obrazac. Pogledajte naredbu expected_before za više informacija.

expect_background [expect_args]
uzima iste argumente kao i očekuje , ali se odmah vraća. Obrasci se testiraju svaki put kad dođe novi ulaz. Vremenski odsječak i zadani postavci su beznačajni za expect_background i tiho su odbačeni. Inače, expect_background naredba koristi expect_before i expect_after obrasce baš kao što očekuje .

Kada se ocjenjuju radnje expect_background , obrada pozadine za isti ID mrijesta blokirana je. Obrada pozadine je deblokirana kada se radnja dovrši. Dok je pozadinska obrada blokirana, moguće je napraviti (prednji) očekivati na istom ID-u spawn.

Nije moguće izvršiti očekivanje dok je odbrojavanje wait_background deblokirano. expect_background za određeni mrijest id se briše izjavom novog expect_background s istim mrijesta id. Određivanje expect_background bez obrasca uklanja određeni ID mrijesta od mogućnosti podudaranja uzoraka u pozadini.

expected_before [expect_args]
uzima iste argumente kao i očekuje , ali se odmah vraća. Praktični akcijski parovi s najnovijih expected_before s istim spawn id implicitno su dodani u bilo koju sljedeću očekivane naredbe. Ako se uzorak podudara, on se tretira kao da je naveden u očekivanoj naredbi i povezano tijelo izvršava se u kontekstu očekivane naredbe. Ako obrasci od oba očekuju i očekuju da se mogu podudarati, upotrebljava se očekivani uzorak.

Ako nije naveden nijedan obrazac, umnožak ID nije označen za bilo koji uzorak.

Ako se ne prekoračemo zastavicom -i , očekujemo prije nego što se uzorci podudaraju s ID-om koji je definiran u trenutku kada je izvršena izvršena očekivana prije naredbe (a ne kada se njezin obrazac podudara).

Zastava -info uzrokuje expected_before da vrati trenutne specifikacije onih uzoraka koje će se podudarati. Prema zadanim postavkama, izvješćuje o trenutačnom ID-u spawn. Dodatnu specifikaciju mravinjaka može se dati za informacije o toj mrijestini. Na primjer

expect_before -info -i $ proc

Može se dati najviše jedna specifikacija mrijestina. Zastava - indirektna potiskuje izravne ID-e spawnova koji dolaze samo od neizravnih specifikacija.

Umjesto ikona spawn id, zastava "sve" uzrokuje "-info" da izvještava o svim ID-ima spawnova.

Izlazni signal -info može se ponovno koristiti kao argument za očekivati ​​prije.

expect_tty [expect_args]
je poput očekujem, ali čita znakove iz / dev / tty (npr. tipke od korisnika). Prema zadanim postavkama čitanje se izvodi u načinu kuhanja. Dakle, linije moraju završiti povratkom kako bi ih očekivali . To se može promijeniti stty (pogledajte naredbu stty u nastavku).

expect_user [expect_args]
je poput očekivati, ali čita znakove iz stdin (tj. tipke od korisnika). Prema zadanim postavkama čitanje se izvodi u načinu kuhanja. Dakle, linije moraju završiti povratkom kako bi ih očekivali . To se može promijeniti stty (pogledajte naredbu stty u nastavku).

viljuška
stvara novi proces . Novi postupak je točna kopija trenutnog procesa očekivanja . Po uspjehu, vilica vraća 0 na novi (dijete) postupak i vraća ID procesa procesa djeteta u roditeljski proces . Kod neuspjeha (nepromjenjivo zbog nedostatka resursa, npr. Zamjenskog prostora, memorije), vilica vraća -1 u roditeljski proces , a ne nastaje proces djeteta.

Forkirani procesi izlaze putem izlazne naredbe, baš kao i prvobitni proces . Zapisani procesi mogu se zapisati u zapisničke datoteke. Ako ne onemogućite otklanjanje pogrešaka ili prijavite se većini procesa, rezultat može biti zbunjujući.

Neki pty implementacije svibanj biti zbunjeni više čitatelja i pisaca, čak i na trenutak. Dakle, to je najsigurnije za vilicu prije mrijestilišta.

komunicirati [string1 body1] ... [stringn [bodyn]]
daje kontrolu nad trenutnim procesom korisniku, tako da se pritisci na tipke šalju u trenutni proces , a stdout i stderr trenutnog procesa vraćaju se.

Parovi stringova i tijela mogu se navesti kao argumenti, u kojem se slučaju tijelo izvodi kada se unese odgovarajući niz. (Prema zadanim postavkama, string se ne šalje trenutnom procesu .) Naredba prevoditelja pretpostavlja se ako nedostaje konačno tijelo.

Ako argumenti za cjelokupnu izjavu za interakciju zahtijevaju više od jednog retka, svi se argumenti mogu "podupirati" u jednu kako bi se izbjeglo ukidanje svakog retka s obrnutim redoslijedom. U ovom slučaju, uobičajene Tcl zamjene će se pojaviti unatoč braces.

Na primjer, sljedeća naredba radi u interakciji sa sljedećim parovima string-body definiranim: Kada pritisnete ^ Z, očekuje se obustavljeno. (Gumb- reset vraća načina rada terminala.) Kada pritisnete ^ A, korisnik vidi "upisali ste kontrolu A" i proces je poslan ^ A. Kada pritisnete $, korisnik vidi datum. Kada pritisnete ^ C, Expect izlazi. Ako se unese "foo", korisnik vidi "bar". Kada se pritisne ~, tumač očekuje se interaktivno.

postavite CTRLZ \ 032 interakciju {-reset $ CTRLZ {exec ubij -STOP [pid]} \ 001 {send_user "upisali ste kontrolu-A \ n"; pošaljite "\ 001"} $ {send_user "Datum je [format sata [sat sekundi]]."} \ 003 izlaz foo {send_user "bar"} ~~}

U parovima string-body parova se podudaraju u redoslijedu kako su navedeni kao argumenti. Nizovi koji se djelomično podudaraju ne šalju se u trenutačnom postupku u očekivanju da ostatak dolazi. Ako se znakovi unesu tako da više ne postoji mogućnost podudaranja, samo će dio niza biti poslan procesu koji ne može započeti drugu utakmicu. Dakle, nizovi koji su podnizovi djelomičnih podudaranja mogu se podudarati kasnije, ako izvorni nizovi koji se pokušavaju podudarati konačno ne uspiju.

Prema zadanim postavkama podudaranje nizova točno je bez divljih kartica . (Nasuprot tomu, očekivana naredba koristi zadane obrasce u globu). -ex zastava može se koristiti za zaštitu uzoraka koji bi inače odgovarali interakcijskim zastavama. Svi obrasci koji počinju s "-" trebaju biti zaštićeni na ovaj način. (Svi nizovi koji počinju s "-" rezervirani su za buduće mogućnosti.)

Zastava -re prisiljava niz da se interpretira kao uzorak regexp stila. U tom slučaju, podudarnost podudaranja pohranjena je u varijabli interact_out slično načinu na koji očekujete pohranu svoje izlazne vrijednosti u varijabli expect_out . Znak s indeksima slično je podržan.

Uzorak eof predstavlja akciju koja se izvodi na kraju datoteke. Zasebna eof uzorak također može slijediti -output flag u kojem slučaju se podudara ako eof detektira tijekom pisanja izlaza. Zadana eof akcija je "povratak", tako da interakcija jednostavno vraća na bilo koji EOF.

Odstupanje uzorka uvodi vremensko ograničenje (u sekundama) i radnja koja se izvršava nakon što se za određeno vrijeme ne čita nijedan znak. Odsjek vremenskog ograničenja odnosi se na najnoviji postupak . Nema zadanog vremenskog ograničenja. Posebna varijabla "timeout" (koju koristi očekivana naredba) nema utjecaja na ovaj vremenski rok.

Na primjer, sljedeća izjava može se upotrebljavati za autologiranje korisnika koji nisu ništa upisali na sat, ali koji i dalje imaju česte poruke sustava:

interakcija -input $ user_spawn_id timeout 3600 povratni izlaz \ $ spawn_id

Ako je obrazac ključna riječ null , a nullovi su dopušteni (putem naredbe remove_nulls ), odgovarajuće tijelo izvršava se ako se podesi jedan ASCII 0. Nije moguće podudarati 0 bajta pomoću glob ili regexp obrasca.

Prefaciranje uzorka sa zastavicom -jwrite uzrokuje da se varijabla interact_out (spawn_id) postavi na spawn_id koji odgovara uzorku (ili eof).

Radnje kao što su prekid i nastavak uzrokuju kontrolu struktura (tj. Za proc ) da se ponašaju na uobičajeni način. Međutim, uzroci povratka reagiraju na povratak na pozivatelja, dok međusobni uzroci uzrokuju povratak pozivatelja. Na primjer, ako se "proc foo" zove interakciju koji je tada izvršio akciju inter_return , proc foo bi se vratio. (To znači da ako interakcija naziva interakciju interakcijom tipkanja povratka , interakcija će se nastaviti, a inter_return će uzrokovati da se interakcija vrati pozivatelju.)

Tijekom interakcije upotrebljava se sirovi način rada tako da se svi znakovi mogu proslijediti trenutnom postupku . Ako trenutni proces ne zaustavi signale za kontrolu posla, zaustavit će se ako je zaustavljen signal (po defaultu ^ Z). Da biste ga ponovno pokrenuli, pošaljite signal za nastavak (primjerice, "ubiti -CONT"). Ako stvarno želite poslati SIGSTOP na takav proces (pomoću ^ Z), razmislite o tome da razmislite o skuznju csh, a zatim pokrenite svoj program. S druge strane, ako želite poslati SIGSTOP na Očekujte , prvo pozivnog tumača (možda pomoću znaka za izlazak), a zatim pritisnite ^ Z.

Parovi stringova i tijela mogu se koristiti kao skraćeni tekst za izbjegavanje interakcije interpretatora i izvršavanje naredbi. Koristi se prethodni način rada terminala dok se tijelo parice tijela i tijela izvodi.

Za brzinu, radnje se izvode u sirovom načinu rada prema zadanim postavkama. Zvona -reset vraća terminal na način koji je imao prije nego što je izvršena interakcija (uvijek, način kuhanja). Imajte na umu da se znakovi uneseni kada se mod uključi mogu biti izgubljeni (nesretna značajka upravljačkog terminala na nekim sustavima). Jedini razlog za upotrebu -reset je ako vaša radnja ovisi o prikazivanju u načinu kuhanja.

-echo zastavica šalje znakove koji odgovaraju sljedećem obrascu natrag u proces koji ih generira kao svaki znak se pročita. To može biti korisno kada korisnik treba vidjeti povratne informacije iz djelomično upisanih obrazaca.

Ako se uzorak ponovi, ali se na kraju ne uspije, znakovi se šalju u proces isticanja. Ako ih odgoneti proces , korisnik će dvaput vidjeti znakove. -echo je vjerojatno prikladan samo u situacijama u kojima korisnik vjerojatno neće završiti obrazac. Na primjer, sljedeći je odlomak iz rftp-a, rekurzivno-ftp skripte, gdje se od korisnika traži da unesete ~ g, ~ p ili ~ l kako bi se rekurzivno nabavio, stavio ili popisao trenutni direktorij. To su toliko daleko od normalnih ftp naredbi, da je korisnik vjerojatno da će upisati ~ i slijediti bilo što drugo osim pogrešno, u kojem slučaju će vjerojatno ionako zanemariti rezultat.

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

Zastava nulji znak šalje znakove koji odgovaraju sljedećem obrascu na izlazni proces dok se čitaju znakovi.

To je korisno kada želite dopustiti programu da odzvanji uzorak. Na primjer, sljedeće se može koristiti za praćenje gdje osoba biranja (modem u Hayesovom stilu). Svaki put kada se vidi "atd", skripta zapisuje ostatak retka.

proc lognumber {} {interact -nobuffer -re "(. *) povratak stavlja $ log" [clock format [sat sekundi]]: birani $ interact_out (1, string) "} međusobno -nobuffer" atd "lognumber

Tijekom interakcije , prethodna upotreba log_usera zanemaruje se. Konkretno, interakcija će prisiliti njegovo izlazno bilježenje (poslano na standardni izlaz) jer se pretpostavlja da korisnik ne želi interakciju slijepo.

-o zastavica uzrokuje da se slijedeći parovi ključa i tijela primijene na izlaz trenutnog procesa . To može biti korisno, primjerice, kada se bave hostovima koji šalju neželjene znakove tijekom telnet sesije.

Prema zadanim postavkama, interakcija očekuje od korisnika da piše stdin i čitanje stdouta samog procesa Očekuje . -u zastavica (za "korisnika") čini interakciju za korisnika kao proces koji se naziva njegovim argumentom (koji mora biti spawned id).

To omogućuje povezivanje dva nepovezana procesa bez korištenja eksplicitne petlje. Da bi vam pomogao u uklanjanju pogrešaka, očekujte dijagnostiku uvijek otiđite na stderr (ili stdout za određene podatke za bilježenje i uklanjanje pogrešaka). Iz istog razloga, naredba tumača će interaktivno čitati iz stdin.

Na primjer, sljedeći fragment stvara postupak prijave. Zatim on bira korisnika (nije prikazan) i konačno spaja dva zajedno. Naravno, svaki proces može biti zamijenjen za prijavu. Shema, na primjer, omogućila bi korisniku da radi bez opskrbljivanja računa i lozinke.

spawn prijava za prijavu $ spawn_id spawn tip modem # birajte natrag korisniku # povezivanje korisnika za prijavu interakcije -u $ login

Za slanje izlaza na više procesa, navedite svaki identični popis istih predloženih oznakom -output flag. Ulaz za grupu izlaznih ID-ova spawnova može se odrediti umnožnim id popisom prefaciranim pomoću ulazne oznake . ( Ulazni i izlazni zapisi mogu sadržavati popise u istom obliku kao i -i oznaka u očekivanoj naredbi, osim što bilo koji_spawn_id nema smisla u interakciji .) Sve sljedeće oznake i nizovi (ili obrasci) primjenjuju se na ovaj unos sve dok ne ostane - pojavljuje se ulazna oznaka. Ako se ne pojavi "ulaz", izlaz znači "-input $ user_spawn_id -output". (Slično tome, uz obrasce koji nemaju ulaz ). Ako je naveden jedan ulaz , on nadjačava $ user_spawn_id. Ako je naveden drugi ulaz , on nadjačava $ spawn_id. Moguće je navesti dodatne ulazne oznake.

Dva su podrazumijevana ulazna procesa zadana da njihovi izlazi navedeni kao $ spawn_id i $ user_spawn_id (u obrnutom). Ako se pojavi ulazna oznaka bez izlaznog signala , znakovi iz tog postupka odbacuju se.

Zastava -i uvodi zamjenu za trenutni spawn_id kada se ne koriste druge ulazne ili izlazne oznake. Zastava -i označava zastavicu -o.

Moguće je mijenjati procese kojima se interakcioniraju pomoću indirektnih ikona za razmnožavanje. (Neizravni mrijestovi ids opisani su u odjeljku o naredbi očekivanja.) Neizravni mrijestovi ids mogu se navesti s oznakama -i, -u, -input ili -out.

tumač [args]
uzrokuje da se korisnik interaktivno zatraži za Expect i Tcl naredbe. Rezultat svake naredbe ispisuje se.

Radnje kao što su prekid i nastavak uzrokuju kontrolu struktura (tj. Za proc ) da se ponašaju na uobičajeni način. Međutim, povratak uzrokuje da se tumač vratio pozivatelju, dok inter_return uzrokuje da tumač uzrokuje povratak u pozivatelja. Na primjer, ako se "proc foo" zove tumač koji je tada izvršio akciju inter_return , proc foo će se vratiti. Svaka druga naredba dovodi tumača da nastavi potaknuti nove naredbe.

Po defaultu, redak sadrži dva cjelobrojna broja. Prvi cijeli broj opisuje dubinu procjene stanja (tj. Koliko puta je Tcl_Eval zvan). Drugi cijeli broj je identifikator povijesti Tcl. Upit se može postaviti definiranjem postupka pod nazivom "prompt1" čija povratna vrijednost postaje sljedeći upit. Ako izjava ima otvorene citate, parens, braces ili zagrade, sekundarni prompt (prema zadanim postavkama "+>") izdava se na novi redak. Sekundarni upit može se postaviti definiranjem postupka nazvanog "prompt2".

Tijekom tumača upotrebljava se kuhani način rada, čak i ako je njegov pozivatelj koristio sirovi način rada.

Ako je stdin zatvoren, tumač će se vratiti osim ako se ne koristi " zastavica", u kojem slučaju se poziva na sljedeći argument.

log_file [args] [[-a] datoteka]
Ako je naveden naziv datoteke, log_file će zapisati transkript sjednice (počevši od tog trenutka) u datoteci. log_file će zaustaviti snimanje ako se ne daje argument. Bilo koja prethodna log datoteka je zatvorena.

Umjesto naziva datoteke, identifikator Tcl datoteke može se dobiti pomoću " open" ili " leaveopen" flagova . Ovo je slično njemu spawn . (Pogledajte više informacija za spawn .)

Snage sastava zrakoplova koji bi trebali biti prijavljeni, a potisnuta je od strane log_user naredbe.

Prema zadanim postavkama, zapis log_file dodaje se starijim datotekama umjesto da ih skratite, kako bi se lakše moglo isključiti prijave i više puta u jednoj sesiji. Da biste skratili datoteke, upotrijebite oznaku " neodgovor" .

Zastava -info uzrokuje log_file da vrati opis najnovijih neupotrećenih argumenata.

log_user -info | 0 | 1
Prema zadanim postavkama dijalog za slanje / očekivanje bilježi se u stdout (i zapisnik ako je otvoren). Zapisivanje na stdout onemogućeno je naredbom "log_user 0" i ponovno omogućeno "log_user 1". Prijava na zapisnik nije nepromijenjena.

Zastava -info uzrokuje log_user da vrati opis najnovijih neupotrećenih argumenata.

match_max [-d] [-i spawn_id] [veličina]
definira veličinu međuspremnika (u bajtovima) koje interno upotrebljavaju očekivanja . Bez argumenta veličine, vraća se trenutna veličina.

Pomoću -d oznake postavljena je zadana veličina. (Početna zadana vrijednost je 2000.) S oznakom -i , veličina je postavljena za ime spawn ida, inače je postavljena za trenutni proces .

preklapanje [- # spawn_id] [- # spawn_id] [...] program [args]
izvršava "program args" umjesto trenutnog očekuje program, koji završava. Argument golotonske cijevi snosi crticu ispred naredbe kao da je to prijava. Svi spawn_ids su zatvoreni, osim onih koji su imenovani kao argumenti. Oni su mapirani na imenovane identifikatore datoteka.

Spawn_ids mapiraju se na identifikatore datoteka za novi program nasljeđivanja. Na primjer, sljedeća linija pokreće šah i dopušta njegovu kontrolu nad trenutnim procesom - recimo, šahovskom majstoru.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id šah

To je učinkovitije od "interakcije -u", međutim, žrtvuje sposobnost programiranja interakcije jer proces očekuje više nije u kontroli.

Imajte na umu da nema upravljačkog terminala. Stoga, ako odspojite ili preoblikate standardni unos, programi koji obavljaju kontrolu posla (ljuske, prijava itd.) Neće funkcionirati ispravno.

paritet [-d] [-i spawn_id] [vrijednost]
definira treba li paritet zadržati ili ukloniti iz izlaznih procesa. Ako je vrijednost nula, paritet je uklonjen, inače se ne uklanja. Bez argumenta vrijednosti, vraća se trenutna vrijednost.

Pomoću -d oznake postavljena je zadana vrijednost pariteta. (Početni zadani parametar je 1, tj. Paritet nije uklonjen.) Sa -i oznakom , paritetna vrijednost postavljena je za ime iduće spawnove, inače je postavljena za trenutačni postupak .

remove_nulls [-d] [-i spawn_id] [vrijednost]
definira da li se nullovi zadržavaju ili uklanjaju iz izlaza istih procesa prije podudaranja uzoraka ili pohrane u varijabli expect_out ili interact_out . Ako je vrijednost 1, uklanjaju se nuljevi. Ako je vrijednost 0, nuli se ne uklanjaju. Bez argumenta vrijednosti, vraća se trenutna vrijednost.

Pomoću -d oznake postavljena je zadana vrijednost. (Početna zadana vrijednost je 1, tj. Nullovi su uklonjeni.) Sa -i oznakom , vrijednost je postavljena za ime spawn ida, inače je postavljena za trenutni proces .

Bez obzira na to su li nullovi uklonjeni ili ne, očekuje se da će zapisati null bajtove u zapisnik i stdout.

poslati niz [-flags] string
Šalje niz trenutnom procesu . Na primjer, naredba

pošalji "hello svijet"

šalje znakove, helloworld u trenutni proces . (Tcl sadrži naredbu printf- sličnu (tzv format ) koja može proizvesti proizvoljno složene nizove.)

Likovi se šalju odmah, iako programi s unosom u međuspremniku neće čitati znakove dok se ne šalje povratni znak. Povratni znak označen je "\ r".

Zastava označava sljedeći argument koji se tumači kao niz, a ne kao zastava. Svakom nizu može prethoditi "-" da li zapravo izgleda kao zastava. To osigurava pouzdani mehanizam za određivanje varijabilnih nizova, a da ih ne upadaju oni koji slučajno izgledaju kao zastave. (Svi nizovi koji počinju s "-" rezervirani su za buduće mogućnosti.)

Zastava -i izjavljuje da se niz šalje u ime spawn_id. Ako je spawn_id korisnički_spawn_id , a terminal je u sirovom načinu rada, novi redovi u nizu prevedeni su na redoslijed povratnih redaka, tako da se pojavljuju kao da je terminal u načinu kuhanja. Zastava -raw onemogućuje ovaj prijevod.

-nula zastavica šalje nulte znakove (0 bajta). Prema zadanim postavkama, šalje se jedan null. Cijeli broj može pratiti -nula kako bi se naznačilo koliko nula treba poslati.

Zastava- pojava stvara uvjet loma. To ima smisla samo ako se ID mrijeste odnosi na tty uređaj otvoren putem "spawn-otvora". Ako ste stvorili proces kao što je savjet, trebali biste upotrijebiti konvenciju tipa za stvaranje pauze.

Sile sile s izlazom se šalju "polako", čime se izbjegava uobičajena situacija u kojoj računalo nadilazi ulazni međuspremnik koji je dizajniran za čovjeka koji nikada ne bi mogao izdubiti isti tampon . Ovaj izlaz kontrolira se vrijednost varijable "send_slow" koja uzima popis dvaju elemenata. Prvi element je cijeli broj koji opisuje broj bajtova za atomski slanje. Drugi je element pravi broj koji opisuje broj sekundi po kojima se atomska šalje mora razdvojiti. Na primjer, "set send_slow {10 .001}" prisililo bi "send -s" da pošalje stringove s 1 milisekundama između svakog 10 znakova poslanih.

Snage s oznakama -h izlaze za slanje (nešto slično) poput čovjeka koji tipkati. Između likova pojavljuju se zakašnjenja poput čovjeka. (Algoritam se temelji na Weibullovoj distribuciji, s promjenama koje odgovaraju ovoj posebnoj aplikaciji.) Ovaj izlaz kontrolira se vrijednost varijable "send_human" koja traje pet elemenata. Prva dva elementa su prosječno vrijeme međusobnog prepoznavanja znakova u sekundama. Prva se koristi prema zadanim postavkama. Druga se upotrebljava pri završetku riječi kako bi simulirala suptilne stanke koje se ponekad događaju pri takvim prijelazima. Treći parametar je mjera varijabilnosti gdje .1 je prilično promjenjiva, 1 je razmjerno promjenjiva, a 10 je prilično nepromjenjiva. Ekstremnosti su 0 do beskonačnosti. Posljednja dva parametra su minimalno i maksimalno vrijeme interarnacije. Minimalni i maksimalni se koriste posljednji i "isječak" posljednji put. Krajnji prosjek može biti sasvim drugačiji od zadanog prosjeka ako je minimalna i maksimalna isječak dovoljno vrijednosti.

Kao primjer, sljedeća naredba emulira brz i dosljedan daktilograf:

set send_human {.1 .3 1 .05 2} pošalji -h "Gladan sam. Učinimo ručak."

dok će nakon mamurluka biti prikladnije sljedeće:

postavite send_human {.4 .4 .2 .5 100} pošaljite -h "Goodd party voštana noć!"

Imajte na umu da se pogreške ne simuliraju, iako možete postaviti situacije ispravljanja pogrešaka ugrađujući pogreške i ispravke u argumentu za slanje.

Zastave za slanje null znakova, za slanje pauze, za prisiljavanje spore izlaz i za ljudski stil izlaz su međusobno isključivi. Upotrebljava se samo onaj zadnji naveden. Štoviše, niti jedan argument niza ne može se navesti sa zastavicama za slanje null znakova ili prekida.

Dobro je prethoditi prvom slanja procesu očekivanom . očekuje da će čekati postupak , a slanje ne može. Konkretno, ako prvi slanje završi prije pokretanja postupka , riskirate da se vaši podaci zanemaruju. U situacijama u kojima interaktivni programi ne nude početni redak, možete prethoditi slanje kašnjenjem kao u:

# Kako bi se izbjeglo davanje hakera na savjete o tome kako se probiti, # ovaj sustav ne traži vanjsku lozinku. # Pričekajte 5 sekundi za exec za dovršetak spawn telnet very.secure.gov spavati 5 poslati lozinku

exp_send je nadimka za slanje. Ako koristite Expectk ili neku drugu varijantu Očekivanja u okruženju Tk, šalje se Tk za određenu svrhu. exp_send je predviđen za kompatibilnost između okruženja. Slični pseudonim su predviđeni za ostale naredbe za slanje drugih očekivanja.

string send_error [-flags]
je poput slanja , osim što se izlaz šalje stderr umjesto trenutnom procesu .

send_log [-] niz
je poput slanja , osim što se niz šalje samo u datoteku zapisnika (vidi log_file .) Argumenti se zanemaruju ako nije otvorena log datoteka.

send_tty [-flags] string
je poput slanja , osim što se izlaz šalje / dev / tty nego trenutnom procesu .

string send_user [-flags]
je poput slanja , osim što se izlaz šalje na stdout, a ne na trenutni proces .

sekunde za spavanje
uzrokuje skriptu da spava za određeni broj sekundi. Sekunde mogu biti decimalni brojevi. Prekidi (i Tk događaji ako koristite Expectk) obrađuju se dok očekuju spavanje.

stvoriti program [args] [args]
stvara novi proces koji pokreće "program args". Njegovi stdin, stdout i stderr su povezani s očekivanjem, tako da ih mogu čitati i napisati druge očekujuće naredbe. Veza je razbila blizu ili ako sam proces zatvara bilo koji od identifikatora datoteka.

Kada proces počne spawn , varijabla spawn_id je postavljena na deskriptor koji se odnosi na taj proces . Postupak opisan spawn_id smatra se "trenutnim procesom ". spawn_id može se čitati ili napisati, zapravo pružajući kontrolu nad radom.

user_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na korisnika. Na primjer, kada je postavka spawn_id postavljena na ovu vrijednost, očekujte da se ponašaju kao očekivani korisnici .

.I error_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na standardnu ​​pogrešku. Na primjer, kada je postavka spawn_id postavljena na ovu vrijednost, poslati se ponaša kao send_error .

tty_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na / dev / tty. Ako / dev / tty ne postoji (npr. U cron, at ili batch skripti), tty_spawn_id nije definiran. To se može testirati kao:

ako {[info vars tty_spawn_id]} {# / dev / tty postoji} else {# / dev / tty ne postoji # vjerojatno u cron, batch ili u script}

spawn vraća UNIX ID procesa . Ako se nijedan proces ne proizvodi , vraća se 0. Varijabla spawn_out (slave, name) postavljena je na ime pty robnog uređaja.

Po defaultu, spawn odziva naredbu i argumente. -noecho zastava zaustavlja spawn od toga.

Zastava -konzolacija uzrokuje preusmjeravanje konzole u proces izrade . To nije podržano na svim sustavima.

Unutarnje, mrijesti koristi Pty, inicijaliziran na isti način kao korisnik tty. To se dodatno inicijalizira tako da su sve postavke "zdrav" (prema stty (1)). Ako je varijabla stty_init definirana, ona se tumači u stilu stty argumenata kao daljnju konfiguraciju. Na primjer, "set stty_init raw" će uzrokovati da se daljnji terminali procesa počnu početi u sirovom načinu rada. -nottycopy preskače inicijalizaciju na temelju korisnika tty. -nottyinit preskače "zdravu" inicijalizaciju.

Uobičajeno, mrijesti traju malo vremena za izvršenje. Ako primijetite da se mrijestovi uzimaju znatnu količinu vremena, vjerojatno se susreću s ptysima koji su zadebljani. Niz testova se izvodi na ptys kako bi se izbjeglo zapletenost s pogrešnim procesima. (To traje 10 sekundi po zglobnom pty.) Trčanje Očekujte s -d opcija će pokazati ako očekuje se susreće s mnogim ptys u neparnim stanjima. Ako ne možete ubiti procese na koje su ti ptys priključeni, vaš jedini prijekor može biti ponovno pokretanje.

Ako se program ne može uspješno generirati jer exec (2) ne uspije (npr. Kada program ne postoji), poruka o pogrešci bit će vraćena sljedećom interakcijom ili očekuje naredbu kao da je program pokrenuo i da je generirala poruku o pogrešci kao izlaz. Ovo ponašanje je prirodna posljedica provedbe mrijestilišta . Unutarnje, mrijesti viljuške, nakon čega nastajan proces ne može komunicirati s izvornim procesom Expect osim komunikacije preko spawn_id.

Oznaka " open" uzrokuje da se sljedeći argument tumači kao identifikator Tcl datoteke (tj. Vraća se otvorenom .) Id mrijesta se zatim može koristiti kao da je nastao proces . (Datoteka identifikatora datoteke više se ne smije koristiti.) To vam omogućuje obradu sirovih uređaja, datoteka i cjevovoda kao generiranih procesa bez upotrebe pty. 0 se vraća da označi da nema povezanog postupka . Kada je veza s spawniranim procesom zatvorena, tako je i identifikator Tcl datoteke. Zastava -leaveopen slična je otvoru, osim što -leaveopen uzrokuje da se identifikator datoteke ostavi otvoren čak i nakon zatvaranja idema .

Prazna zastava uzrokuje otvaranje pty, ali nijedan postupak nije nastao. 0 se vraća da označi da nema povezanog postupka . Spawn_id je postavljen kao i obično.

Varijabla spawn_out (slave, fd) je postavljena na identifikator datoteke koji odgovara pty robu. Može se zatvoriti pomoću "bloka".

Signal -ignore označava signal koji se treba zanemariti u nastajanom procesu . Inače, signali dobivaju zadano ponašanje. Signali su imenovani kao u naredbi trap , osim što svaki signal zahtijeva zasebnu zastavicu.

strace razini
uzrokuje tiskanje sljedećih izjava prije izvršenja. (Tcl tragovima trag tragova varijabli.) Razina označava koliko je daleko dolje u pozivnom slogu za praćenje. Na primjer, sljedeća naredba pokreće Expect dok prati prve četiri razine poziva, ali ništa ispod nje.

očekivati ​​-c "strace 4" script.exp

Zastava -info uzrokuje da strace vrati opis najnovijih neupotrećenih argumenata.

stty args
mijenja terminalne načine slično eksternoj naredbi stty.

Prema zadanim postavkama pristupa se upravljačkom terminalu. Ako se nijedan status ne traži, a kontrolni terminal se pristupa, prethodni status sirovina i eho atributa vraća se u obliku koji je kasnije moguće koju koristi naredba.

Na primjer, argumenti koji su sirovi ili složeni stavljaju terminal u sirovi način rada. Argumenti - kopirani ili kuhani stavljaju terminal u način kuhanja. Argumenti echo i -echo stavljaju terminal u eho i noecho način.

Sljedeći primjer prikazuje kako privremeno onemogućiti odjek. To bi se moglo koristiti u inače automatskim skriptama kako bi se izbjeglo ugrađivanje lozinke u njih. (Pogledajte više rasprava o ovom pod procijenjenim EXPECT HINTS.)

stty -echo send_user "Lozinka:" expect_user -re "(. *) \ n" postavite lozinku $ expect_out (1, string) stty echo

sustav args
daje argument za sh (1) kao ulaz, baš kao da je upisan kao naredba s terminala. Očekujte čekanje dok školjka ne završi. Status povratka iz sh se obrađuje na isti način na koji exec upravlja statusom povratka.

Za razliku od izvršitelja koji preusmjerava stdin i stdout na skriptu, sustav ne provodi preusmjeravanje (osim onoga što je naznačeno samim nizom). Dakle, moguće je koristiti programe koji moraju izravno razgovarati / dev / tty. Iz istog razloga, rezultati sustava nisu zabilježeni u zapisniku.

vremenska oznaka [args]
vraća vremensku oznaku. Bez argumenata vraća se broj sekundi od vremena epoha.

Zastava -format uvodi niz koji se vraća, ali sa zamjenama napravljenim prema POSIX pravilima za strftime. Na primjer% a zamjenjuje se skraćeno ime dana u tjednu (tj. Sat). Drugi su:

% skraćeno ime dana u tjednu% puni dan u tjednu ime% b skraćeni naziv mjeseca% B puni naziv mjeseca% c datum-vrijeme kao u: sub 6. ožujka 11:45:56 1993% d dan u mjesecu (01-31% H sat (00-12)% M minuta (00-59)% p am ili pm% S sekunde (00-61)% I sat (01-12)% dan dan (001-366) % u dan (1-7, ponedjeljak je prvi dan u tjednu)% U tjedan (00-53, prva nedjelja je prvi dan prvog tjedna)% V tjedan (01-53, stil ISO 8601)% w dan (0- 6)% W tjedan (00-53, prvi ponedjeljak je prvi dan u tjednu jedan)% x datum-vrijeme kao u: Srijeda 6. listopada 1993% X vrijeme kao u: 23:59:59% y godine (00-99) % Y godina kao u: 1993% Z vremenskoj zoni (ili ništa ako nije moguće odrediti) %% znak golih postotaka

Ostale% specifikacije su nedefinirane. Ostali znakovi prolaze kroz netaknute. Podržan je samo lokalni C.

Zastava "sekunde" uvodi nekoliko sekundi od vremena koja će se koristiti kao izvor iz kojeg se formatira. U suprotnom se koristi trenutačno vrijeme.

-gmt flag snima vremensku oznaku izlaz za upotrebu vremenske zone GMT . Bez zastavice koristi se lokalna vremenska zona.

zamka [[naredba] signala]
uzrokuje da se navedena naredba izvodi nakon buduće prijema bilo kojeg od navedenih signala. Naredba se izvršava u globalnom opsegu. Ako je naredba odsutna, signalna akcija se vraća. Ako je naredba string SIG_IGN, signali se ignoriraju. Ako je naredba string SIG_DFL, signali su rezultat zadanog sustava. signali su ili jedan signal ili popis signala. Signali se mogu navesti numerički ili simbolički po signalu (3). Predbroj "SIG" može se izostaviti.

Bez argumenata (ili argumenta -broj), zamka vraća signalni broj zapovjedne zamke koji se trenutno izvršava.

Zastava- oznaka koristi povratni kod naredbe umjesto bilo kojeg koda Tcl koji se trebao vratiti kada je naredba izvorno počela prikazivati.

Interp- zastavica uzrokuje da se naredba procjenjuje pomoću tumača koji je aktivan u vrijeme kada je naredba započela, a ne kada je zamka bila proglašena.

Zastava -name uzrokuje naredbu trap da vrati signal ime zapovjedne zamke koja se trenutno izvršava.

-max flag uzrokuje naredbu trap da vrati najveći broj signala koji se može postaviti.

Na primjer, naredba "trap {send_user" Ouch! "} SIGINT" će ispisati "Ouch!" svaki put kada korisnik pritisne ^ C.

Prema zadanim postavkama, SIGINT (koji se obično generira pritiskom na ^ C) i SIGTERM uzrokuju očekivanje da izađe. To je zbog sljedeće zamke, stvoreno prema zadanim postavkama kada se očekuje početak.

izlaz s trapom {SIGINT SIGTERM}

Ako koristite -D flag za pokretanje debuggera, SIGINT se redefinira za pokretanje interaktivnog debuggera. To je zbog sljedeće zamke:

trap {exp_debug 1} SIGINT

Zamka za ispravljanje pogrešaka može se promijeniti postavljanjem varijable okoline EXPECT_DEBUG_INIT na novu naredbu trap.

Možete, naravno, poništiti obje ove samo dodavanjem zamke naredbe za skriptu. Konkretno, ako imate vlastiti "zamka izlaza SIGINT", to će nadjačati zamku za ispravljanje pogrešaka. To je korisno ako uopće želite spriječiti korisnike da dođu do debuggera.

Ako želite definirati vlastitu zamku na SIGINTu, ali još uvijek zamotajte debugger kada je pokrenut, upotrijebite:

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

Možete i zamijeniti program za ispravljanje pogrešaka pomoću nekog drugog signala.

zamka neće dopustiti da nadjačate akciju za SIGALRM jer se to interno koristi za očekivati . Naredba za prekid veze postavlja SIGALRM na SIG_IGN (ignoriraj). Možete ga ponovno omogućiti sve dok ga onemogućite tijekom sljedećih naredbi spawn.

Pogledajte signal (3) za više informacija.

pričekajte [args]
zakašnjenja dok ne završi proces isticanja (ili trenutni postupak ako nijedan nije imenovan).

čekati normalno vraća popis od četiri cjelobrojna broja. Prvi cijeli broj je proces koji je čekao. Drugi cijeli broj je odgovarajući ID mrijesta. Treći cijeli broj je -1 ako se dogodila pogreška u operacijskom sustavu ili 0 drugačije. Ako je treći cijeli broj bio 0, četvrti cijeli broj je status koji je vratio spawned proces . Ako je treći cijeli broj bio -1, četvrti cijeli broj je vrijednost pogrena koju je postavio operativni sustav. Globalna varijabla errorCode također je postavljena.

Dodatni elementi mogu se pojaviti na kraju povratne vrijednosti od čekanja . Dodatni peti element identificira klasu podataka. Trenutno je jedina moguća vrijednost za ovaj element DJEVOJKA, u kojem slučaju sljedeće dvije vrijednosti predstavljaju signalni naziv C stila i kratki tekstualni opis.

-i zastava izjavljuje proces čekanja koji odgovara imenom spawn_id (NIJE ID procesa ). Unutar SIGCHLD rukovatelja, moguće je čekati bilo koji spawned proces pomoću ikra spawn -1.

Zastava -nadzeta uzrokuje čekanje da se odmah vrati s naznakom uspješnog čekanja. Kada proces izađe (kasnije), automatski će nestati bez potrebe za eksplicitnim čekanjem.

Naredba čekanja može se koristiti i pričekajte za zidani proces pomoću argumenata "-i -1". Za razliku od njezine uporabe s izgrađenim procesima, ova se naredba može izvršiti u bilo kojem trenutku. Ne postoji kontrola nad procesom koji se koristi. Međutim, povratna vrijednost može se provjeriti za id procesa .

KNJIŽNICE

Očekujte automatski zna o dvije ugrađene knjižnice za Expect skripte. To su definirani direktorijima navedenim u varijablama exp_library i exp_exec_library. Obje su namijenjene za sadržaje uslužnih datoteka koje mogu koristiti druge skripte.

exp_library sadrži arhivske nezavisne datoteke. exp_exec_library sadrži datoteke ovisne o arhitekturi. Ovisno o sustavu, oba mapa mogu biti potpuno prazna. Postojanje datoteke $ exp_exec_library / cat-buffers opisuje da li vaš / bin / cat puferi po defaultu.

PRETTY-TISAK

Definicija vgrind je dostupna za lijepe ispisivanje Očekujte skripte. Pod pretpostavkom da je definicija vgrinda isporučena s distribucijom Expect , ispravno je instalirana, možete ga upotrijebiti kao:

vgrind -lexpect datoteku

PRIMJERI

Mnogo nije jasno kako staviti sve što je opisano na stranici. Preporučujem vam da pročitate i isprobate primjere u primjeru imenika očekivane distribucije. Neki od njih su pravi programi. Drugi su jednostavno ilustrativni za određene tehnike, i naravno, par su samo brzi hackovi. Instalacijska datoteka ima brzi pregled tih programa.

Očekuju se radovi (vidi SEE ALSO) također su korisni. Dok neki radovi upotrebljavaju sintaksu koja odgovara ranijim verzijama Expect, prateće racionalnosti još uvijek vrijede i idu u puno više detalja od ove stranice.

upozorenja

Proširenja se mogu sudarati s očekivanim imenima naredbi. Na primjer, poslati je definiran od strane Tk za sasvim drugačiju svrhu. Iz tog razloga većina očekivanih naredbi dostupna je i kao "exp_XXXX". Naredbe i varijable koje počinju s "exp", "inter", "spawn" i "timeout" nemaju zamjenske znakove. Koristite imena proširene naredbe ako vam je potrebna ova kompatibilnost između okruženja.

Očekuje se vrlo liberalno gledište o opsegu. Konkretno, varijable koje čitaju naredbe specifične za program Expect će se tražiti najprije iz lokalnog opsega, a ako se ne pronađe, u globalnom opsegu. Na primjer, ovo uklanja potrebu za postavljanjem "globalnog vremenskog ograničenja" u svaki postupak koji pišete koji koristi očekivati . S druge strane, pisane varijable uvijek su u lokalnom opsegu (osim ako je izdana "globalna" naredba). Najčešći problem koji uzrokuje je kada se spawn izvodi u postupku. Izvan postupka, spawn_id više ne postoji, tako da spawned proces više nije dostupan jednostavno zbog scoping. Dodajte "globalni spawn_id" u takav postupak.

Ako ne možete omogućiti mogućnost multispawning (tj. Vaš sustav ne podržava niti jedan odabir (BSD *. *), Anketu (SVR> 2), niti nešto ekvivalentno), Expect će moći kontrolirati samo jedan proces istodobno. U tom slučaju, nemojte pokušavati postaviti spawn_id , niti izvršavati procese preko execa dok pokrenuti pokrenuti proces . Nadalje, nećete moći očekivati od više procesa (uključujući korisnika kao jednog) u isto vrijeme.

Parametri terminala mogu imati veliki učinak na skripte. Na primjer, ako je pisana skripta za traženje odjeka, pogrešno će se primijeniti ako je odziv isključen. Iz tog razloga, očekuje se da su standardne parametre terminalnih parametara po defaultu. Nažalost, to može učiniti neugodnim za druge programe. Kao primjer, shema emacs želi promijeniti "uobičajene" preslikavanja: nove linije se mapiraju na nove linije, umjesto novog linijskog prijenosa i povratka, a odjek je onemogućen. To omogućuje uporabu emacs-a za uređivanje ulazne linije. Nažalost, očekuje se da to ne može pogoditi.

Možete zatražiti da Očekivano ne nadjačaj zadanu postavku parametara terminala, ali morate biti vrlo oprezni prilikom pisanja skripti za takva okruženja. U slučaju emacs, izbjegavajte ovisno o stvarima kao što su odjekuje i kraja od line mappinga.

Naredbe koje su prihvaćale argumente potaknute na jedan popis (varijante očekivanja i interakcije ) koriste heurističku odluku da li je popis zapravo jedan argument ili mnogi. Heuristički može uspjeti samo u slučaju kada popis zapravo predstavlja jedinstveni argument koji sadrži više ugrađenih \ n's s ne-razmak između znakova. To se čini dovoljno nevjerojatnim, no argument "-nobrace" može se upotrijebiti za prisiljavanje jednog argumenta za obradu kao jedinstvenog argumenta. To se moglo upotrijebiti s računalom generiranim Expect kodom. Slično tome, "frakcija" prisiljava jedan argument da se rukuje kao višestruki uzorci / akcije.

BUGS

Bilo je doista primamljivo spomenuti program "seks" (za "Smart EXec" ili "Send-EXpect"), ali je prevladao dobar osjećaj (ili možda samo puritanizam).

Na nekim sustavima, kada se ljuska generira, žali se da ne može pristupiti tty, ali ipak radi. To znači da vaš sustav ima mehanizam za stjecanje kontrolnog tty-a koji očekuje da ne zna. Otkrijte što je, i pošaljite mi te podatke natrag.

Ultrix 4.1 (barem najnovije verzije ovdje) smatra da vremenski rokovi iznad 1000000 odgovaraju ekvivalentu s 0.

Digitalni UNIX 4.0A (i vjerojatno i druge verzije) odbija dodijeliti ptys ako definirate SIGCHLD rukovatelj. Pogledajte dodatnu stranicu za više informacija.

IRIX 6.0 ne upravlja ispravnošću pty dopuštenja, tako da ako Expect pokušava dodijeliti pty prethodno koristi netko drugi, to ne uspije. Nadogradite na IRIX 6.1.

Telnet (ovjeren samo pod SunOS 4.1.2) visi ako TERM nije postavljen. Ovo je problem pod cron, at i cgi skriptama, koji ne definiraju TERM. Dakle, morate ga postaviti eksplicitno - na vrstu koja je obično nevažna. Samo se mora postaviti na nešto! Sljedeći vjerojatno je dovoljan za većinu slučajeva.

postavite env (TERM) vt100

Savjet (ovjeren samo pod BSDI BSD / OS 3.1 i386) visi ako SHELL i HOME nisu podešeni. Ovo je problem pod cron , at i cgi skriptama, koji ne definiraju ove varijable okruženja. Dakle, morate ih postaviti eksplicitno - na vrstu koja je obično nevažna. Samo se mora postaviti na nešto! Sljedeći vjerojatno je dovoljan za većinu slučajeva.

postavite env (SHELL) / bin / sh postavite env (HOME) / usr / local / bin

Neke implementacije ptys su dizajnirane tako da kernel izbacuje sve nepročitane izlazne vrijednosti nakon 10 do 15 sekundi (stvarni broj ovisi o implementaciji) nakon što je postupak zatvorio deskriptor datoteka. Tako se očekuju programi kao što su

spawn datum sna 20 očekuju

neće uspjeti. Kako biste to izbjegli, pozovite neinteraktivne programe s izvršiteljem, a ne mrijestom . Iako su takve situacije zamislive, u praksi nikada nisam naišla na situaciju u kojoj bi konačni izlaz istinski interaktivnog programa bio izgubljen zbog takvog ponašanja.

S druge strane, Cray UNICOS briše sve nepročitane izlaz odmah nakon što proces obustavlja deskriptor datoteka. Ovo sam prijavio Crayu i rade na popravku.

Ponekad je potrebna odgoda između prompta i odgovora, kao što je kada tty sučelje mijenja postavke za UART ili odgovarajuće brzine prijenosa traženjem start / stop bitova. Obično je potrebno samo spavanje za trenutak ili dva. Poboljšana tehnika je pokušati ponovno dok hardver ne bude spreman za primanje ulaznih podataka. Sljedeći primjer koristi obje strategije:

pošalji "brzinu 9600"; spavati 1 očekivati ​​{timeout {send "\ r"; exp_continue} $ prompt}

trap-code neće raditi s bilo kojom naredbom koja se nalazi u Tclovoj petlji događaja, kao što je san. Problem je u tome što u slučaju petlje, Tcl odbacuje povratne kodove od async događaj rukuju. Zaobilazno rješenje je postavljanje zastavice u zamku kod. Zatim provjerite zastavu odmah nakon naredbe (tj. Spavanja).

Naredba expect_background zanemaruje argumente-vrijeme i nema pojma timeouts općenito.

& EXPECT HINTS & # 34;

Postoji nekoliko stvari o očekivanju koja može biti ne-intuitivna. Ovo poglavlje pokušava riješiti neke od ovih stvari s nekoliko prijedloga.

Običan problem očekivanja je prepoznavanje zahtjeva za shell. Budući da ih različito prilagođuju različito ljudi i različite ljuske, automatiziranje rlogina može biti teško bez poznavanja brzine. Razumna konvencija je da korisnici pohranjuju redoviti izraz koji opisuje njihovu brzinu (osobito njegov kraj) u varijabli okoline EXPECT_PROMPT. Može se upotrijebiti kod poput sljedećeg. Ako EXPECT_PROMPT ne postoji, kod i dalje ima dobre izglede da ispravno funkcionira.

set prompt "(% | # | \\ $) $"; # zadani upit hvatanje {postaviti prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

Potičem vas da napišete očekuju obrasce koji uključuju kraj onoga što očekujete. Time se izbjegava mogućnost odgovaranja na pitanje prije nego što se vidi cijela stvar. Osim toga, iako biste mogli odgovarati na pitanja prije nego što ih vidite u potpunosti, ako odgovorite rano, vaš odgovor može se pojaviti na sredini pitanja. Drugim riječima, rezultirajući dijalog će biti točan, ali izgledati kodirano.

Većina upita sadrži znak svemira na kraju. Na primjer, upit s ftp je 'f', 't', 'p', '>' i. Da biste podudarali ovaj upit, morate računati za svaki od tih znakova. Uobičajena je pogreška ne uključiti prazninu. Izričito stavite prazninu.

Ako koristite uzorak obrasca X *, * će odgovarati svim izlazima primljenim od kraja X do zadnje primljene stvari. To zvuči intuitivno, ali može biti pomalo zbunjujuće jer izraz "posljednja stvar primljena" može varirati ovisno o brzini računala i obradi I / O kako kernela tako i upravljačkog programa uređaja.

Konkretno, ljudi imaju tendenciju da vide izlazni program koji dolazi u ogromne komade (atomski), kada u stvarnosti većina programa proizvodi izlazne linije odjednom. Pod pretpostavkom da je to slučaj, * u obrascu prethodnog odlomka može se podudarati samo s krajem trenutne crte, iako izgleda da je bilo više, jer je u vrijeme utakmice bilo ono što je primljeno.

očekivati ​​da nema načina da saznate da će doći do daljnjeg izlaska, osim ako vaš uzorak to ne odgovara.

Čak i ovisno o linijskom orijentiranom međuspremniku nije pametno. Ne samo da programi rijetko daju obećanja o vrsti puferskog ponašanja, ali sustavni probavni sustav može slomiti izlazne linije tako da se linije razbijaju na naizgled slučajnim mjestima. Dakle, ako možete izraziti zadnjih nekoliko znakova brzog pisanja obrasca, to je mudro to učiniti.

Ako čekate uzorak u zadnjem izlazu programa, a program emitira nešto drugo, nećete ga moći otkriti s timeout ključnom riječi. Razlog je što očekuju da neće odgoditi - umjesto toga će dobiti eof pokazatelj. Umjesto toga koristite to. Čak i bolje, upotrijebite oboje. Na taj način, ako se ta linija uvijek pomakne, nećete morati uređivati ​​liniju same.

Newlines obično se pretvaraju u povratak kola, redoslijeda redoslijeda kada ih izvodi krajnji upravljački program. Dakle, ako želite uzorak koji se eksplicitno podudara s dvije linije, od, recimo, printf ("foo \ nbar"), trebali biste upotrijebiti uzorak "foo \ r \ nbar".

Sličan prijevod dolazi kada čitate od korisnika, putem expect_user . U tom slučaju, kada pritisnete povratak, bit će preveden na novi redak. Ako se Očekuje, onda to prosljeđuje programu koji postavlja terminal na sirovi način (kao što je telnet), pojavit će se problem jer program očekuje pravi povratak. (Neki programi zapravo opraštaju jer će automatski prevesti nove linije na vraćanje, ali većina ih ne želi.) Nažalost, nema načina da doznamo da je program stavio terminal u sirovi način.

Umjesto ručnog zamjene redaka s povratima, rješenje je korištenje naredbe "stty raw", koja će zaustaviti prijevod. Napominjemo, međutim, da to znači da više nećete dobiti kuhane značajke za uređivanje linija.

međusobno komunicirati implicitno postavlja terminala na sirovi način pa se taj problem neće pojaviti.

Često je korisno pohranjivati ​​zaporke (ili druge osobne podatke) u očekivati skripte. To se ne preporučuje jer je sve što se pohranjuje na računalu podložno bilo kome. Dakle, interaktivno poticanje lozinki iz skripte je pametna ideja nego ih ugrađivati ​​doslovno. Ipak, ponekad takva ugradnja je jedina mogućnost.

Nažalost, UNIX datotečni sustav nema izravan način stvaranja skripti koje su izvršne, ali nečitljive. Sustavi koji podržavaju skripte setgid sheme mogu neizravno simulirati ovo na sljedeći način:

Izradite očekivati skriptu (koja sadrži tajne podatke) kao i obično. Učinite svoja dopuštenja 750 (-rwxr-x ---) i u vlasništvu je povjerljive grupe, tj. Grupe koja joj je dopuštena za čitanje. Ako je potrebno, stvorite novu grupu za tu svrhu. Zatim stvorite skriptu bin / sh s dozvolama 2751 (-rwxr-s - x) u vlasništvu iste grupe kao i prije.

Rezultat je skripta koju može izvršiti (i čitati) bilo tko. Kada se zove, pokreće Expect skriptu.

& # 34; VIDI I & # 34;

Tcl (3), libexpect (3)
"Istražujući očekivati: Tcl-Based Toolkit za automatiziranje interaktivnih programa" , Don Libes, str. 602, ISBN 1-56592-090-2, O'Reilly i suradnici, 1995.
"Očekujte: Oslobađanje onih neprekidnih odgovara interaktivnosti" Don Libes, Zbornik ljetopisa 1990 USENIX konferencije, Anaheim, Kalifornija, od 11. do 15. lipnja 1990.
I "Korištenje očekivati da će automatizirati zadatke administracije sustava" Don Libes, Zbornik radova 1990. USENIX velike konferencije za instalacijske sustave, Colorado Springs, Colorado, od 17. do 19. listopada 1990.
. "Tcl: Ugrađeni zapovjedni jezik", John Ousterhout, Proceedings of the Winter 1990 USENIX konferencija, Washington, DC, 22-26. Siječnja 1990. "Očekuju: skripte za kontroliranje interaktivnih programa" Don Libes, računalni sustavi , Vol. 4, br. 2, Journal of Journalism of the University of California, studeni 1991., "Interresivni programi testiranja i provjere sukladnosti", Don Libes, Proceedings of the Summer 1992 USENIX Conference, str. 135-144, San Antonio, TX, 12. i 15. lipnja 1992. godine. "Kibitz - Povezivanje višestrukih interaktivnih programa zajedno", Don Libes, Softver - praksa i iskustvo, John Wiley & Sons, West Sussex, Engleska, sv.

23, br. 5, svibanj, 1993. "Debugger za Tcl aplikacije", Don Libes, Zbornik radionice Tcl / Tk 1993., Berkeley, CA, 10. - 11. lipnja 1993.

AUTOR

Don Libes, Nacionalni institut za standarde i tehnologiju

ZAHVALE

Zahvaljujući Johnu Ousterhoutu za Tcl i Scott Paisleyu za inspiraciju. Zahvaljujući Rob Savoye for Expectovom autokonfiguracijskom kodu.

Datoteka POVIJESTI dokumentira mnogo evolucije očekivanja . Zanimljivo je čitati i možda će vam pružiti daljnji uvid u ovaj softver. Zahvaljujući osobama koje su spomenute u njemu, koji su mi poslali ispravke grešaka i pružili drugu pomoć.

Izrada i provedba očekivanja dijelom je plaćala američka vlada i stoga je u javnoj domeni. Međutim, autor i NIST bi željeli imati kredit ako se koriste ovaj program i dokumentaciju ili dijelove njih.