Linux / Unix naredba očekuje

Očekuje se program koji razgovara sa drugim interaktivnim programima prema scenariju. Nakon scenarija, Expect zna šta se od programa može očekivati ​​i kakav bi trebao biti odgovarajući odgovor. Tumačeni jezik obezbeđuje granične strukture i kontrolne strukture na visokom nivou za usmeravanje dijaloga. Osim toga, korisnik može preuzeti kontrolu i interakciju direktno kada to želi, nakon čega se vraća kontrola na skriptu.

Expectk je mešavina Expect i Tk. Ponaša se isto kao želja Očekivanja i Tk. Očekuje se takođe može se koristiti direktno u C ili C ++ bez Tcl.

Naziv "Expect" dolazi od ideje o slanju / oćekivanju sekvenci koje popularizuju uucp, kermit i drugi programi za kontrolu modema. Međutim, za razliku od UUCP-a, Expect je generalizovan tako da se može pokrenuti kao korisnički nivo sa svim programima i zadacima. Očekuje se da može razgovarati sa više programa istovremeno.

Šta očekujete

Na primjer, evo nekih stvari koje naredba može očekivati:

Postoji mnogo razloga zašto shell ne može izvršiti ove zadatke. Sve je moguće sa Expect.

Generalno, Expect je korisno za pokretanje bilo kog programa koji zahteva interakciju između programa i korisnika. Sve što je potrebno je da se interakcija može okarakterisati programski. Očekuje se, takođe, može vratiti kontrolu korisniku bez zaustavljanja programa koji se kontroliše. Slično tome, korisnik može u bilo kom trenutku vratiti kontrolu u skriptu.

Upotreba

Očekuje čitanje cmdfilea za listu komandi za izvršavanje. Očekuje se da se implicitno pozivaju na sisteme koji podržavaju #! notaciju markiranjem scenarija kao izvršne i pravljenje prve linije u skripti:

#! / usr / local / bin / očekivati ​​-f

Naravno, put mora precizno opisati gde Očekuje života. / usr / local / bin je samo primer.

Zastava -c označava komandu koja se izvršava pre bilo kog u skripti. Komandu treba citirati kako bi se sprečilo razbijanje granate. Ova opcija se može koristiti više puta. Višestruke komande mogu se izvršiti sa jednim -c tako što ih razdvaja sa tačkama i tačkama. Komande se izvršavaju po redosledu koji se pojavljuju. Kada koristite Expectk, ova opcija je navedena kao -command.

Zastava -d omogućava određeni dijagnostički izlaz, koji prvenstveno izveštava o unutrašnjoj aktivnosti komandi kao što su očekivani i interaktivni. Ova zastava ima isti efekat kao i "exp_internal 1" na početku Expect skripta, a štampana je i verzija Expect.

Zastava -D omogućava interaktivni debager. Trebalo bi slijediti cjelovitu vrijednost. Debuger će preuzeti kontrolu pre sledeće Tcl procedure ako je vrednost nula ili ako pritisnete ^ C ili ako je prekinuta tačka ili u odgovarajućoj skripti se pojavljuje druga odgovarajuća komanda za otklanjanje grešaka. Kada koristite Expectk, ova opcija je navedena kao - Debug.

Zastava -f pretvara datoteku iz koje čita komande. Sama zastava je opciona jer je korisna samo ako koristite #! tako da se u komandnoj liniji mogu nabaviti i drugi argumenti. Kada koristite Expectk, ova opcija je specificirana kao -file.

Podrazumevano, komandna datoteka se čita u memoriju i izvršava u potpunosti. Povremeno je poželjno čitati datoteke jedne linije u isto vrijeme. Da biste primenili proizvoljne fajlove na koje treba postupiti na ovaj način, koristite oznaku -b. Kada koristite Expectk, ova opcija je navedena kao -buffer.

Ako se string "-" isporučuje kao ime datoteke, umesto toga se čita standardni ulaz. Koristite "./-" za čitanje iz datoteke koja je zapravo naziva "-".

Zastava -i uzrokuje Očekuje da interaktivno traži komande umesto da ih čitate iz datoteke. Pažnja se prekida putem komande za izlaz ili preko EOF-a. Za -i zastava se pretpostavlja ako se ne koristi komandna datoteka niti -c. Kada koristite Expectk, ova opcija je označena kao -interaktivna.

- može se koristiti za ograničavanje kraja opcija. Ovo je korisno ako želite da prođete argument koji se odnosi na opciju u vašu skriptu, a da ne bude interpretirana od strane Expect-a. Ovo se može korisno staviti u #! linija kako bi se spriječilo bilo kakvo tumačenje poput Expect. Na primjer, sljedeće će ostaviti izvorne argumente uključujući ime skripte u varijabli argv .

#! / usr / local / bin / očekivati ​​-

Imajte na umu da se uobičajene getopt (3) i execve (2) konvencije moraju poštovati prilikom dodavanja argumenata na #! line.

Datoteka $ exp_library / expect.rc se automatski dobija ako je prisutna, osim ako se koristi oznaka -N. (Kada koristite Expectk, ova opcija je označena kao -NORC.) Odmah nakon toga, datoteka ~ / .expect.rc se automatski dobija, osim ako se ne koristi oznaka -n. Ako je definirana varijabla okruženja DOTDIR, tretira se kao direktorij i od nje se čita .expect.rc. Kada koristite Expectk, ova opcija je navedena kao -norc. Ovaj izvor se javlja tek nakon izvršenja bilo kojih -c zastavica.

-v uzroci Očekujte da odštampate svoj broj verzije i izađite. Odgovarajuća zastava u Expectk, koja koristi duga imena zastavice, je -version.

Opcioni argumenti su konstruisani u listu i sačuvani u varijabli pod nazivom argv i. argc je inicijalizovan do dužine argv.

Argv0 je definisan kao ime skripte ili binarnog ako se ne koristi skripta. Na primer, sledeće odštampa ime skripte i prve tri argumente:

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

Komande

Expect koristi jezik komande alata. Tcl obezbeđuje kontrolni protok (ako, za, pauzu), evaluaciju izraza i nekoliko drugih karakteristika kao što je rekurzija i definicija procedure. Komande koje se ovde koriste, ali nisu definirane (podesite, ako, exec) su Tcl naredbe. Očekuje da podržava dodatne komande. Ako nije drugačije naznačeno, komande vraćaju prazan niz.

Komande su navedene po abecednom redu tako da se mogu brzo locirati. Međutim, novim korisnicima može biti lakše početi čitanjem opisa mamaca, slanja, ocekivanja i interakcije u tom redosledu.

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

zatvara vezu sa trenutnim procesom . Većina interaktivnih programa će otkriti EOF na svom stdinu i izlazu; Zatim je obično dovoljno da se ubije proces . Zastava -i deklariše proces zatvaranja koji odgovara imenovanom spawn_id.

Oba očekivanja i interakcije će otkriti kada trenutni proces izlazi i implicitno zatvori, ali ako ubijete proces , recimo, "exec kill $ pid", morate eksplicitno zatražiti zatvori .

Zastita -onexec određuje da li je id spawn zatvoren u bilo kojem novom procesu ili ako je proces prekriven. Da biste otvorili otvoreni izvor, koristite vrijednost 0. Nula vrijednost cijele vrijednosti dovodi do toga da je pokvarač zatvoren u bilo kojem novom procesu.

Zastava -slava zatvara robu povezano sa ID-om spawn-a. Kada je veza zatvorena, slave se automatski zatvara, ako je i dalje otvoren.

Bez obzira da li je veza zatvorena implicitno ili eksplicitno, trebalo bi da pozovete čekanje da biste izbrisali odgovarajući slot procesnog jezgra. Komanda za zatvaranje ne poziva pozivanje pošto nema garancije da će zatvaranje procesne veze prouzrokovati izlazak.

debug [[-now] 0 | 1]

kontroliše Tcl debugger koji vam omogućava da koračate kroz izjave i postavite tačke prekida.

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

Sa 1 argumentom, debugger je pokrenut. Sa argumentom 0, debugger je zaustavljen. Ako prethodnom argumentu prethodi oznaka -now, debuger se pokreće odmah. U suprotnom, debugger se započinje sa sledećom Tcl izrazom.

Komanda za debaganje ne mijenja zamke. Uporedite ovo sa započinjanjem Expect-a sa oznakom -D.

Komanda za isključivanje prekida proces odvajanja sa terminala . Nastavlja se u pozadini. Procesu se daje sopstvena procesna grupa. Standardni I / O se preusmerava na / dev / null .

Sledeći fragment koristi diskonekt za nastavak pokretanja skripte u pozadini.

ako {[fork]! = 0} isključite izlaz. . .

Sledeći skripta čita lozinku i zatim pokreće program svakog sata koji zahteva lozinku svaki put kada se pokrene. Skripta isporučuje lozinku tako da je morate jednom unijeti samo jednom.

send_user "lozinka? \" expect_user -re "(. *) \ n" za {} 1 {} {ako {[fork]! = 0} {spavanje 3600; nastavi} isključi spawn priv_prog očekivati ​​Lozinka: pošalji "$ expect_out 1, string) \ r ". . . Izlaz }

Prednost korištenja isključenja preko funkcije asinhronog procesa (&) shell-a je da Expect može sačuvati parametre terminala prije odvojenja i kasnije ih primijeniti na nove ptys. Sa &, Expect nema šansu da pročita parametre terminala pošto je terminal već isključen do trenutka kada Expect prima kontrolu.

izlaz [opcije] [status]

uzrokuje izlazak ili se na drugi način pripremi za to.

Zastava -onxit dovodi do toga da se sledeći argument koristi kao izlazni upravljač. Bez argumenta, trenutni upravljački program za izlaz se vraća.

Nepoznata zastava izaziva Očekuje se da se pripremi za izlazak, ali ne prestane sa povratkom kontrole na operativni sistem. Pokreće se korisnikski izlazni upravljač, kao i Expectovi sopstveni interni upravljači. Ne trebaju se izvršiti nikakve daljnje komande Expect. Ovo je korisno ako pokrećete Expect sa drugim Tcl ekstenzijama. Trenutni tumač (i glavni prozor ako se nalazi u okruženju Tk) ostaju na raspolaganju tako da se ostali Tcl produžeci mogu očistiti. Ako se Expectov izlaz ponovo pozove (iako se to može desiti), nećete ponovo preusmeriti.

