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:
- Uzrok vašem računalu da vas nazove natrag, tako da se možete prijaviti bez plaćanja za poziv.
- Pokrenite igru i ako se ne pojavi optimalna konfiguracija, ponovo ga ponovo pokrenite) sve dok to ne učinite, a zatim vam predajte kontrolu.
- Trčanje fsck, i kao odgovor na pitanja, odgovoriti "da" ili "ne" ili dati kontrolu natrag na vas, na temelju unaprijed određenih kriterija.
- Povežite se s drugom mrežom i automatski preuzmite poštu tako da izgleda kao da je izvorno poslana u vaš lokalni sustav.
- Prenijeti varijable okruženja, trenutni direktorij ili bilo koju vrstu informacija preko rlogin, telnet, tip, su, ili chgrp
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, ova opcija je 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 Zatvoriti obično je dovoljno za ubijanje tog procesa. Zastava -i izjavljuje da se postupak zatvara u skladu s imenom spawn_id.
Oba očekuju i međusobno će otkriti kada trenutačni proces izađe i implicitno zatvoriti, ali ako ubijete postupak, 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.
-onexit zastavica uzrokuje da se sljedeći argument koristi kao izlazni rukovatelj. Bez argumenata, trenutni izlazni rukovatelj se vraća.
-nema izlaza uzroci zastave Očekivati da se pripreme za izlazak, ali se zaustavi od stvarnog vraćanja kontrole u operativni 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 je očekivanje Izlaz se ponovno poziva (no to se može dogoditi), rukovatelji se ne preuređuju.
Nakon izlaska, sve su veze na izgrađene procese zatvorene. Zatvaranje će biti otkriveno kao EOF po izgrađenim procesima. Izlaz ne poduzimaju nikakve druge radnje izvan onoga što normalni postupak _exit (2) radi. 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čekivati . Izlaz implicitno se izvršava ako se dosegne kraj skripte.
exp_continue -continue_timer
Naredba exp_continue omogućuje očekivati da nastavi izvršavati umjesto da se vrati u normalu. Prema zadanim postavkama exp_continue vraća vremensko ograničenje vremena. -continue_timer zastava sprječava ponovno pokretanje timera. (Vidjeti očekivati za više informacija.)
exp_internal -f datoteku vrijednost
uzrokuje daljnje naredbe za slanje dijagnostičkih podataka Očekivati za stderr ako vrijednost nije nula. Ovaj je izlaz onemogućen ako vrijednost je 0. Dijagnostički podaci uključuju svaki primljeni znak, a svaki pokušaj koji odgovara trenutnom izlazu prema obrascima.
Ako je izborno datoteka dobiva se sva normalna izlaza i ispravljanje pogrešaka zapisana u tu datoteku (bez obzira na vrijednost vrijednost ). Bilo koja prethodna dijagnostička izlazna datoteka zatvorena je.
-info zastava 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 Tcl otvorio otvorena naredba. (ID mrijeste se više ne smije koristiti čekati ne bi trebalo izvršiti.
-leaveopen zastava ostavlja otvoreni ID otvoren za pristup putem Expect naredbi. čekati mora se izvršiti na ID mrijesta.
exp_pid -i spawn_id
vraća id procesa koji odgovara trenutno pokrenutom postupku. Ako je -i zastava se koristi, pid vratio odgovara onom datiranog ID-a spawn.
exp_send
je pseudonim za poslati .
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, trenutna inačica programa Očekivati vraća se. 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 verzije programa Očekivati s drugim većim brojem gotovo sigurno neće raditi. 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 je manji broj skripte veći od prikazivanja Očekivati .
Treći je broj koji ne igra nikakvu ulogu u usporedbi verzije. Međutim, ona se povećava kada Očekivati distribucija softvera se mijenja na bilo koji način, kao što je dodatna dokumentacija ili optimizacija. Vraća se na 0 na svaku novu manju verziju.
Uz -Izlaz zastava, Očekivati 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.
Uzorci najnovije expect_before naredbe implicitno koriste prije bilo kakvih drugih obrazaca. Uzorci najnovije expect_after naredbe se implicitno koriste nakon bilo kojeg drugog obrasca.
Ako su argumenti cjelini očekivati Izjava zahtijeva više od jednog retka, svi argumenti mogu biti "poduprti" u jedan kako bi se izbjeglo prekidanje 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 na kraju datoteke. Ako je uzorak ključna riječ pauza , 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 uzorak ključna riječ zadano , odgovarajuće tijelo izvršava se nakon isteka vremena ili kraja datoteke.
Ako se uzorak podudara, tada se izvršava odgovarajuće tijelo. očekivati vraća rezultat tijela (ili prazan niz 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 pauza (baš kao i ako biste ručno trebali stupiti u interakciju).
Obrasci su navedeni na tri načina. Prema zadanim su postavkama uzorci navedeni kao kod Tcl-a podudaranje s nizom naredba. (Takvi obrasci također su slični regularnim izrazima C-ljuske obično nazvanim "glob" obrasci). -gl zastava se može koristiti za zaštitu uzoraka koji se inače mogu podudarati očekivati zastave od toga. 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 prekid pretpostavlja se 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 koju definiraju Tclovi reg (kratica za naredbu "regularni izraz"). regexp obrasci se uvode sa zastavom -ponovno , 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".)
-ex zastavica 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.
-nocase zastava uzrokuje velika slova izlaza za usporedbu 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 pretjerano velike vrijednosti mogu usporiti podudaranje uzoraka.) Ako patlist je full_buffer , odgovarajuće tijelo izvršava se ako match_max bajtovi su primljeni i nijedan drugi uzorak nije podudaran. Bilo ili ne full_buffer ključna riječ se koristi, zaboravljeni znakovi su pisani na expect_out (buffer).
Ako patlist je ključna riječ nula , a dopušteni su nullovi (preko remove_nulls naredba), odgovarajuće tijelo se izvršava ako se podesi 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 (pufer) , U varijablama se spremaju do 9 regexp podnaslovnih podudaranja expect_out (1, niz) kroz expect_out (9, niz) , Ako je -indices zastava se koristi prije uzorka, početni i završni indeksi (u obliku prikladnom za lrange ) od 10 stringova 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 uzorka pomoću -notransfer zastava. Ova je zastava osobito korisna u eksperimentiranju (i može se skratiti na "-not" zbog praktičnosti prilikom eksperimentiranja).
Spremnik id povezan s odgovarajućim izlazom (ili eof ili full_buffer) pohranjen je u expect_out (spawn_id) .
-pauza zastava uzrokuje da trenutna očekivana naredba upotrijebi sljedeću vrijednost kao vremensko ograničenje umjesto da upotrebljava vrijednost vremenske varijable.
Prema zadanim postavkama uzorci se podudaraju s izlazom iz trenutnog procesa, međutim -i zastavica izjavljuje da se izlaz iz imenovanog popisa spawn_id podudara 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 mogu se upotrijebiti za usklađivanje uzoraka s bilo kojim spawn_idovima koji su imenovani sa svim ostalim -i zastavice u trenutnoj očekivati naredba. The spawn_id iz a -i zastavica bez pridruženog uzorka (tj. odmah slijede drugi -i ) dostupan je svim ostalim obrascima u istoj očekivati naredba povezana s any_spawn_id.
-i zastava također može nazvati globalnu varijablu u kojem se slučaju veličina varijable pročita 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 poput pauza i nastaviti uzrokuju kontrolne strukture (tj. za , proc ) da se ponašaju na uobičajeni način. Naredba exp_continue omogućuje očekivati da nastavi izvršavati umjesto da se vrati u normalu.
To je korisno za izbjegavanje eksplicitnih petlji ili ponovljenih očekivanih izjava. Sljedeći primjer je dio ulomka za automatizaciju rlogina. exp_continue izbjegava pisanje sekunde očekivati izjava (da biste ponovno potražili 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 strujanje očekivati da biste nastavili podudaranje uzoraka nakon izvršavanja 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 exp_continue se zove s -continue_timer zastava.
expect_after expect_args
radi isto kao i expect_before osim ako su uzorci oboje očekivati i expect_after može se podudarati, očekivati koristi se obrazac. Pogledajte expect_before naredba za više informacija.
expect_background expect_args
uzima iste argumente kao iočekivati , ali se odmah vraća. Obrasci se testiraju svaki put kad dođe novi ulaz. Šablonapauza izadano su beznačajniexpect_background i tiho su odbačeni. Inače,expect_background naredba koristiexpect_before iexpect_after obrasci poputočekivati ne.
Kadaexpect_background akcije se procjenjuju, pozadinska obrada 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 spawn id.
Nije moguće izvršitiočekivati dok jeexpect_background je deblokirano.expect_background za određeni mrijest id se briše izjavom novog expect_background s istim mrijesta id. izjavljujućiexpect_background bez ikakvog uzorka uklanja određeni ID mrijesta od mogućnosti podudaranja uzoraka u pozadini.
expected_before expect_args
uzima iste argumente kao iočekivati , ali se odmah vraća. Parametri djelovanja iz najnovijihexpect_before s istim ID mrijesta implicitno su dodani na bilo koji sljedećiočekivati naredbe. Ako se uzorak podudara, tretira se kao da je naveden uočekivati sam naredba, a pridruženo tijelo izvršava se u kontekstuočekivati naredba. Ako su uzorci obojeexpect_before iočekivati može se podudarati,expect_before koristi se obrazac.
Ako nije naveden nijedan obrazac, umnožak ID nije označen za bilo koji uzorak.
Osim ako ga ne prekorači a-i zastava,expect_before uzorci se podudaraju s terminom ID definiranim u vrijeme kada jeexpect_before naredba je izvršena (ne kada je njezin uzorak usklađen).
Uzroci -info flagexpect_before vratiti 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 kaoočekivati ali čita znakove iz / dev / tty (tj. pritisaka na tipke od korisnika). Prema zadanim postavkama čitanje se izvodi u načinu kuhanja. Dakle, linije moraju završiti s povratkom u ciljuočekivati vidjeti ih. To se može promijeniti putemstty (vidistty naredba u nastavku).
expect_user expect_args
je kaooč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 s povratkom u ciljuočekivati vidjeti ih.To se može promijeniti putemstty (vidistty naredba u nastavku).
viljuška
stvara novi proces. Novi postupak je točna kopija strujeOčekivati postupak. Uspjeh,viljuška vraća 0 na novi (dijete) postupak i vraća ID procesa procesa djeteta u roditeljski proces. Na neuspjeh (nepromjenjivo zbog nedostatka resursa, npr. Zamjenskog prostora, memorije),viljuška vraća -1 u roditeljski proces, a nijedan proces djeteta nije stvoren.
Zaštićeni procesi izlaze putemIzlaz kao i izvorni 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 najsigurnijeviljuška 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.)tumač naredba se pretpostavlja, ako konačno tijelo nedostaje.
Ako su argumenti cjeliniinterakcija Izjava zahtijeva više od jednog retka, svi argumenti mogu biti "poduprti" u jedan kako bi se izbjeglo prekidanje svakog retka uz povratni unos. 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čekivati je suspendiran. (The-reset zastavica 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,Očekivati izlazi. Ako se unese "foo", korisnik vidi "bar". Kada se pritisne ~, pritisniteOčekivati interpreter radi 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 tome,očekivati naredba koristi zadane obrasce glob-stila.)-ex zastava se može koristiti za zaštitu uzoraka koji se inače mogu podudaratiinterakcija zastave od toga. 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.)
-ponovno zastava prisiljava niz da se interpretira kao uzorak regexp stila. U tom slučaju podgrupe podudaranja pohranjuju se u varijabli interact_out slično putuočekivati pohranjuje svoj output u varijabliexpect_out ,-indices zastava je slično podržana.
ŠablonaEOF uvodi radnju koja se izvršava na kraju datoteke. ZasebnoEOF uzorak također može slijediti-izlaz zastava u kojem se slučaju podudara ako se eof detektira tijekom pisanja izlaza. Zadana jeEOF akcija je "povratak", tako dainterakcija jednostavno se vraća na bilo koji EOF.
Šablonapauza uvodi se vremensko ograničenje (u sekundama) i radnja koja se izvršava nakon što se za određeno vrijeme ne čita nijedan znak.pauza uzorak se odnosi na najnoviji postupak. Nema zadanog vremenskog ograničenja. Posebna varijabla "timeout" (koristi se zaočekivati 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čnula , a dopušteni su nullovi (prekoremove_nulls naredba), odgovarajuće tijelo se izvršava ako se podesi jedan ASCII 0. Nije moguće podudarati 0 bajta pomoću glob ili regexp obrasca.
Prefacing uzorak s zastavom-Pišem uzrokuje varijablu interact_out (spawn_id) postaviti na spawn_id koji odgovara uzorku (ili eof).
Radnje poputpauza inastaviti uzrokuju kontrolne strukture (tj.za , proc ) da se ponašaju na uobičajeni način. Međutimpovratak uzrokuje interakciju da se vrati svom pozivatelju, dokinter_return uzrociinterakcija da uzrokuje povratak u pozivatelja. Na primjer, ako se zove "proc foo"interakcija koji je tada izvršio akcijuinter_return , proc foo vratit će se. (To znači da akointerakcija pozivitumač interaktivno tipkanjepovratak će uzrokovati nastavak interakcije, dokinter_return uzrokovat će da se interakcija vrati svom pozivatelju.)
za vrijemeinterakcija , koristi se sirovi način rada tako da se svi znakovi mogu proslijediti trenutnom procesu.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 SIGSTOPOčekivati sami, prvo tumača (možda pomoću znaka za bijeg), 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.-reset zastava vraća terminal na način koji je imao prijeinterakcija je izvršen (uvijek, kuhani način rada). 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 korištenje-reset je ako vaša radnja ovisi o prikazivanju u načinu kuhanja.
-jeka zastavica šalje znakove koji odgovaraju sljedećem obrascu natrag u proces koji ih je generirao pri čitanju svakog znaka. 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.-jeka vjerojatno je prikladan samo u situacijama u kojima korisnik vjerojatno neće ispuniti 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}}
-nobuffer zastavica š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
za vrijemeinterakcija , prethodna uporabalog_user zanemaruje se. Posebno,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 bilo koji sljedeći par ključnih tijela primijeni 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 korisnik da piše stdin i čitanje stdout odOčekivati sam proces.-u zastava (za "korisnika") činiinterakcija potražite korisnika kao proces koji je nazvan 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,tumač naredba će interaktivno proč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
Da biste poslali izlaz na više procesa, navedite svaki popis ikona s predodžbom a-izlaz zastava. Ulaz za grupu izlaznog ID-a spawnova može se odrediti pomoću popisa spawn id-lista prethodnih a-ulazni zastava. (Oba-ulazni i-izlaz mogu uzeti popise u istom obliku kao i-i zastavica uočekivati naredba, osim što any_spawn_id nema smislainterakcija .) Sve sljedeće zastavice i nizovi (ili obrasci) primjenjuju se na ovaj unos dok se ne pojavi druga ulazna oznaka. Ako ne-ulazni Čini se,-izlaz implicira "-input $ user_spawn_id -output". (Slično tome, s obrascima koji nemaju-ulazni .) Ako je jedan-ulazni je poništio $ user_spawn_id. Ako još jednom-ulazni navedeno, nadjačava $ spawn_id. dodatni-ulazni mogu se navesti zastavice.
Dva su podrazumijevana ulazna procesa zadana da njihovi izlazi navedeni kao $ spawn_id i $ user_spawn_id (u obrnutom). Ako a-ulazni pojavljuje se zastavica s ne-izlaz zastavu, znakovi iz tog postupka odbacuju se.
-i zastava uvodi zamjenu za trenutni spawn_id kada nitko drugi-ulazni ili-izlaz koriste se zastavice. 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žiOčekivati i Tcl naredbi. Rezultat svake naredbe ispisuje se.
Radnje poputpauza inastaviti uzrokuju kontrolne strukture (tj.za , proc ) da se ponašaju na uobičajeni način. Međutimpovratak uzrokuje tumača da se vrati svom pozivatelju, dokinter_return uzrocitumač da uzrokuje povratak u pozivatelja. Na primjer, ako se zove "proc foo"tumač koji je tada izvršio akcijuinter_return , proc foo vratit će se. Sve druge naredbe uzrokujutumač da nastavi potaknuti nove naredbe.
Po defaultu, redak sadrži dva cjelobrojna broja. Prvi cijeli broj opisuje dubinu evaluacijskog stogova (tj., Koliko puta je Tcl_Eval pozvan). 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".
za vrijemetumač , koristi se način kuhanja, čak i ako je njegov pozivatelj koristio sirovi način rada.
Ako je stdin zatvoren,tumač će se vratiti osim ako-eof koristi se zastavica, u kojem slučaju se poziva na sljedeći argument.
log_file args -a datoteka
Ako se daje naziv datoteke,log_file zabilježit će transkript sjednice (počevši od tog trenutka) u datoteci.log_file zaustaviti snimanje ako se ne dade argument. Bilo koja prethodna log datoteka je zatvorena.
Umjesto naziva datoteke, identifikator Tcl datoteke može se dobiti pomoću-otvorena ili-leaveopen zastave. Ovo je sličnomrijest naredba. (Vidjetimrijest za više informacija.)
-a snage zastavice koje bi trebale biti zapisane, a koje je potisnuto od stranelog_user naredba.
Prema zadanim postavkama,log_file naredba dodaje na starim datotekama umjesto da ih skratite, zbog praktičnosti mogućnosti skidanja prijave i višestrukog pokretanja u jednoj sesiji. Da biste skratili datoteke, upotrijebite-noappend zastava.
-info zastavica 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.
-info zastavica 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 upotrebljavaočekivati , Sa ne veličina argument, trenutna veličina se vraća.
Uz-D zastava, postavljena je zadana veličina. (Početna zadana vrijednost je 2000 godina)-i zastavica, 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 trenutnogOčekivati 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 odOčekivati proces 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 vrijednost je nula, paritet je oduzeto, inače se ne uklanja. Sa ne vrijednost argument, trenutna vrijednost se vraća.
Uz-D zastavica, postavljena je zadana vrijednost pariteta. (Početna zadana vrijednost je 1, tj., Paritet nije uklonjen.) Uz-i zastavica, paritetna vrijednost postavljena je za ime spawn ida, inače je postavljena za trenutni proces.
remove_nulls -d -i spawn_id vrijednost
definira da li se nullovi zadržavaju ili uklanjaju iz izlaza izgubljenih procesa prije podudaranja uzoraka ili pohrane u varijabli expect_out ili interact_out , Ako vrijednost je 1, nulovi su uklonjeni. Ako vrijednost je 0, nuli se ne uklanjaju. Sa ne vrijednost argument, trenutna vrijednost se vraća.
Uz-D zastavica, postavljena je zadana vrijednost. (Početna zadana vrijednost je 1, tj. Uklanjaju se nulte vrijednosti.) Uz-i zastavica, vrijednost je postavljena za imenovani ID spawn, inače je postavljen za trenutni proces.
Bez obzira na uklanjanje ništava,Očekivati će bilježiti nulti bajtove u zapisnik i stdout.
poslati niz -flags string
šalje niz na trenutni proces. Na primjer, naredba
pošalji "hello svijet"
šalje znakove koji su sada u tijeku. (Tcl uključuje naredbu sličnu printf-u (nazvanuformat ) koji 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".
-- zastavica tjera slijedeći argument da se tumači kao niz umjesto zastave.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.)
-i zastava izjavljuje da se niz šalje u ime spawn_id. Ako je spawn_id user_spawn_id , a terminal je u sirovom načinu, novi redovi u nizu prevedeni su na redoslijed povratnih redaka, tako da se pojavljuju kao da je terminal u načinu kuhanja.-raw zastava onemogućuje ovaj prijevod.
-null zastavica šalje nulte znakove (0 bajta). Prema zadanim postavkama, šalje se jedan null. Cijeli broj može slijediti-null da biste naznačili koliko nullova želite poslati.
-pauza zastava stvara uvjet za prekid. 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.
-s snage sastava zastavice se šalju "polako", čime se izbjegava uobičajena situacija u kojoj računalo izdvaja ulazni spremnik koji je dizajniran za čovjeka koji nikada ne bi trebao 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 šalje nizove s 1 milisekundama između svakih 10 znakova poslanih.
-h snage sile zastavice koje se šalju (pomalo) kao ljudski tipovi. 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 vrijednost varijable "send_human" koja zauzima popis od 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. Nadalje, br niz argument može biti specificiran sa zastavicama za slanje null znakova ili prekida.
Dobro je prethoditi prvomposlati na proces od straneočekivati. očekivati će čekati postupak da započne, dokposlati Ne možeš. Konkretno, ako je prviposlati dovršite prije nego što se proces počne prikazivati, riskirate da se vaši podaci ignoriraju. U situacijama u kojima interaktivni programi ne nude početni redak, možete prethoditiposlati 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 pseudonim za poslati. Ako koristite Expectk ili neku drugu varijantu očekivanja u Tk okruženju,poslati definira Tk za posve drugačiju svrhu.exp_send 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 kaoposlati , osim što se izlaz šalje na stderr, a ne na trenutni proces.
send_log - niz
je kaoposlati , osim što se niz šalje samo u datoteku zapisnika (vidi strlog_file .) Argumenti se ignoriraju ako nije otvorena log datoteka.
send_tty -flags string
je kaoposlati , osim što se izlaz šalje / dev / tty nego trenutnom procesu.
string send_user -flags
je kaoposlati , osim što se output š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 se izvodi "program args. "Njegovi stdin, stdout i stderr su povezani s očekivanjem, tako da ih mogu čitati i napisati drugiOčekivati naredbe. Veza je razbijenaZatvoriti ili ako sam proces zatvara bilo koji od identifikatora datoteka.
Kada započne procesmrijest , varijabla spawn_id postavljen je na deskriptor koji se odnosi na taj proces. Postupak opisan u spawn_id smatra se "Trenutno postupak" . spawn_id mogu se čitati ili pisati, u stvari pružaju kontrolu nad radom.
user_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na korisnika. Na primjer, kada spawn_id je postavljena na ovu vrijednost,očekivati ponaša se kaoexpect_user .
.i error_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na standardnu pogrešku. Na primjer, kada spawn_id je postavljena na ovu vrijednost,poslati ponaša se kaosend_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), tada 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}
mrijest vraća ID UNIX procesa. Ako se nijedan proces ne proizvodi, vraća se 0. Varijabla spawn_out (rob, naziv) je postavljen na naziv pty robnog uređaja.
Prema zadanim postavkama,mrijest odziva naredbu i argumente.-noecho zastava prestajemrijest od toga.
-konzola zastava uzrokuje preusmjeravanje konzole na izlazni proces. To nije podržano na svim sustavima.
interno,mrijest koristi Pty, inicijaliziran je 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 definira se, tumači se 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 "normalnu" inicijalizaciju.
Normalno, redovno,mrijest nema dovoljno 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 žrtvom pty.) Trčanje Očekujte s-D opcija će pokazati akoOčekivati susreće se s mnogim ptys u neparnim državama. Ako ne možete ubiti procese na koje su ti ptys priključeni, vaš jedini prijekor može biti ponovno pokretanje.
Ako program ne može biti uspješno spađen jer exec (2) ne uspije (npr. kada program ne postoji), sljedeća će poruka vratiti poruku pogreškeinterakcija iliočekivati naredba kao da program pokrenuli su i dobili poruku pogreške kao izlaz. Ovo ponašanje je prirodna posljedica provedbemrijest , Unutarnje, mrijesti vilice, nakon čega nastajan proces nema načina komuniciranja s izvornikomOčekivati osim komunikacije preko spawn_id.
-otvorena zastavica uzrokuje da se sljedeći argument tumači kao identifikator Tcl datoteke (tj., vraća gaotvorena .) ID mrijesta može se upotrijebiti 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.-leaveopen zastava je slična-otvorena osim toga-leaveopen uzrokuje da se identifikator datoteke ostavi otvoren čak i nakon zatvaranja idema.
-pty zastava uzrokuje otvaranje pty, ali nijedan proces nije postao. 0 se vraća da označi da nema povezanog postupka. Spawn_id je postavljen kao i obično.
Varijabla spawn_out (rob, FD) je postavljen na identifikator datoteke koji odgovara pty robu. Može se zatvoriti pomoću "bloka".
-zanemariti zastavice označavaju signal koji se zanemaruje u procesu započetog. Inače, signali dobivaju zadano ponašanje. Signali su imenovani kao uzamka , osim što svaki signal zahtijeva zasebnu zastavicu.
strace razini
uzrokuje tiskanje sljedećih izjava prije izvršenja. (Tcl tragovima zapisa prati varijable.) nivo označava koliko je daleko dolje u pozivnom slogu za praćenje. Na primjer, naredba se pokrećeOčekivati dok prate prve 4 razine poziva, ali ništa ispod toga.
očekivati -c "strace 4" script.exp
-info zastava 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, argumentisirov ili-cooked stavite terminal u sirovi način. Argumenti-raw ilikuhan stavite terminal u način kuhanja. Argumentijeka i-jeka stavite 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 args na sh (1) kao ulaz, baš kao da je upisana kao naredba s terminala.Očekivati čeka dok školjka ne završi. Status povratka iz sh se obrađuje na isti načinexec upravlja statusom povratka.
Za razliku odexec koji preusmjerava stdin i stdout na scenarij,sistem 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, rezultatisistem nisu zabilježeni u zapisniku.
vremenska oznaka args
vraća vremensku oznaku. Bez argumenata vraća se broj sekundi od vremena epoha.
-format zastava uvodi niz koji se vraća, ali s zamjenama napravljenim prema POSIX pravilima za strftime. Primjerice,% a zamjenjuje se skraćenim radnim danom (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.
-seconds zastava uvodi nekoliko sekundi od epoha koja će se koristiti kao izvor iz kojeg se oblikuje. U suprotnom se koristi trenutačno vrijeme.
-gmt sila zastava snima vremensku oznaku za upotrebu vremenske zone GMT. Bez zastavice koristi se lok