Nakon izlaska, sve veze sa pokrenutim procesima su zatvorene. Zatvaranje će biti otkriveno kao EOF po porastim procesima. izlaz ne preduzima nikakve druge akcije izvan onoga što normalni _exit (2) postupak radi. Stoga, procesi koji ne provjeravaju EOF mogu i dalje pokrenuti. (Različiti uslovi su važni za određivanje, na primjer, koji signali će biti poslani proces, ali oni su sistemski zavisni, obično dokumentovani pod izlazom (3).) Postrojeni procesi koji se nastavljaju pokrenuti će biti nasleđeni initom.

status (ili 0 ako nije naveden) se vraća kao status izlaza Expect . izlaz se implicitno izvršava ako se dostigne kraj skripte.

exp_continue [-continue_timer]
Komanda exp_continue dozvoljava da očekuje da nastavi da se izvršava, a ne da se vraća, kako to normalno. Podrazumevano exp_continue resetuje tajmer tajmera. Zastava -continue_timer sprečava ponovno pokretanje tajmera. ( Očekujte dodatne informacije.)

exp_internal [-f file] vrijednost
uzrokuje dalje komande da šalju dijagnostičke informacije unutarnje da očekuju stderr ako je vrednost nula. Ovaj izlaz je onemogućen ako je vrijednost 0. Dijagnostičke informacije uključuju svaki primljeni karakter, a svaki pokušaj se prilagođava trenutnom izlazu prema obrascima.

Ako se isporučuje opcionalna datoteka , sve te normalne i ispravke izlaza se upisuju u tu datoteku (bez obzira na vrijednost vrijednosti ). Bilo koja prethodna dijagnostička izlazna datoteka je zatvorena.

Zastava -info uzrokuje exp_internal da vrati opis najnovijih argumenata koji nisu navedeni.

exp_open [args] [-i spawn_id]
vraća identifikator Tcl fajla koji odgovara originalnom ID-u spawn-a. Identifikator datoteke može se koristiti kao da je otvorio Tcl-ova otvorena komanda. (Id ne treba više da se koristi. Čekanje ne treba izvršiti.

Zastava -leaveopen ostavlja otvoreni id za otvaranje kroz Expect komande. Čekanje mora biti izvršeno na ID-u.

exp_pid [-i spawn_id]
vraća id procesa koji odgovara trenutnom procesu. Ako se koristi oznaka -i , povratni pid odgovara onom od navedenog id spawn-a.

exp_send
je pseudonim za slanje .

exp_send_error
je alijas za send_error .

exp_send_log
je alijas za send_log .

exp_send_tty
je alijas za send_tty .

exp_send_user
je alijas za send_user .

exp_version [[-exit] verzija]
korisno je osigurati da je skript kompatibilan sa trenutnom verzijom Expect-a.

Bez argumenata, vraća se trenutna verzija Expect- a. Ova verzija se onda može kodirati u vašoj skripti. Ako stvarno znate da ne koristite funkcije najnovijih verzija, možete odrediti stariju verziju.

Verzije se sastoje od tri broja razdvojenih tačkama. Prvi je glavni broj. Skripte napisane za verzije Expect sa drugim velikim brojem gotovo sigurno neće raditi. exp_version vraća grešku ako se glavni brojevi ne podudaraju.

Drugo je mali broj. Skripte napisane za verziju sa većim malim brojem od trenutne verzije mogu zavisiti od neke nove funkcije i možda neće biti pokrenuta. exp_version vraća grešku ako se glavni brojevi podudaraju, ali manji broj skripte je veći od onog kod Run Expect .

Treći je broj koji ne učestvuje u poređenju sa verzijom. Međutim, povećava se kada se distribucija softvera Expect menja na bilo koji način, na primer pomoću dodatne dokumentacije ili optimizacije. Ona se resetuje na 0 po svakoj novoj manji verziji.

Uz oznaku -exit , Expect otvara grešku i izlazi ako je verzija zastarjela .

očekivati ​​[[-opts] pat1 body1] ... [-opts] patn [bodyn]
čeka da se jedan od obrasca podudara sa izvorom porijeklog procesa, određeni vremenski period je prošao, ili se vidi kraj datoteke. Ako je završno tijelo prazno, može se izostaviti.

Patterns iz najnovije naredbe expect_before se implicitno koriste pre bilo kojih drugih obrasca. Patterns iz najnovije orijentacije o naredbi_after se implicitno koriste nakon bilo kojih drugih obrasca.

Ako argumenti za čitavu očekivanu izjavu zahtijevaju više od jedne linije, svi argumenti mogu biti "ubačeni" u jedan tako da se izbjegne preklapanje svake linije sa kosim sapunicom. U ovom slucaju, uobicajene Tcl zamene ce se desiti uprkos grudima.

Ako je obrazac ključna riječ eof , odgovarajuće tijelo se izvršava nakon završetka datoteke. Ako je šablon tajming ključne reči, odgovarajuće tijelo se izvršava nakon isteka vremena. Ako se ne koristi ključna reč za vremensko ograničenje, implicitna nulta akcija se izvršava nakon isteka vremena. Podrazumevani vremenski period je 10 sekundi, ali se može postaviti, na primjer do 30, komandom "set timeout 30". Beskonačno prekoračenje vremena može biti označeno vrijednošću -1. Ako je šablon podrazumevana podrazumevana ključna reč, odgovarajuće tijelo se izvršava nakon vremenskog ili krajnjeg fajla.

Ako se obrazac podudara, onda se izvršava odgovarajuće telo. očekivati vraćanje rezultata tela (ili praznog niza ako se ne uklapa uzorak). U slučaju da se više obrasca podudara, onaj koji se prvi pojavljuje koristi se za odabir tela.

Svaki put kada novi izlaz stigne, on se upoređuje sa svakim obrazcem u redosledu koji su navedeni. Prema tome, možete testirati za odsustvo meča tako što ćete napraviti poslednji obrazac koji se garantuje da se pojavljuje, kao što je prompt. U situacijama kada nema uputstva, morate koristiti vremenski raspored (kao što biste i vi bili, ako ste interaktivni ručno).

Obrasci su navedeni na tri načina. Podrazumevano su obrasci navedeni kao u Tcl-ovoj komandi string match . (Takvi obrasci su takođe slični regularnim izrazima C-shell obično nazivani "glob" obrasci). Zastava -gl se može koristiti za zaštitu obrasca koji bi inače mogli odgovarati očekivanju zastava od toga. Bilo koji obrazac koji počinje sa "-" treba zaštititi na ovaj način. (Svi stringovi koji počinju sa "-" rezervisani su za buduće opcije.)

Na primjer, sljedeći fragment traži uspješno prijavljivanje. (Imajte na umu da je prekid pretpostavljen da je procedura definirana na drugom mestu u skripti.)

očekujte {busy {staviti zauzeto \ n; exp_continue} nije uspeo prekinuti "nevažeću lozinku" prekinuti prekid vremenske veze prekinuto povezano}

Citati su neophodni na četvrtom obrazcu jer sadrži prostor, koji bi inače odvojio obrazac iz akcije. Uzorci sa istom akcijom (kao što su treći i četvrti) moraju ponovo navesti akcije. Ovo se može izbjeći korištenjem regexp stilova (vidi dolje). Više informacija o formiranju glob-style šablona možete naći u priručniku Tcl.

Modeli Regexp-a slijede sintaksu definisanu Tcl's regexp (kratkom za "regular expression") komandu. regexp šabloni se unose sa zastavom -re . Prethodni primer se može prepisati pomoću regexp-a kao:

očekujte {busy {staviti zauzeto \ n; exp_continue} -re "neuspjela | neispravna lozinka" prekinut prekid vremenske veze prekinut povezan}

Oba tipa obrasca su "neispravna". To znači da obrasci ne moraju da se podudaraju sa cijelim nizom, ali mogu započeti i završiti utakmicu bilo gdje u nizu (dok god se sve drugo poklapa). Koristite ^ da se podudaraju sa početkom stringa, a $ da odgovara kraju. Imajte na umu da, ako ne čekate na kraj niza, vaši odgovori se lako mogu završiti u sredini stringa jer se odražavaju iz porijeklog procesa. Dok još uvijek proizvode ispravne rezultate, izlaz može izgledati neprirodno. Stoga, korištenje $ podstiče se ako možete tačno opisati znakove na kraju niza.

Imajte u vidu da u mnogim urednicima, ^ i $ odgovaraju početku i kraju linija. Međutim, pošto ocekivanje nije linijsko orijentisano, ovi karakteri se podudaraju sa početkom i krajom podataka (za razliku od linija) trenutno u očekivanju odgovarajućeg pufera. (Takođe, pogledajte napomenu ispod o "sistemskoj varijaciji").

Zastava -ex uzrokuje da obrazac bude uparen kao "tačan" string. Ne postoji tumačenje *, ^, itd. (Mada se uobičajene Tcl konvencije još uvijek moraju poštovati). Tačan obrasci su uvek neispravni.

Zastita -nokaza uzrokuje velike slova izlaza da se uporede kao da su mala slova. Obrazac nije pod utjecajem.

Dok čitate izlaz, više od 2000 bajtova može primorati ranije bajtove da budu "zaboravljeni". Ovo se može promeniti s funkcijom match_max . (Imajte na umu da prekomerno velike vrijednosti mogu usporiti uzorkovanje uzorka.) Ako je lista za prijenos punim buđem , odgovarajuće tijelo se izvršava ako su primljeni match_max bajtovi i nijedan drugi obrazac se ne poklapa. Bez obzira da li se koristi ključna reč full_buffer ili ne, zaboravljeni znaci su upisani u expect_out (buffer).

Ako je lista lista ključna riječ null , a nulls su dozvoljeni (preko remove_nulls naredbe), odgovarajuće tijelo se izvršava ako se podudara s jednim ASCII 0. Nije moguće podesiti 0 bajtova pomoću glob ili regexp šablona.

Nakon usklađivanja šablona (ili eof ili full_buffer), bilo koji odgovarajući i prethodno neizmiren izlaz se čuva u varijabli expect_out (buffer) . Do 9 podudaranja regexp podrazumeva se sačuvaju u varijablama expect_out (1, string) kroz expect_out (9, string) . Ako se oznaka -indices koristi prije šablona, ​​početni i krajnji indeksi (u obliku pogodnom za lenjing ) od 10 žica se čuvaju u varijablama expect_out (X, start) i expect_out (X, kraj) gdje je X cifra, odgovara poziciji supstitucije u baferu. 0 odnosi se na nizove koji su odgovarali čitavom šablonu i generisani su za šablone globa, kao i regexp šablone. Na primjer, ako je proces proizveo output iz "abcdefgh \ n", rezultat je:

očekivati ​​"cd"

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

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

i "efgh \ n" je ostavljeno u izlaznom puferu. Ako je proces proizveo izlaz "abbbcabkkkka \ n", rezultat:

očekivati ​​-indices -re "b (b *). * (k +)"

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

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

i "a \ n" je ostavljeno u izlaznom baferu. Šablon "*" (i -re ". *") Će isprazniti izlazni bafer bez čitanja više izlaza iz procesa.

Uobičajeno je da se usklađeni izlaz odbacuje iz internih bafera Expect-a. Ovo se može sprečiti prefiksom šablona sa oznakom -notransfer . Ova zastava je naročito korisna u eksperimentisanju (i može se skratiti na "-not" radi lakšeg eksperimentisanja).

Id spawn povezan sa odgovarajućim izlazom (ili eof ili full_buffer) je uskladišten u expect_out (spawn_id) .

Zastava -timeout dovodi trenutnu komandu očekivanja da koristi sljedeću vrijednost kao vremenski raspored umesto da koristi vrijednost vremenske varijable.

Podrazumevano se obrasci podudaraju sa izlazom iz trenutnog procesa, međutim oznaka -i deklariše izlaz iz spawn_id liste koja se podudara sa bilo kojim sledećim obrascima (do sledećeg -i ). Lista spawn_id-a bi trebala biti ili separirana lista spawn_ids ili varijabla koja se odnosi na takvu listu spawn_ids-a.

Na primjer, sljedeći primjer čeka "povezan" od trenutnog procesa, ili "zauzet", "neuspjeh" ili "nevažeća lozinka" iz spawn_id imenovanog $ proc2.

očekujte {-i $ proc2 zauzet {stavlja zauzeto \ n; exp_continue} -re "neuspjela | neispravna lozinka" prekinut prekid vremenske veze prekinut povezan}

Vrednost globalne varijable any_spawn_id može se koristiti za usklađivanje obrazaca sa bilo kojim spawn_idima koji su imenovani sa svim drugim -i zastavama u trenutnoj komandi očekivanja . Spawn_id iz oznake -i bez povezanog šablona (tj. Odmah sledi drugi -i ) stavlja se na raspolaganje bilo kojem drugom obrascu u istoj oćekivani komandi povezana sa bilo kojim_spawn_id.

Zastava -i može takođe nazvati globalnu varijablu, u tom slučaju se varijabla pročita za listu ID-ova. Varijabla se ponovo priča kad god se promijeni. Ovo omogućava način promjene izvora I / O dok se komanda izvršava. Ovakvi ID-ovi se nazivaju "indirektni" ID-ovi.

Akcije kao što su prekidanje i nastavak uzrokuju strukture kontrole (tj. Za , proc ) da se ponašaju na uobičajeni način. Komanda exp_continue dozvoljava da očekuje da nastavi da se izvršava, a ne da se vraća, kako to normalno.

Ovo je korisno za izbegavanje eksplicitnih petlji ili ponovljenih očekivanih izjava. Sledeći primjer je dio fragmenta za automatizaciju rlogina. Exp_continue izbegava da napiše drugu očekivanu izjavu (da ponovo potraži poziv) ako rlogin zatraži lozinku.

očekujte {Password: {stty -echo send_user "lozinka (za $ user) na $ hostu:" expect_user -re "(. *) \ n" send_user "\ n" pošalji "$ expect_out (1, string) \ r" stty echo exp_continue} neispravna {send_user "nevažeća lozinka ili račun \ n" exit} veza sa vremenom {send_user "na vremenski raspored $ hosted \ n" exit} eof {send_user \ "veza sa hostom nije uspela: $ expect_out (buffer)" exit} re $ prompt}

Na primer, sledeći fragment može pomoći korisniku da vodi interakciju koja je već potpuno automatizovana. U ovom slučaju, terminal se stavlja u raw mode. Ako korisnik pritisne "+", varijabla se povećava. Ako je pritisnuto "p", nekoliko povrataka se šalju u proces, možda da ga pokvari na neki način, a "i" omogućava korisniku da interaktuje sa procesom, efikasno ukrade kontrolu iz skripte. U svakom slučaju, exp_continue dozvoljava trenutnoj ocekivanju da nastavi sa podudaranjem uzorka nakon izvršenja trenutne akcije.

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

Podrazumevano, exp_continue resetuje tajmer tajmera. Tajmer se ne restartuje, ako se exp_continue poziva sa oznakom -continue_timer .

expect_after [expect_args]
radi identično očekivano, osim ako se obrasci iz očekivanih i očekivanih mogu usaglasiti , očekivani obrazac se koristi. Za više informacija pogledajte komandu expect_before .

expect_background [expect_args]
uzima iste argumente kao i očekivani , ali se odmah vraća. Patterns se testiraju kad god dođe novi ulaz. Vremensko ograničenje uzorka i podrazumevana vrednost su besmislena za očekivati ​​povratne pozive i tišina se odbacuju. U suprotnom, komanda expect_background koristi expect_before i expect_after obrasce baš kao što očekuje .

Kada se evaluiraju postupci expect_background , obrada pozadine za isti id spawn je blokirana. Obrada pozadine se deblokira kada se akcija završi. Dok je obrada pozadine blokirana, moguće je (frontground) očekivati na istom ID-u za spawn.

Nije moguće izvršiti očekivanje dok se očekuje_background deblokirati. expect_background za određeni id spawn-a se briše deklaracijom nove expect_background-a sa istim id-om za spawn. Objašnjenje expect_background bez šablona uklanja određeni id spawn-a od mogućnosti usklađivanja obrazaca u pozadini.

expect_before [expect_args]
uzima iste argumente kao i očekivani , ali se odmah vraća. Parametri parova od najnovijih očekivanih prethodnika sa istim ID-om za spawn se implicitno dodaju u sledeće očekivane komande. Ako se obrazac podudara, tretira se kao da je naveden u samoj komandi očekivanja , a pridruženo telo se izvršava u kontekstu očekivane komande. Ako se obrasci iz očekivanih i očekivanih mogu zadovoljiti, očekivani obrazac se koristi.

Ako nijedan šablon nije naveden, id matrice se ne proverava za bilo koji obrasci.

Osim ako nije nadređena sa -i zastavom, očekivani brojevi šarže se poklapaju sa id-om koji je definisan u trenutku kada je izvršena komanda expect_before (a ne kada se njegov uzorak poklapa).

Zastava -info uzrokuje expect_before da vrati trenutne specifikacije onih obrazaca koje će se podudarati. Podrazumevano, ona izveštava o trenutnom ID-u za spawn. Za informaciju o tom ID-u za spawn se može dati posebna specifikacija id spawn-a. Na primjer

expect_before -info-i $ proc

Najviše se može dati jedna specifikacija za spawn. Indikator-indikator potiskuje direktne identifikacione podatke koji dolaze samo iz indirektnih specifikacija.

Umjesto specifikacije id-a za spawn, znak "-all" će uzrokovati "-info" da izveštava o svim ID-u za spawn.

Izlaz oznake -info može se ponovo koristiti kao argument za očekivanje_naprijed.

expect_tty [expect_args]
je kao ocekivati, ali cita karaktere iz / dev / tty (npr. keystrokes od korisnika). Po podrazumevanoj vrednosti, očitavanje se vrši u režimu kuvanja. Stoga, linije moraju da se završe sa povratkom da bi ocekivali da ih vide. Ovo se može promeniti preko stty (pogledajte komandu stty ispod).

expect_user [expect_args]
je kao ocekivati, ali ce citati znake iz stdin-a (npr. keystrokes od korisnika). Po podrazumevanoj vrednosti, očitavanje se vrši u režimu kuvanja. Stoga, linije moraju da se završe sa povratkom da bi ocekivali da ih vide. Ovo se može promeniti preko stty (pogledajte komandu stty ispod).

viljuška
stvara novi proces . Novi proces je tačna kopija trenutnog Expect procesa . Na uspeh, viljuška vraća 0 u novi proces (deteta) i vraća identifikacioni proces detetovog procesa u roditeljski proces . Na neuspjehu (uvijek zbog nedostatka resursa, npr. Swap prostora, memorije), viljuška vraća -1 u roditeljski proces , a djeca proces se ne kreira.

Izlazni procesi izlaze preko komande za izlazak , baš kao i originalni proces . Dozvoljeni procesi se mogu pisati u datoteke dnevnika. Ako ne onemogućite debagovanje ili prijavljivanje u većini procesa, rezultat može biti zbunjujući.

Neke pty implementacije mogu zbuniti više čitača i pisaca, čak i trenutačno. Dakle, najsigurnije je da se pre forme pre mrtvih procesa.

interakcija [string1 body1] ... [stringn [bodyn]]
daje kontrolu nad trenutnim procesom korisniku, tako da se tasteri upućuju u trenutni proces , a stdout i stderr trenutnog procesa se vraćaju.

Pari string-stringa mogu biti navedeni kao argumenti, u kom slučaju se telo izvršava kada se unese odgovarajući string. (Po podrazumevanoj vrednosti, string se ne šalje trenutnom procesu .) Prevod komande prevodioca se pretpostavlja ako nedostaje završno telo.

Ako argumenti za čitavu interakciju zahtevaju više od jedne linije, svi argumenti mogu biti "ubačeni" u jedan tako da se izbjegne preklapanje svake linije sa kosim trakom. U ovom slucaju, uobicajene Tcl zamene ce se desiti uprkos grudima.

Na primjer, sljedeća komanda pokreće interakciju s sljedećim parovima string-body: Kada pritisnete ^ Z, Expect je suspendovan. ( Zastita -reset vraća terminalne režime.) Kada pritisnete ^ A, korisnik vidi "uneli ste kontrolu-A" i proces se šalje ^ A. Kada se pritisne $, korisnik vidi datum. Kada pritisnete ^ C, Expect izlazi. Ako se unese "foo", korisnik vidi "bar". Kada pritisnete ~~, interaktor Expect radi interaktivno.

set CTRLZ \ 032 interaktivno {-reset $ CTRLZ {exec kill -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 paru string-body, stringovi se podudaraju u redosledu koji su navedeni kao argumenti. Nizovi koji se delimično podudaraju ne šalju se u trenutni proces u očekivanju preostalih dolazaka. Ako se znak unese tako da više ne može biti podudaranje, samo će deo niza biti poslat u proces koji ne može započeti još jedan meč. Stoga, stringovi koji su podrazumevani delimičnog podudaranja mogu se podudarati kasnije, ukoliko originalni nizovi koji pokušavaju da se poklapaju konačno ne uspevaju.

Podrazumevano je usklađivanje stringa tačno bez divljih kartica . (Nasuprot tome, komanda očekivanja koristi podrazumevane šablone u globskom stilu). -ex flag se može koristiti za zaštitu obrasca koji bi inače mogli da odgovaraju podrazumevajućim zastupnicima. Bilo koji obrazac koji počinje sa "-" treba zaštititi na ovaj način. (Svi stringovi koji počinju sa "-" rezervisani su za buduće opcije.)

Zastava -re primorava string koji se tumači kao šablon stilskog regexp-a. U ovom slučaju, podudaranje podrazumeva se čuva u varijabli interact_out slično onom kako ocekuje da sacuva svoj izlaz u varijablu expect_out . Podjednako je podržana i oznaka -indicesa .

Obrazac eof uvodi akciju koja se izvršava na kraju datoteke. Odvojeni šablon eofa takođe može da prati oznaku -output, u kom slučaju se odgovara ako se otkrije eof pri pisanju izlaza. Podrazumevana eof akcija je "povratak", tako da se interakcija jednostavno vraća na bilo koji EOF.

Vremenski raspored obrazovanja predstavlja vremensko ograničenje (u sekundama) i akcija koja se izvršava nakon što se ne čita bilo koji znak za određeno vrijeme. Šema vremena se primjenjuje na najnoviji proces . Ne postoji podrazumevani vremenski razmak. Posebna varijabla "timeout" (koju koristi komanda očekivanja ) nema utjecaja na taj vremenski raspon.

Na primer, sledeća izjava bi se mogla koristiti za automatizaciju korisnika koji nisu otkucali ni jedan sat, ali koji i dalje dobijaju česte sistemske poruke:

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

Ako je obrazac ključna riječ null , a nulls su dozvoljeni (preko remove_nulls naredbe), odgovarajuće tijelo se izvršava ako se podudara s jednim ASCII-om 0. Nije moguće podesiti 0 bajtova pomoću glob ili regexp šablona.

Predavanje šablona sa oznakom -writa dovodi do toga da se promenljiva interact_out (spawn_id) podesi na spawn_id koji odgovara obrazcu (ili eof).

Akcije kao što su prekidanje i nastavak uzrokuju strukture kontrole (tj. Za , proc ) da se ponašaju na uobičajeni način. Međutim, povratak uzrokuje interakciju kako bi se vratio na svog pozivaoca, dok inter_return uzrokuje interakciju kako bi se povukao u njegovog pozivaoca. Na primer, ako se "proc foo" naziva interakcija, a zatim izvrši akciju inter_return , proc foo bi se vratio. (To znači da ako interaktivni poziv tumači interaktivno kucanje vrati će dovesti do interakcije za nastavak, dok inter_return će dovesti do interakcije da se vrati na svog pozivaoca.)

Tokom interakcije , raw režim se koristi tako da se svi znakovi mogu preneti na trenutni proces . Ako trenutni proces ne prihvata signale kontrole posla, on će zaustaviti ako je poslat signal za zaustavljanje (podrazumevano ^ Z). Da ga ponovo pokrenete, pošaljite signal za nastavak (na primer "kill -CONT"). Ako stvarno želite da pošaljete SIGSTOP na takav proces (pomoću ^ Z), prvo razmislite o cstranju csh-a, a zatim pokrenite svoj program. S druge strane, ako želite da pošaljete SIGSTOP u Expect , primite prvog poziva tumača (možda koristeći znak za izbjegavanje), a zatim pritisnite ^ Z.

Parovi serijskog stola mogu se koristiti kao skraćenica za izbjegavanje unošenja interpretera i izvršavanja komandi interaktivno. Prethodni terminski režim se koristi dok se izvršava tijelo para-string tela.

Za brzinu, akcije se podrazumevano izvršavaju u raw režimu. Zastita -reset resetuje terminal na način koji je imao pre nego što se izvrši interakcija (uvek, kuvan način rada). Imajte na umu da se znakovi koji se unose kada se mod uključuje mogu izgubiti (nesretna funkcija upravljačkog programa na nekim sistemima). Jedini razlog da se koristi -reset je ako vaša akcija zavisi od pokretanja u režimu kuvanja.

Zastava -echo šalje znakove koji odgovaraju sljedećem obrazcu nazad procesu koji ih je generisao pošto je svaki znak pročitan. Ovo može biti korisno kada korisnik treba da vidi povratne informacije od delimično otkucanih šablona.

Ako se obrazac ponavlja, ali se na kraju ne uspije poklapati, likovi se šalju na pokvareni proces . Ako ih potom postavi, korisnik će dva puta videti likove. -echo je verovatno jedino prikladan u situacijama kada korisnik verovatno neće dovršiti obrazac. Na primjer, sljedeći odlomak je iz rftp-a, recursive-ftp skripta, gdje se korisniku traži da uđe ~ g, ~ p, ili ~ l, da prikaže, stavlja ili popisuje trenutni direktorij rekurzivno. Oni su toliko daleko od normalne ftp naredbe, da korisnik verovatno neće upisati ~ a zatim išta drugo, osim pogrešno, u kom slučaju će verovatno ignorisati rezultat u svakom slučaju.

međusobno aktivirajte {-čko ~ g {getcurdirectory 1} -čko ~ l {getcurdirectory 0} -čko ~ p {putcurdirectory}}

Zastava -bufer šalje znakove koji odgovaraju sledećem šablonu na izlaznom procesu pošto se čitaju znaci.

Ovo je korisno kada želite da program pusti uzorak. Na primjer, sljedeće se mogu koristiti za praćenje gdje osoba pozove (modem Hayesovog stila). Svaki put kada se vidi "atd" skripta logira ostatak linije.

proc lognumber {} {interact -nobuffer -re "(. *) \" return puts $ log "[format sata [clock seconds]]: biran $ interact_out (1, string)"} interaktivni -buffer "atd" lognumber

Tokom interakcije , prethodna upotreba log_user-a se zanemaruje. Konkretno, interakcija će primorati svoj izlaz da bude prijavljen (upućen na standardni izlaz), jer se pretpostavlja da korisnik ne želi slepo da interakciju.

Zastava -o uzrokuje bilo koje slijedeće parove ključeva za primjenu na izlazu tekućeg procesa . Ovo može biti korisno, na primjer, kada se bavite hostovima koji šalju neželjene znakove tokom telnet sesije.

Uobičajeno, interakcija očekuje da korisnik piše stdin i čita stdout samog procesa Expect . Zastava -u (za "korisnik") čini interaktivni potražiti korisnika kao proces imenovan po njegovom argumentu (koji mora biti id sprječavanja).

Ovo omogućava povezivanje dva nepovezana procesa bez upotrebe eksplicitne petlje. Da biste pomogli u otklanjanju grešaka, Očekujte dijagnostiku uvek idite na stderr (ili stdout za određene informacije o evidentiranju i debagiranju). Iz istog razloga, interpreter komanda će pročitati interaktivno sa stdin-a.

Na primer, sledeći fragment kreira proces prijavljivanja. Onda bira korisnika (nije prikazan), i konačno ih povezuje zajedno. Naravno, svaki proces može biti zamenjen za prijavljivanje. Na primer, ljuska bi omogućila korisniku da radi bez napajanja računa i lozinke.

spawn login login login $ spawn_id spawn tip modem # dial back to user # povezivanje korisnika za prijavljivanje interaktivni -u $ login

Da biste poslali izlaz na više procesa, navedite listu svake spawn liste prefaced by -output flag. Ulaz za grupu izlaznih identifikacionih ID-a može se odrediti pomoću liste id spawn prefaced by -input flag. (Oba -input i -output mogu uzimati liste u istom obliku sa oznakom -i u komandi očekivanja , osim što bilo koji_spawn_id nije bitan u interakciji .) Svi sljedeći zastave i stringovi (ili obrasci) primjenjuju se na ovaj ulaz do drugog - Pojavljuje se znak za unos. Ako se ne pojavi -input , -output podrazumeva "-input $ user_spawn_id -output". (Slično tome, sa obrascima koji nemaju -input .) Ako je naveden jedan -input , prepisuje $ user_spawn_id. Ako je naveden drugi- ulaz , prepisuje $ spawn_id. Može se navesti dodatne -inputne zastavice.

Oba implicitna ulazna procesa su podrazumevana da imaju svoje izlaze navedene kao $ spawn_id i $ user_spawn_id (u suprotnom smeru). Ako se pojavi oznaka -input bez oznake -output , znakovi iz tog procesa se odbacuju.

Zastava -i uvodi zamenu za trenutni spawn_id kada se ne koriste druge -inputne ili -outputske zastavice. Zastava A-i podrazumeva -o zastavu.

Moguće je promijeniti procese sa kojima se interaktivno koristi pomoću indirektnih ID-ova. (Indirektni ID-i za spawn su opisani u odeljku o komandi očekivanja.) Indirektni ID-i za spawn mogu biti specificirani sa -i, -u, -inputom ili -output zastavama.

tumač [args]
uzrokuje da korisnik interaktivno traži za Expect i Tcl naredbe. Odštampan je rezultat svake naredbe.

Akcije kao što su prekidanje i nastavak uzrokuju strukture kontrole (tj. Za , proc ) da se ponašaju na uobičajeni način. Međutim, povratak dovodi do toga da se tumač vrati svom pozivaču , dok inter_return prouzrokuje da prevodioca uzrokuje povraćaj pozivaoca. Na primjer, ako je "proc foo" nazvao tumač koji je tada izvršio akciju inter_return , proc foo bi se vratio. Svaka druga komanda dovodi do toga da tumač nastavi da traži nove komande.

Podrazumevano, poziv sadrži dva cela broja. Prvi cijeli broj opisuje dubinu evidencije stakla (tj. Koliko puta je pozvana Tcl_Eval). Drugi broj je Tcl istorija identiteta. Poziv se može postaviti definisanjem procedure pod nazivom "prompt1" čija povratna vrijednost postaje sljedeći poziv. Ako se u izjavi nalaze otvoreni citati, parene, kočnice ili zagrade, sekundarni poziv (podrazumevano "+>") se izdaje po novoj liniji. Sekundarni upit se može postaviti definisanjem procedure pod nazivom "prompt2".

Tokom prevodioca koristi se kuvani režim, čak i ako je njegov pozivnik koristio sirovi režim.

Ako je stdin zatvoren, prevodioc će se vratiti ukoliko se ne koristi -eof , u kom slučaju se poziva pozadinski argument.

log_file [args] [[-a] datoteka]
Ako je ime datoteke data, log_file će snimiti transkript sesije (počevši od te tačke) u datoteci. log_file će prestati snimanja ako nije dat argument. Bilo koja prethodna datoteka dnevnika je zatvorena.

Umjesto imena fajla, identifikator Tcl datoteke može se dobiti pomoću oznaka -open ili -leaveopen . Ovo je slično kao i komanda spawn . (Za više informacija pogledajte pojam .)

-a zastavi silu izlaze za logovanje koje je potisnuto od strane naredbe log_user .

Podrazumevano, naredba log_file se dodava starim datotekama umesto da ih skraćuje, kako bi se lakše isključila odjavljivanje i više puta u jednoj sesiji. Da biste urezali datoteke, koristite oznaku -noappend .

Zastava -info uzrokuje log_file da vrati opis najnovijih argumenata koji nisu navedeni.

log_user -info | 0 | 1
Podrazumevano, dijalog za slanje / očekivanje je prijavljen na stdout (i logfile ako je otvoren). Logiranje na stdout je onemogućeno komandom "log_user 0" i ponovo je omogućeno od strane "log_user 1". Logiranje u log fajl je nepromenjeno.

Zastava -info uzrokuje log_user da vrati opis najnovijih argumenata koji nisu navedeni.

match_max [-d] [-i spawn_id] [veličina]
definiše veličinu bafera (u bajtovima) koji se interno koristi od očekivanja . Bez argumenta veličine , trenutna veličina se vraća.

Sa oznakom -d , podešena je podrazumevana veličina. (Inicijalno podrazumevano je 2000.) Sa oznakom -i , veličina je postavljena za imenovani ID spawn-a, inače je postavljen za trenutni proces .

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
izvršava " argumente programa " umesto tekućeg Expect programa, koji se završava. Goli argument vezan za crtanje napušta crticu ispred imena komande kao da je to shell shell. Svi spawn_idovi su zatvoreni, osim onih koji se nazivaju argumentima. Ovi su mapirani na identifikatore imenovanih datoteka.

Spawn_ids se mapiraju u identifikatore datoteka za novi program koji će naslediti. Na primjer, sljedeća linija pokreće šah i omogućava ga da se kontroliše trenutnim procesom - recimo, šahovskim majstorom.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id chess

Ovo je efikasnije od "interakcije -u", međutim, žrtvuje mogućnost da se programira interakcija jer proces Expect više ne kontroliše.

Imajte na umu da nema kontrolnog terminala. Stoga, ako isključite ili remapirate standardni ulaz, programi koji vrše kontrolu zadataka (shells, login, itd.) Neće funkcionisati ispravno.

paritet [-d] [-i spawn_id] [vrijednost]
definiše da li paritet treba zadržati ili oduzeti iz proizvodnje porijeklih procesa. Ako je vrednost nula, paritet se oduzima, u suprotnom se ne uklanja. Bez argumenta vrijednosti , trenutna vrijednost se vraća.

Sa oznakom -d , postavljena je podrazumevana vrednost pariteta. (Inicijalno podrazumevano je 1, tj. Paritet se ne uklanja.) Sa zastavom -i , vrednost pariteta je postavljena za imenovani spawn id, inače je postavljen za trenutni proces .

remove_nulls [-d] [-i spawn_id] [vrijednost]
definiše da li se nulti elementi zadržavaju ili uklanjaju iz izlaza nastalih procesa pre nego što se uzorci podudaraju ili čuvaju u varijabli expect_out ili interact_out . Ako je vrednost 1, nulls se uklanjaju. Ako je vrednost 0, nulls se ne uklanjaju. Bez argumenta vrijednosti , trenutna vrijednost se vraća.

Sa oznakom -d , podrazumevana je vrednost. (Inicijalno podrazumevano je 1, tj. Nulls se uklanjaju.) Sa oznakom -i , vrednost je postavljena za imenovani ID spawn-a, inače je postavljen za trenutni proces .

Da li će se ukloniti null ili ne, očekivati će zapisati null bajtove u dnevnik i stdout.

slati [-flags] string
Šalje niz na trenutni proces . Na primjer, komanda

pošaljite "hello world \ r"

šalje znakove, helloworld u trenutni proces . (Tcl uključuje komandu printf- like (naziva se format ) koja može proizvesti proizvoljno složene stringove.)

Znakovi se šalju odmah, iako programi sa linkovnim pufernim unosom neće pročitati znakove dok se ne pošalje povratni znak. Povratni znak označen je "\ r".

Zastava daje sledeći argument da se tumači kao string a ne zastava. Svakom nizu može prethoditi "-" bez obzira da li ili ne izgleda kao zastava. Ovo obezbeđuje pouzdan mehanizam za navođenje varijabilnih nizova bez onesposobljavanja onih koji slučajno izgledaju kao zastave. (Svi stringovi koji počinju sa "-" rezervisani su za buduće opcije.)

Zastava -i izjavljuje da se string šalje u imenovani spawn_id. Ako je spawn_id user_spawn_id , a terminal je u raw režimu, novi redovi u nizu se prevedu u sekvence povratne-nove linije tako da se pojavljuju kao da je terminal u režimu kuvanja. Zastava -raw isključuje ovaj prevod.

-nula zastava šalje null znakove (0 bajtova). Podrazumevano se šalje jedan nult. Celi broj može da sledi -null da bi se naznačilo koliko je nula za slanje.

Flag-break generiše stanje pauze. Ovo ima smisla samo ako se id spawn odnosi na tty uređaj koji se otvara preko "spawn -open". Ako ste pokrenuli postupak kao što je vrh, trebalo bi da koristite konvenciju za stvaranje pauze.

Zastava -s podstiče izlaz da se pošalje "polako", čime se izbjegava česta situacija u kojoj računar odriše ulazni bafer koji je dizajniran za čoveka koji nikada neće istisnuti isti bafer . Ovaj izlaz je kontrolisan vrijednošću promenljive "send_slow" koji uzima dvije elemente. Prvi element je ceo broj koji opisuje broj bajtova koji se šalju atomski. Drugi element je pravi broj koji opisuje broj sekundi od kojih se atomska pošiljaka moraju razdvojiti. Na primjer, "set send_slow {10 .001}" bi primorala "slanje -s" za slanje stringova sa 1 milisekundom između svakih 10 znakova poslatih.

Zastavica -h podstiče izlazak (donekle) kao ljudsko kucanje. Pojavljuju se ljudska odlaganja između znakova. (Algoritam se zasniva na Weibullovoj distribuciji, sa modifikacijama koje odgovaraju ovoj konkretnoj aplikaciji.) Ovaj izlaz je kontrolisan vrijednošću promenljive "send_human" koji uzima pet listova elemenata. Prva dva elementa su prosečna vremenska intervala karaktera u sekundama. Prvi se podrazumevano koristi. Drugi se koristi na završetku riječi, kako bi simulirali suptilne pauze koji se povremeno pojavljuju pri takvim prelazima. Treći parametar je merilo varijabilnosti gde je .1 prilično promenljiva, 1 je razumljivo promenljiva, a 10 je prilično neizbrisivo. Ekstremi su 0 do beskonačnosti. Poslednja dva parametra su minimalno i maksimalno vreme interakcija. Najmanji i maksimalni se koriste poslednji i "isječak" konačno vreme. Konačni prosjek može biti sasvim drugačiji od datog prosjeka ako su minimalni i maksimalni klipovi dovoljne vrijednosti.

Kao primer, naredna komanda emulira brza i dosledna daktilografija:

set send_human {.1 .3 1 .05 2} pošalji -h "Gladan sam, ajde da ručamo."

dok bi sledeće moglo biti pogodnije nakon mamurluka:

set send_human {.4 .4 .2 .5 100} pošalji -h "Goodd party lash night!"

Imajte na umu da greške nisu simulirane, mada možete sami postaviti situacije ispravljanja grešaka ugrađivanjem grešaka i ispravki u argumentu za slanje.

Zastave za slanje nultih znakova, za slanje pauza, za silovanje sporih izlaza i za izlaz u ljudskom stilu međusobno se isključuju. Koristi se samo onaj koji je naveden. Štaviše, nijedan argument string nije moguće odrediti sa zastavama za slanje nula znakova ili pauza.

Dobra je ideja da prethodi prvom pošalju procesu ocekujem . Očekuje se da će početi proces , a slanje ne može. Konkretno, ako se prvi slanje završi pre nego što proces počne da se pokreće, rizikujete da vaši podaci budu ignorisani. U situacijama kada interaktivni programi nude početni poziv, možete preći poslati sa odlaganjem kao u:

# Kako bi izbjegli davanje hakera savjetima o tome kako provaliti, # ovaj sistem ne traži vanjsku lozinku. # Sačekajte 5 sekundi za izvršavanje da biste dovršili spanski telnet very.secure.gov spavanje 5 pošaljite lozinku \ r

exp_send je pseudonim za slanje. Ako koristite Expectk ili neku drugu varijantu Expect u okruženju Tk, slanje je definisano od strane Tk za sasvim drugu svrhu. exp_send je obezbeđen za kompatibilnost između okruženja. Slični alijasi su obezbeđeni za druge komande za slanje Expect-a.

send_error [-flags] string
je kao poslati , osim što se izlaz pošalje stderr umjesto trenutnom procesu .

send_log [-] string
je kao poslati , osim što je string samo poslat u datoteku dnevnika (pogledajte log_file .) Argumenti su ignorisani ako nijedna datoteka dnevnika nije otvorena.

send_tty [-flags] string
je kao slanje , osim što se izlaz poslati na / dev / tty umjesto trenutnog procesa .

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

spavaj sekunde
uzrokuje da skripta spoji u zadatom broju sekundi. Sekundi mogu biti decimalni broj. Prekidi (i Tk događaji ako koristite Expectk) obrađuju se dok očekujete spavanje.

spawn [args] program [args]
kreira novi proces koji pokreće "program args". Stdin, stdout i stderr su povezani na Expect, tako da ih mogu čitati i pisati druge Expect komande. Veza je prekinuta blizu ili ako sam proces zatvara bilo koji od identifikatora datoteke.

Kada se proces pokreće podstranom , promenljiva spawn_id je postavljena na deskriptor koji se odnosi na taj proces . Proces opisan od strane spawn_id smatra se "trenutnim procesom ". spawn_id se može čitati ili pisati, što ustvari omogućava kontrolu posla.

user_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na korisnika. Na primjer, kada je spawn_id postavljen na ovu vrijednost, očekujte se ponašati kao expect_user .

.I error_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na standardnu ​​grešku. Na primjer, kada je spawn_id postavljen na ovu vrijednost, šalje se ponašanje kao send_error .

tty_spawn_id je globalna varijabla koja sadrži deskriptor koji se odnosi na / dev / tty. Ako / dev / tty ne postoji (kao u skripti cron, at ili script), tty_spawn_id nije definisan. Ovo se može testirati kao:

ako {[info vars tty_spawn_id]} {# / dev / tty exists} else {# / dev / tty ne postoji # verovatno u cron, seriji ili po skriptu}

spawn vraća identifikacijski ID UNIX- a . Ako nijedan proces nije pokrenut, 0 se vraća. Promenljiva spawn_out (slave, ime) je postavljena na ime pty slave uređaja.

Podrazumevano, podstranica odražava ime i argumente komande. Zastava -oecho zaustavlja od toga.

Zastava -console dovodi do toga da se konačni izlaz preusmerava na pokrenuti proces . Ovo nije podržano na svim sistemima.

Interno, spawn koristi pty, inicijalizovan na isti način kao i korisnički tty. Ovo je inicijalizovano tako da su sve postavke "normalne" (prema stty (1)). Ako je varijabla stty_init definisana, ona se tumači u stjuću stty argumenata kao dalja konfiguracija. Na primjer, "set stty_init raw" će dovesti do toga da terminali spawed procesa započnu u raw modu. -notička kopija preskoči inicijalizaciju na osnovu korisničkog tty-a. -ne ne preskače "inicijalnu" inicijalizaciju.

Normalno, mamac traje malo vremena za izvršenje. Ako primetite da je mamac uzimajući znatan vremenski period, verovatno se susreću sa ptys koji su zaglavljeni. Brojni testovi se pokreću na ptys-ima kako bi izbjegli zaplete sa pogrešnim procesima. (Ovo traje 10 sekundi za zaglavljene pty.) Running Expect sa opcijom -d će pokazati da li Expect susreće mnoge ptys u neparnim stanjima. Ako ne možete da ubijete procese na koje su ove pty-ovi povezani, vaš jedini povratak može biti restartovanje.

Ako se program ne može uspješno uspjeti jer exec (2) ne uspije (npr. Kada program ne postoji), naredna interakcija ili očekivana naredba vraćaće poruku greške kao da se program pokrenuo i proizveo je poruku o grešci kao izlaz. Ovo ponašanje je prirodna posledica primene mrtvih . Interno, sekaju se viljuške, nakon čega pokrenuti proces nema načina da komunicira sa prvobitnim Expect procesom, osim putem komunikacije putem spawn_id-a.

Zastava -open uzrokuje sledeći argument da se tumači kao identifikator Tcl fajla (tj. Vratiti se otvorenim .) Id spawn-a se onda može koristiti kao da je postao proces koji se pojavio. (Identifikator datoteke više ne treba koristiti.) Ovo vam omogućava da tretirate sirove uređaje, datoteke i cevovode kao pokrenuti proces bez upotrebe pty-a. 0 se vraća da ukazuje da nema povezanog procesa . Kada je veza sa pokrenutim procesom zatvorena, takođe je identifikator Tcl datoteke. Zastava -leaveopen je slična kao -open osim što -leaveopen uzrokuje da se identifikator datoteke ostavi otvoren čak i kada je id zatvoren.

Prazna oznaka dovodi do otvaranja pty-a, ali nijedan proces se nije pojavio. 0 se vraća da ukazuje da nema povezanog procesa . Spawn_id je postavljen kao i obično.

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

Zastava -igre naziva signal koji se ignoriše u procesu koji se pojavio. U suprotnom, signali dobijaju podrazumevano ponašanje. Signali su imenovani kao u komandi zamke , osim što svaki signal zahteva posebnu zastavu.

nivo straće
uzrokuje sledeće izjave da se odštampaju pre izvršenja. (Tcl trajanje komandi tragova tragova.) Nivo pokazuje koliko je dole u stacku poziva da se traga. Na primjer, sljedeća komanda pokreće Expect dok tra¾i prvih 4 nivoa poziva, ali ništa ispod nje.

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

Zastava -info uzrokuje straće da vrati opis najnovijih argumenata koji nisu navedeni u informaciji.

stty args
menja terminalne režime slično eksternoj komandi stty.

Podrazumevano se pristupa kontrolnom terminalu. Ostali terminali se mogu pristupiti dodavanjem "Zahtevi za status vrati ga kao rezultat komande. Ako se ne traži status i pristup kontrolnom terminalu, prethodni status sirovih i echo atributa se vraća u obliku koji može kasnije biti koje koristi komanda.

Na primjer, argumenti sirovi ili sučeni stavljaju terminal u raw mod. Argumenti -razvučeni ili kuvani stavljaju terminal u kuvani način. Argumenti echo i -echo stavljaju terminal u echo i noecho mod, respektivno.

Sledeći primer ilustruje kako privremeno onemogućiti odjekivanje. Ovo se može koristiti u inače-automatskim skriptama kako bi se izbjeglo ugrađivanje lozinki u njih. (Pogledajte više diskusija o tome ispod EXPECT HINTS ispod)

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

sistem args
daje argumente sh (1) kao ulaz, baš kao da je ukucano kao komanda sa terminala. Očekuje da čeka završetak školjke. Povratni status iz sh se obrađuje na isti način kao što je exec rukovao svoj povratni status.

Za razliku od exec-a koji preusmerava stdin i stdout u skriptu, sistem ne izvršava redirekciju (osim onog kojeg označava samim nizom). Stoga je moguće koristiti programe koji moraju direktno razgovarati s / dev / tty. Iz istog razloga, rezultati sistema nisu evidentirani u dnevniku.

vremenski znak [args]
vraća vremenski žig. Bez argumenata, broj sekundi od vremena vraćanja epohe.

Flag -format unosi niz koji se vraća, ali sa zamjenama napravljenim prema POSIX pravilima za strftime. Na primjer,% a zamjenjuje se skraćenim nazivom dana u danu (npr. Sat). Ostali su:

% skraćeno ime dana u nedelji% A puno ime dane u nedjelju% b skraćeni naziv mjeseca% B naziv cjelog mjeseca% c datum datuma kao u: sri lis 6 11:45:56 1993% d dan u mjesecu (01-31% H sat (00-23)% I sat (01-12)% j dan (001-366)% m mesec (01-12)% M minuta (00-59)% p am ili pm% S sekunda (00-61) % u dan (1-7, ponedeljak je prvi dan u nedelji)% U nedeljno (00-53, prva nedelja je prvi dan sedmice jedan)% V nedeljno (01-53, ISO 8601 stil)% w dan (0- 6)% W nedeljno (00-53, prvi ponedeljak je prvi dan sedmice jedan)% x datum-vrijeme kao u: sr okt 6 1993% X vrijeme kao u: 23:59:59% godina (00-99) % Y godina kao u: 1993% Z vremensku zonu (ili ništa ako se ne može odrediti) %% znak od 1%

Druge% specifikacije su nedefinisane. Drugi znakovi će biti propušteni kroz netaknute. Podržano je samo C locale.

Zastava -seconds uvodi nekoliko sekundi od epohe koja će se koristiti kao izvor za formatiranje. U suprotnom, koristi se trenutno vreme.

Zastava -gmt sili vremenski žig za upotrebu vremenskog zona u GMT . Bez zastave, koristi se lokalni vremenski zon.

trap [[command] signale]
uzrokuje da se zadana komanda izvrši nakon budućeg prijema bilo kog od datih signala. Komanda se izvršava u globalnom opsegu. Ako je komanda odsutna, akcija signala se vraća. Ako je naredba string SIG_IGN, signali se ignorišu. Ako je komanda string SIG_DFL, signali su rezultat podrazumijevanja sistema. signali su ili jedan signal ili spisak signala. Signali mogu biti numerički ili simbolično navedeni prema signalu (3). Prefiks "SIG" se može izostaviti.

Bez argumenata (ili argumenta - broj), trap vraća broj signala komande za trap koji se trenutno izvršava.

Zastava -code koristi povratni kod komande umesto bilo kog koda koji se Tcl tada vratio kada je komanda prvobitno počela da radi.

Zastita -interp dovodi do procene komande pomoću prevodioca aktivnog u trenutku kada je komanda počela da radi, a ne kada je zamka proglašena.

Zastava -name uzrokuje naredbu zamke da vrati naziv signala komande za trap koji se trenutno izvršava.

Ova oznaka -max uzrokuje komandu zamke da vrati najveći broj signala koji se može podesiti.

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

Podrazumevano, SIGINT (koji se obično može generisati pritiskom na ^ C) i SIGTERM uzrokuje očekivanje da izađete. Ovo je posledica sledeće zamke, koja se kreira podrazumevano kada počinje Expect.

izlaz iz zamke {SIGINT SIGTERM}

Ako koristite oznaku -D da započnete debugger, SIGINT je redefinisan da pokreće interaktivni debuger. To je zbog sledeće zamke:

zamka {exp_debug 1} SIGINT

Zamka za otkrivanje grešaka može se promeniti postavljanjem varijable okoline EXPECT_DEBUG_INIT u novu komandu za zamke.

Možete, naravno, preklapati oboje samo dodavanjem komandi zamke u vašu skriptu. Konkretno, ako imate svoj "izlaz iz zamke SIGINT", ovo će prevazići zamka za greške. Ovo je korisno ako želite sprečiti korisnike da dođu do greške.

Ako želite da definišete sopstveni zamka na SIGINT-u, ali i dalje zamućite debugeru kada radi, koristite:

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

Kao alternativu, možete se zameniti pomoću nekog drugog signala.

zamka ne dozvoljava da prevaziđete akciju za SIGALRM jer se ovo interno koristi za očekivanje. Komanda za isključivanje postavlja SIGALRM na SIG_IGN (ignoriše). Ovo možete ponovo učitati sve dok ga onemogućite tokom narednih naredbi za spawn.

Pogledajte signal (3) za više informacija.

čekati [args]
zakašnjenja do nastanka procesa (ili trenutnog procesa ako nijedan nije imenovan) prekida.

čekaj normalno vraća listu od cetiri cela broja. Prvi broj je pid procesa koji je bio čekan. Drugi broj je odgovarajući id. Treći integer je -1 ako se desila greška operativnog sistema ili 0 inače. Ako je treći integer bio 0, četvrti broj je status koji se vratio procesom koji je postao. Ako je treći cijeli broj bio -1, četvrti broj je vrijednost errno koju je postavio operativni sistem. Takođe je postavljena globalna varijabla errorCode.

Dodatni elementi mogu se pojaviti na kraju povratne vrijednosti od čekanja . Opcioni peti element identifikuje klasu informacija. Trenutno je jedina moguća vrijednost za ovaj element CHILDKILLED u kojem slučaju sljedeće dvije vrijednosti su ime C-style signala i kratki tekstualni opis.

Zastava -i deklariše proces da sačeka odgovarajući imenovanom spawn_id (NE ID id). Unutar SIGCHLD rukovaoca, moguće je sačekati bilo koji postrojen proces koristeći spawn id -1.

Neprekidna zastava uzrokuje čekanje da se odmah vrati uz pokazivanje uspešnog čekanja. Kada proces izađe (kasnije), automatski će nestati bez potrebe za eksplicitnim čekanjem.

Komanda čekanja se takođe može koristiti i sačekajte da se koristi proces argumenta korišćenjem argumenata "-i -1". Za razliku od njegove upotrebe sa kreiranim procesima, ova komanda se može izvršiti u bilo kom trenutku. Nema kontrole nad kojim procesom se zapošljava. Međutim, povratna vrijednost se može provjeriti za ID procesa .

LIBRARIJE

Očekuje automatski da zna o dve ugrađene biblioteke za Expect skripte. Ove su definisane imenicima nazvanim u varijablama exp_library i exp_exec_library. Oba treba da sadrže korisničke datoteke koje mogu koristiti druge skripte.

exp_library sadrži datoteke nezavisne od arhitekture. exp_exec_library sadrži datoteke zavisne od arhitekture. Zavisno od vašeg sistema, oba direktorija mogu biti potpuno prazna. Postojanje datoteke $ exp_exec_library / cat-buffers opisuje da li vaš / bin / cat podrazumeva podrazumevano.

PRETTY-PRINTING

Definicija vgrind dostupna je za lepo štampanje Expect skripti. Pod pretpostavkom da je definicija greške koja je isporučena sa distribucijom Expect ispravno instalirana, možete ga koristiti kao:

vgrind -slepe datoteka

PRIMERI

Mnogi ne bi bili očigledni kako sve staviti zajedno na opis čoveka . Podstičem vas da pročitate i isprobate primere iz primera direktorijuma distribucije Expect . Neki od njih su stvarni programi. Drugi jednostavno ilustruju određene tehnike, i naravno, par su samo brzi hackovi. INSTALL datoteka ima brzi pregled ovih programa.

Takođe su korisni i Expectovi radovi (vidi SEE TAKO). Dok neki radovi koriste sintaksu koja odgovara ranijim verzijama Expect-a, prateća obrazloženja i dalje važe i prelaze u mnogo više detalja od ove stranice čoveka.

KUĆE

Dodaci se mogu suditi sa imenima Expect-a. Na primer, pošiljanje je definisano od strane Tk za sasvim drugu svrhu. Iz tog razloga, većina komandi Expect je dostupna i kao "exp_XXXX". Komande i varijable koje počinju sa "exp", "inter", "spawn" i "timeout" nemaju pseudonimije. Koristite proširena imena naredbe ako vam je potrebna ova kompatibilnost između okruženja.

Očekuje se prilično liberalan pogled na obim. Konkretno, varijable koje čitaju komande specifične za program Expect će se prvo tražiti iz lokalnog područja, a ako ih ne pronađe, u globalnom opsegu. Na primer, to sprečava potrebu za postavljanjem "globalnog vremenskog ograničenja" u svakoj proceduri koju pišete koristeći očekivanja . Sa druge strane, pisane varijable su uvijek u lokalnom opsegu (osim ako nije izdata "globalna" naredba). Najčešći problem koji ovo uzrokuje je kada se spawn izvršava u proceduri. Izvan procedure, spawn_id više ne postoji, tako da pokrenuti proces više nije dostupan jednostavno zbog obima. Dodajte "globalni spawn_id" u takav postupak.

Ako ne možete omogućiti mogućnost multispawning (tj. Vaš sistem ne podržava ni odabir (BSD *. *), Anketa (SVR> 2), niti nešto ekvivalentno), Expect će moći kontrolirati samo jedan proces istovremeno. U tom slučaju ne pokušavajte da postavite spawn_id , niti da izvršavate procese preko exec-a dok se pokreće proces . Štaviše, nećete moći očekivati od više procesa (uključujući i korisnika kao jednog) u isto vrijeme.

Terminal parametri mogu imati veliki efekat na skripte. Na primer, ako je scenario napisan da potraži odjekivanje, on će se loše ponašati ako je odjek isključen. Iz tog razloga, podrazumevano podrazumevajte parametre termičkog terminala. Nažalost, ovo može učiniti stvari neprijatnim za druge programe. Kao primer, shell emacs želi da promeni "uobičajene" mape: nove linije se mapiraju na nove linije umesto na nove linije vraćanja vozača, a odjekivanje je onemogućeno. Ovim se omogućava emacima da urede ulaznu liniju. Nažalost, Očekivanje ne može pogađati ovo.

Možete tražiti da Očekuje da ne preklapa svoje podrazumevano podešavanje parametara terminala, ali morate biti pažljivi prilikom pisanja skripti za takva okruženja. U slučaju emaka, izbegavajte zavisno od stvari kao što su odjekivanje i krajnje linije mapiranja.

Komande koje su prihvatile argumente uvrštene u jedinstvenu listu ( očekivane varijante i interakcije ) koriste heurističku odluku da li je lista zapravo jedan argument ili mnogi. Heuristika može propasti samo u slučaju kada lista zapravo predstavlja samo jedan argument koji ima više umnoženih \ n s osobinama koje nisu bjelančevine između njih. Ovo se čini dovoljno neverovatnim, međutim se argument "-nobrace" može koristiti da bi se pojedinačni argument obradio kao jedan argument. Ovo bi se moglo koristiti sa mašinskim Expect kodom. Slično tome, -brejk sili jedinstveni argument koji treba rukovati kao više obrazaca / akcija.

BUGS

Bilo je zaista zapanjujuće nazvati program "seks" (za "Smart EXec" ili "Send-Expect"), ali prevladao je dobar smisao (ili možda samo puritanizam).

Na nekim sistemima, kada se granata ispusti, žali se da ne može pristupiti tty-u, ali u svakom slučaju radi. To znači da vaš sistem ima mehanizam za dobijanje kontrolne tačke za koje Expect ne zna. Saznajte šta je to, i pošaljite mi ove informacije.

Ultrix 4.1 (bar najnovije verzije ovde) razmatra vremenska ograničenja iznad 1000000 da budu ekvivalentna 0.

Digitalni UNIX 4.0A (i verovatno druge verzije) odbija da dodeli ptys ako definišete SIGCHLD upravljač. Pogledajte stranicu Grant za više informacija.

IRIX 6.0 ne upravlja pravilno ispravama za Pty, tako da ako Expect pokuša da dodeli pty koji je ranije koristio neko drugi, to ne uspije. Nadogradite na IRIX 6.1.

Telnet (verifikovan samo pod SunOS 4.1.2) visi ako TERM nije podešen. Ovo je problem pod cron-om, na i u cgi skriptama, koji ne definišu TERM. Dakle, morate ga eksplicitno postaviti - do kog tipa je obično irelevantno. To mora biti postavljeno na nešto! Sledeće verovatno je dovoljno za većinu slučajeva.

set env (TERM) vt100

Savjet (verifikovan samo pod BSDI BSD / OS 3.1 i386) visi ako SHELL i HOME nisu postavljeni. Ovo je problem pod cron-om , na i u cgi skriptama, koji ne definišu ove promenljive okruženja. Dakle, morate ih eksplicitno postaviti - do kog tipa je obično irelevantno. To mora biti postavljeno na nešto! Sledeće verovatno je dovoljno za većinu slučajeva.

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

Neke implementacije pty-ova su dizajnirane tako da kernel baca sve nepročitane izlaze nakon 10 do 15 sekundi (stvarni broj zavisi od implementacije) nakon što je proces zatvorio deskriptor datoteke. Tako očekujte programe kao što su

spawn datum spavanja 20 očekuje

propasti. Da bi se to izbeglo, pozovite neinteraktivne programe sa izvorom, a ne spawn . Iako su takve situacije moguće, u praksi nikada nisam sreo situaciju u kojoj bi se poslednji rezultat istinskog interaktivnog programa izgubio zbog ovakvog ponašanja.

Sa druge strane, Cray UNICOS ptys odbacuje sve nepročitane izlaze odmah nakon što je proces zatvorio deskriptor datoteke. Ovo sam prijavio Crayu i oni rade na popravci.

Ponekad je potrebno kašnjenje između poziva i odgovora, kao što je kada tty interfejs menja UART postavke ili odgovarajuće brzine prenosa podataka tako što traži start / stop bitove. Obično je sve ovo potrebno za spavanje na sekundu ili dva. Još robustnija tehnika je pokušati ponovo dok hardver nije spreman da primi ulaz. Sledeći primer koristi obe strategije:

pošaljite "brzinu 9600 \ r"; spavanje 1 ocekuje {timeout {send "\ r"; exp_continue} $ prompt}

trap -code neće raditi sa bilo kojom komandom koja se nalazi u Tcl-ovoj petlji događaja, kao što je spavanje. Problem je u tome što u ciklusu događaja Tcl odbacuje povratne kodove iz async handler-ova. Rešenje je postavljanje zastave u šifru zamke. Zatim proverite zastavicu odmah nakon komande (npr. Spavanje).

Komanda expect_background ignoriše -timeout argumente i nema pojam vremenskih ograničenja uopšte.

& # 34; EXPECT HINTS & # 34;

Postoji nekoliko stvari o Expect-u koje mogu biti neintuitivne. Ovaj odeljak pokušava da reši neke od ovih stvari sa nekoliko sugestija.

Problem uobičajenog očekivanja je kako prepoznati šalterske upute. Pošto ih različito prilagođavaju različiti ljudi i različite granate, prenosno automatiziranje rlogina može biti teško bez poznavanja prompta. Odgovarajuća konvencija je da korisnici čuvaju regularni izraz koji opisuje njihov poziv (posebno njegov kraj) u varijabli okoline EXPECT_PROMPT. Može se koristiti kod kao što sledi. Ako EXPECT_PROMPT ne postoji, kod i dalje ima dobre šanse da ispravno funkcioniše.

postaviti prompt "(% | # | \\ $) $"; # # podrazumevano prompt catch {postaviti prompt $ env (EXPECT_PROMPT)} očekivati ​​-re $ prompt

Podstičem vas da pišete očekivane obrasce koji uključuju kraj onoga što očekujete da vidite. Time se izbjegava mogućnost odgovora na pitanje pre nego što se vidi čitava stvar. Pored toga, iako ćete možda moći da odgovorite na pitanja pre nego što ih u potpunosti vidite, ako odgovorite ranije, vaš odgovor može se pojaviti ponovo u sredini pitanja. Drugim riječima, rezultujući dijalog će biti tačan, ali izgledati umešanim.

Većina upozorenja uključuje prostorni znak na kraju. Na primjer, poziv od ftp je 'f', 't', 'p', '>' i. Da biste se podudarali sa ovim pozivom, morate da prijavite svaki od ovih znakova. Česta je greška da se ne uključi prazno. Stavite prazno u eksplicitno.

Ako koristite obrazac oblika X *, * će se poklapati sa svim rezultatima primljenim od kraja X do poslednje primljene stvari. Ovo zvuči intuitivno, ali može biti nešto zbunjujuće jer fraza "poslednja primljena" može varirati u zavisnosti od brzine računara i obrade I / O i od strane kernela i upravljačkog programa uređaja.

Konkretno, ljudi imaju tendenciju da vide programski izlaz koji dolazi u ogromne komade (atomski) kada u stvarnosti većina programa proizvodi izlaz jedan red u isto vrijeme. Pod pretpostavkom da je ovo slučaj, * u obrazcu iz prethodnog stava može da se podudara samo sa završetkom trenutne linije, iako se čini da ima više, jer je u trenutku utakmice bilo sve izlazne rezultate koje su primljene.

Očekuje se da nema načina da saznaju da će doći do daljeg izlaza osim ako vaš obrazac to posebno ne računa.

Čak iu zavisnosti od linijsko orijentisanog razmnožavanja nije mudro. Programi ne samo da retko daje obećanja o vrsti puferovanja koji oni rade, ali sistemsko probijanje može prekinuti izlazne linije tako da linije raskidaju na naizgled slučajnim mestima. Dakle, ako možete da izrazite poslednjih nekoliko karaktera upozorenja prilikom pisanja obrasca, pametno je to učiniti.

Ako čekate uzorak u poslednjem izlazu programa i program emituje nešto drugo umesto toga, nećete moći da ga detektujete timeout ključnom riječju. Razlog je taj što ocekivanje nece trajati - umesto toga dobiće indikaciju eofa . Koristite to umesto toga. Još bolje, koristite oba. Na taj način, ako se ova linija ikada pomera, nećete morati sami urediti liniju.

Nove linije se obično pretvaraju u povratak kretanja, sekvencu linija u toku kada izlazi terminalski upravljački program. Dakle, ako želite obrazac koji se eksplicitno poklapa sa dve linije, od, recimo, printf ("foo \ nbar"), trebalo bi da koristite obrazac "foo \ r \ nbar".

Sličan prevod se javlja prilikom čitanja od korisnika putem očekivača . U ovom slučaju, kada pritisnete povratak, biće prevedeno na novu liniju. Ako Expect zatim prođe u program koji postavlja svoj terminal u sirovi mod (poput telnet), postojaće problem, jer program očekuje pravi povratak. (Neki programi stvarno opraštaju u tome što će automatski prevođiti nove linije na povratak, ali većina ih ne.) Nažalost, ne postoji način da se utvrdi da li je program stavio svoj terminal u raw mod.

Umesto ručno zamenjivanje novih linija sa povratkom, rešenje je da se koristi komanda "stty raw", koja će zaustaviti prevod. Međutim, obratite pažnju da to znači da više nećete dobiti kuvane funkcije za uređivanje linija.

interaktivno implicitno postavlja svoj terminal u sirovi mod, tako da ovaj problem neće nastati.

Često je korisno čuvati lozinke (ili druge privatne informacije) u Expect skriptama. Ovo se ne preporučuje zato što je bilo čemu što je sačuvan na računaru podložan pristupu bilo kome. Stoga, interaktivno traženje lozinki iz skripte je pametnija ideja nego što ih doslovno uvodi. Ipak, ponekad je takva ugradnja jedina mogućnost.

Nažalost, UNIX datotečni sistem nema direktan način kreiranja skripti koji su izvršni, ali nečitljivi. Sistemi koji podržavaju setgidne skripte mogu indirektno simulirati ovo na sledeći način:

Kreirajte Expect skriptu (koja sadrži tajne podatke) kao i obično. Omogućite da njegove dozvole budu 750 (-rwxr-x ---) i koje su u vlasništvu pouzdane grupe, tj. Grupe kojoj je dozvoljeno čitanje. Ako je potrebno, kreirajte novu grupu za ovu svrhu. Zatim kreirajte skriptu / bin / sh sa dozvolama 2751 (-rwxr-s - x) u vlasništvu iste grupe kao i ranije.

Rezultat je scenario koji se može izvršiti (i pročitati) od strane bilo koga. Kada se pozove, pokreće scenariju Expect .

& # 34; POGLEDAJ TAKO & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: Tcl-Based Toolkit za automatizaciju interaktivnih programa" , Don Libes, str. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"Očekuju: Smanjenje onih nekontrolisanih uticaja interaktivnosti" Don Libesa, Proceedings of Summer USENIX Conference, Anaheim, California, 11-15.
. "Korišćenje očekivanja za automatizaciju zadataka administracije sistema" Don Libesa, Zbornik konferencije administracije sistema velikih instalacija sistema USENIX iz Colorado Springsa, Colorado, 17-19. Oktobar 1990.
. I "Tcl: Embeddable Command Language", John Ousterhout, Zbornik zimskih 1990 USENIX konferencija, Washington, DC, 22-26. Januara 1990. godine. "Očekujem: skripte za kontrolu interaktivnih programa" Don Libesa, računarski sistemi , Vol. 4, br. 2, časopisi za štampu Univerziteta u Kaliforniji, novembar 1991. godine. "Testiranje regresije i ispitivanje interaktivnih programa", Don Libes, Zbornik radova USENIX Conference 1992., str. 135-144, San Antonio, TX, 12. i 15. juna 1992. godine. "Kibitz - povezivanje više interaktivnih programa zajedno", Don Libes, Softver - praksa i iskustvo, John Wiley & Sons, West Sussex, Engleska, Vol.

23, broj 5, maj, 1993. I "Debuger za aplikacije Tcl", Don Libes, Zbornik radionice Tcl / Tk 1993, Berkeley, CA, 10-11. Juna 1993.

AUTOR

Don Libes, Nacionalni institut za standarde i tehnologiju

PRIZNANJA

Zahvaljujući John Ousterhoutu za Tcl i Scott Paisley za inspiraciju. Zahvaljujući Rob Savoye-u za Autoconfiguration kod Expect-a.

Datoteka HISTORY dokumentuje veliki deo evolucije očekivanja . To čini interesantno čitanje i može vam dati dodatni uvid u ovaj softver. Zahvaljujući ljudima koji su pomenuti u njemu, koji su mi poslali popravke grešaka i pružili drugu pomoć.

Projektovanje i implementaciju Expect-a delimično je plaćena od strane američke vlade i stoga je u javnom domenu. Međutim, autor i NIST bi željeli kredit ako se koristi ovaj program i dokumentacija ili njihovi dijelovi.