Pričakuje se ukaz Linux / Unix

Pričakuje, da je program, ki govori o drugih interaktivnih programih v skladu s scenarijem. Po scenariju, Expect ve, kaj je mogoče pričakovati od programa in kakšen bi bil pravilen odziv. Razlagan jezik omogoča razdeljevanje in strukture nadzora na visoki ravni za usmerjanje pogovornega okna. Poleg tega lahko uporabnik prevzame nadzor in interakcijo neposredno po želji, nato pa vrne nadzor na skript.

Expectk je mešanica Expect in Tk. Obnaša se tako kot želja pričakovanja in Tk. Expect se lahko uporablja tudi neposredno v C ali C + + brez Tcl.

Ime "Expect" prihaja iz ideje o pošiljanju / pričakovanju zaporedij, ki jih popularizirajo uucp, kermit in drugi programi za nadzor modema. Vendar je za razliko od UUCP Expect posplošen, tako da se lahko izvaja kot ukaz na ravni uporabnika s katerim koli programom in nalogo v mislih. Pričakuje, da se lahko hkrati pogovarja z več programi.

Kaj lahko pričakujete

Na primer, tukaj je nekaj stvari, ki jih lahko pričakuje ukaz:

Obstaja več razlogov, zakaj lupina ne more opravljati teh nalog. Vse je mogoče z Expect.

Na splošno je Expect uporaben za zagon katerega koli programa, ki zahteva interakcijo med programom in uporabnikom. Vse, kar je potrebno, je, da lahko interakcijo označimo programsko. Pričakuje lahko tudi povratni nadzor uporabniku, ne da bi zaustavili program, ki ga nadzirate. Podobno lahko uporabnik kadarkoli vrne nadzor v skripto.

Uporaba

Pričakuje, da cmdfile prikaže seznam ukazov za izvedbo. Pričakovanja se lahko implicitno sklicujejo na sisteme, ki podpirajo #! zapis, tako da označite scenarij kot izvršljiv in naredite prvo vrstico v skripti:

#! / usr / local / bin / pričakujte -f

Seveda mora pot natančno opisati, kje pričakuje življenje. / usr / local / bin je le primer.

Zastava -c prednamešča ukaz, ki naj bi bil izveden pred katerimkoli v skriptu. Navesti je treba ukaz, da se lupina ne razdeli. To možnost lahko uporabite večkrat. Več ukazov se lahko izvede z enim -c, tako da jih ločite s podpičji. Ukazi se izvajajo v vrstnem redu, ki se prikaže. Pri uporabi Expectka je ta možnost podana kot -command.

Zastava -d omogoča nekaj diagnostičnega izhoda, ki predvsem poroča o notranji aktivnosti ukazov, kot je pričakovanje in interakcija. Ta zastava ima enak učinek kot "exp_internal 1" na začetku scenarija Expect, poleg tega pa je natisnjena tudi različica Expect.

Zastava -D omogoča interaktivni odjemalec. Sledi cela vrednost. Razhroščevalnik bo prevzel nadzor pred naslednjim postopkom Tcl, če je vrednost nična ali če pritisnete tipko ^ C ali pritisnete prekinitev ali v skriptu prikaže drug ustrezen ukaz za odpravljanje napak. Pri uporabi Expectka je ta možnost podana kot - Debug.

Zastava -f prednamešča datoteko, iz katere bere ukaze. Samska zastavica je neobvezna, saj je uporabna le, če uporabljate #! tako da se v ukazni vrstici lahko dajo drugi argumenti. Pri uporabi Expectka je ta možnost podana kot -file.

Privzeto se ukazna datoteka bere v pomnilnik in se v celoti izvaja. Občasno je zaželeno brati datoteke v eni vrstici hkrati. Če želite s tem izvesti poljubne datoteke, ki jih je treba obravnavati, uporabite zastavico -b. Pri uporabi Expectka je ta možnost podana kot -buffer.

Če je niz kot "-" ime datoteke, se namesto tega prebere standardni vhod. Uporabite »./-« za branje iz datoteke, ki se dejansko imenuje »-«.

Zastava -i povzroči, da pričakujete interaktivno pozivanje na ukaze, namesto da jih berete iz datoteke. Poziv se prekine prek ukaza za izhod ali EOF. Zastava -i se predpostavlja, če ne uporabite niti ukazne datoteke niti -c. Pri uporabi Expectka je ta možnost podana kot -interaktivna.

- se lahko uporablja za razmejitev konca možnosti. To je uporabno, če želite svojemu skriptu posredovati argument, podoben opciji, ne da bi ga razlagali Expect. To je mogoče uporabiti v #! linijo, da preprečite kakršnokoli razliko, ki jo zanima Zastava. Na primer, bodo izvirne argumente, vključno s skriptom, zapustili v spremenljivki argv .

#! / usr / local / bin / pričakujte -

Upoštevajte, da je treba ob dodajanju argumentov na #! Upoštevati običajne dogovore getopt (3) in execve (2); line.

Datoteka $ exp_library / expect.rc se samodejno pridobi, če je prisotna, razen če je uporabljena oznaka -N. (Pri uporabi Expectka je ta možnost označena kot -NORC.) Takoj po tem se datoteka ~ / .expect.rc samodejno pridobi, razen če je uporabljena oznaka -n. Če je spremenljiva spremenljivka DOTDIR, se obravnava kot imenik in od tam se bere .expect.rc. Pri uporabi Expectka je ta možnost podana kot -norc. Ta izvor se zgodi šele po izvedbi katere koli -c zastavice.

-v vzroki Pričakujte, da natisnete njeno številko in izstopite. Ustrezna zastavica v Expectku, ki uporablja imena dolgih zastavic, je -version.

Izbirni argumenti so sestavljeni v seznam in shranjeni v spremenljivki, imenovani argv in. argc je inicializiran na dolžino argv.

Argv0 je opredeljen kot skript ali binarni naslov, če ni uporabljen noben skript. Na primer, natisne naslednje ime skripta in prve tri argumente:

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

Ukazi

Pričakuje uporabo jezika ukaznega orodja. Tcl zagotavlja nadzorni tok (če, za, prelom), vrednotenje izrazov in več drugih funkcij, kot je recursion in opredelitev postopka. Tukaj uporabljeni ukazi, vendar niso definirani (nastavite, če, exec) so ukazi Tcl. Pričakuje, da podpira dodatne ukaze. Če ni določeno drugače, ukazi vrnejo prazen niz.

Ukazi so našteti abecedno tako, da jih je mogoče hitro najti. Vendar lahko novim uporabnikom lažje začnete z branjem opisov spawn, pošiljanje, pričakovanje in medsebojno delovanje v tem vrstnem redu.

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

zapre povezavo s trenutnim procesom . Večina interaktivnih programov bo zaznala EOF na svojem stdinu in izhodu; tako blizu je običajno dovolj, da ubije proces tudi. Točka -i označuje, da se postopek zapre, kar ustreza imenovanemu spawn_idu.

Oba pričakujeta in interaktivno zaznata, kdaj trenutni postopek zapusti in implicitno zaprete, vendar če ubijete postopek , recimo, "exec kill $ pid", morate izrecno pokličite blizu .

Zastava -onexec določa, ali je ID zarodja zaprt v vseh novih razvitih procesih ali če je postopek prekrit. Če želite zapustiti ID odprtega prostora, uporabite vrednost 0. Vrednost, ki ni nič, povzroči, da se drstišče zapre v vseh novih postopkih.

Zastava -slava zapre pomožno, povezano z idr. Ko je povezava zaprta, se pomožni program samodejno zapre, tudi če je še vedno odprt.

Ne glede na to, ali je povezava implicitno ali eksplicitno zaprta, morate počakati, da počistite ustrezno režo procesorja jedra. Zapiranje ukaza ne pokliče čakanja, ker ni nobenega jamstva, da bo zaprtje povezave s procesom povzročilo izstop.

debug [[-now] 0 | 1]

nadzoruje razhroščevalnik Tcl, ki vam omogoča, da preizkusite izjave in nastavite prelomne točke.

Brez argumentov se vrne 1, če se razhroščevalnik ne zažene, sicer se vrne 0.

Z argumentom 1 se zagon odpravi. Z argumentom 0 se odpravi napako. Če pred argumentom 1 sledi oznaka -now, se odpravi napako takoj. V nasprotnem primeru se odpravi napako z naslednjo izjavo Tcl.

Ukaz za odpravljanje napak ne spremeni nobenih pasti. Primerjajte to, da pričnete z oznako -D.

Ukaz za prekinitev povezave odklopi proces oddajanja iz terminala . V ozadju se nadaljuje. Procesu dobi svojo lastno procesno skupino. Standardni I / O se preusmeri na / dev / null .

Naslednji fragment uporablja prekinitev povezave, da nadaljuje izvajanje skripta v ozadju.

če {{fork]! = 0} izklopite prekinitev povezave. . .

Naslednji skript prebere geslo in nato zažene program vsako uro, ki zahteva geslo ob vsakem zagonu. Skript dobi geslo, tako da ga morate enkrat vnesti le.

send_user "geslo? \" pričakujte_user -re "(. *) \ n" za {} 1 {} {če {[fork]! = 0} {spanje 3600; nadaljuj} disconnect spawn priv_prog pričakujejo geslo: pošlji "$ expect_out 1, niz) \ r ". . . izstop}

Prednost, da prekinete povezavo prek funkcije asinhronskega postopka (&) ukazne lupine, je, da Expect lahko shranjuje parametre terminala pred odklopom in jih kasneje uporabi za nove ptys. Z &, Expect nima možnosti brati parametrov terminala, ker je terminal že odklopljen do trenutka, ko Expect prejme nadzor.

exit [-opts] [status]

vzrok Pričakuje, da se izstopi ali kako drugače pripravi na to.

Zastava -onxit povzroči, da se naslednji argument uporablja kot izhodni upravljalnik. Brez argumenta se vrne trenutni program za izstop.

Priznana oznaka -exex Pričakuje se, da se bo pripravila na izhod, vendar ne bo dejansko vrnila nadzor nad operacijskim sistemom. Izvaja se uporabniški definiran izhodni upravljalnik, kot tudi lasten notranji vodnik Expect. Nadaljnje ukaze Expect ne bi smeli izvajati. To je uporabno, če uporabljate Expect z drugimi razširitvami Tcl. Trenutni tolmač (in glavno okno, če je v okolju Tk) ostanejo tako, da se lahko druge razširitve Tcl očistijo. Če se izpust Expect-a ponovno pokliče (vendar se to lahko zgodi), se ne bodo ponovili.

Po izstopu so vse povezave z ustvarjenimi postopki zaprto. Zaprtje bo zaznano kot EOF s sproščenimi procesi. Izhod ne izvaja nobenih drugih ukrepov, ki presegajo običajen postopek _exit (2). Tako lahko še naprej tečejo pridelani procesi, ki ne preverjajo EOF. (Različni pogoji so pomembni za določanje, na kakšen način bodo poslani pridobljeni procesi poslani, vendar so ti odvisni od sistema, običajno dokumentirani pod izhodom (3).) Začetni procesi, ki se še izvajajo, bodo podedovali init.

stanje statusa (ali 0, če ni določeno) se vrne kot status izhoda Expect . izhod je implicitno izveden, če je dosežen konec skripta.

exp_continue [-continue_timer]
Ukaz exp_continue omogoča, da pričakuje , da bo nadaljeval z izvajanjem, ne pa se vrnil, kot bi običajno. Privzeto exp_continue ponastavi časomer. Zastoj -continue_timer preprečuje ponovni zagon časovnika. (Glejte pričakovanje za več informacij.)

exp_internal [-f datoteka] vrednost
povzroča nadaljnje ukaze za pošiljanje diagnostičnih podatkov, ki so notranji za Pričakovanje stderr, če vrednost ni nič. Ta izhod je onemogočen, če vrednost znaša 0. Diagnostične informacije vključujejo vsak prejet znak in vsak poskus, da se trenutni rezultat uskladi z vzorci.

Če je priložena dodatna datoteka, je v to datoteko zapisana vsa normalna in razhroščevalna izhodišča (ne glede na vrednost vrednosti ). Vsaka prejšnja diagnostična izhodna datoteka je zaprta.

Zastava -info povzroči exp_internal, da vrne opis najnovejših nedodelanih argumentov.

exp_open [args] [-i spawn_id]
vrne identifikator datoteke Tcl, ki ustreza prvotnemu idr. Identifikator datoteke lahko nato uporabite, kot da ga odpre odprti ukaz Tcl. (ID ne bi smel biti več uporabljen. Počakajte, da se ne izvede.

Zastava -leaveopen zapusti iskani id za odpiranje preko ukazov Expect. Počakajte na idr.

exp_pid [-i spawn_id]
vrne identifikacijsko številko procesa, ki ustreza trenutno ustvarjenemu procesu. Če je uporabljena zastavica -i , vrne pid ustreza tistemu podanega ID-ja.

exp_send
je vzdevek za pošiljanje .

exp_send_error
je vzdevek za send_error .

exp_send_log
je vzdevek za send_log .

exp_send_tty
je vzdevek za send_tty .

exp_send_user
je vzdevek za send_user .

exp_version [[-exit] različica]
je uporabno za zagotavljanje, da je skript združljiv s trenutno različico Expect.

Brez argumentov se vrne trenutna različica Expect . To različico lahko nato kodirate v vašem skriptu. Če dejansko veste, da ne uporabljate funkcij zadnjih različic, lahko določite starejšo različico.

Različice sestavljajo tri številke, ločene s pikami. Najprej je glavna številka. Skripte, napisane za različice Expect z različno večjim številom, skoraj zagotovo ne bodo delovale. exp_version vrne napako, če se glavne številke ne ujemajo.

Drugo je manjša številka. Skripte, napisane za različico z večjo manjšo številko, kot je trenutna, so lahko odvisne od nove funkcije in morda ne bodo delovale. exp_version vrne napako, če se glavne številke ujemajo, manjša številka skripte pa je večja od tiste pri tekočem Expect .

Tretjič je številka, ki v primerjavi z različico ne sodeluje. Vendar pa se povečuje, ko se distribucija programske opreme Expect na kakršen koli način spremeni, na primer z dodatno dokumentacijo ali optimizacijo. Za vsako novo manjšo različico se ponastavi na 0.

Z oznako -exit , Expect natisne napako in zapusti, če je bila različica zastarela.

pričakujte [[-opts] pat1 body1] ... [-opts] patn [bodyn]
čaka, dokler eden od vzorcev ne ustreza izhodu pridobljenega postopka, je minilo določeno časovno obdobje ali je viden konec datoteke. Če je zadnje telo prazno, se lahko izpusti.

Vzorec iz zadnjega ukaza expect_before se implicitno uporablja pred drugimi vzorci. Vzorec iz zadnjega ukaza expect_after se implicitno uporablja po vseh drugih vzorcih.

Če argumenti celotnemu pričakovanemu izrazu zahtevajo več kot eno vrstico, se vsi argumenti lahko "zavrtijo" v eno tako, da se izognemo zaključku vsake vrstice s poševnico. V tem primeru se običajne substitucije Tcl pojavijo kljub oklepajom.

Če je vzorec ključna beseda eof , se ustrezno telo izvrši ob koncu datoteke. Če je vzorec časovno zakasnitev ključne besede, se ustrezno telo izvrši ob zakasnitvi. Če se ne uporablja ključna beseda prekinitve, se implicitno ničelno dejanje izvede ob zakasnitvi. Privzeto časovno obdobje je 10 sekund, vendar je lahko nastavljeno, na primer do 30, s pomočjo ukaza "set timeout 30". Neomejeno zakasnitev se lahko določi z vrednostjo -1. Če je vzorec privzeta ključna beseda, se ustrezno telo izvede ob časovnem zakasnitvi ali končanju datoteke.

Če se vzorec ujema, se izvrši ustrezno telo. pričakujejo, da vrne rezultat telesa (ali prazen niz, če se vzorec ne ujema). V primeru, da se ujemajo z več vzorci, se najprej izberemo telo.

Vsakič, ko pride novi izhod, se primerja z vsakim vzorcem v vrstnem redu, na katerega so navedeni. Tako lahko preskusite, da ni zadetka, tako da naredite zadnjemu vzorcu nekaj, za kar je zagotovljeno, na primer, poziv. V primerih, ko ni promptov, morate uporabiti zakasnitev (tako kot bi si, če bi bili ročno vzajemno).

Vzorci so podani na tri načine. Privzeto so vzorci podani kot pri ukazu za ujemanje nizov Tcl. (Taki vzorci so podobni tudi regularnim izrazom C-shell, ki se ponavadi imenujejo vzorci "glob"). Zastava -gl se lahko uporablja za zaščito vzorcev, ki bi se sicer lahko ujemali s pričakovanimi zastavami. Vsak vzorec, ki se začne z "-", mora biti zaščiten tako. (Vsi nizi, ki se začnejo z "-", so rezervirani za prihodnje možnosti.)

Na primer, naslednji fragment išče uspešno prijavo. (Upoštevajte, da je prekinitev predvidena kot postopek, določen drugje v skriptu.)

pričakujte {busy {postavlja zasedeno \ n; exp_continue} ni uspelo prekiniti "neveljavnega gesla" prekiniti prekinitev prekinitve prekinjenega povezava}

Kvote so potrebne na četrtem vzorcu, saj vsebuje prostor, ki bi sicer ločil vzorec od dejanja. Vzorci z istim dejanjem (kot so tretji in četrti) zahtevajo ponovno navedbo dejanj. To se lahko izognete z uporabo vzorcev slogov regexp (glej spodaj). Več informacij o oblikovanju glob-style vzorcev najdete v priročniku Tcl.

Moduli v slogu Regexp sledijo sintaksi, ki jo določi Tcl's regexp (kratki za ukaz "regular expression"). Ponatisni vzorci so uvedeni z zastavo -re . Prejšnji primer je mogoče ponovno napisati z regexpom kot:

pričakujte {busy {postavlja zasedeno \ n; exp_continue} -re "ni uspelo | neveljavno geslo" prekiniti prekinitev prekinitve je prekinjena povezana}

Obe vrsti vzorcev sta "unanchored". To pomeni, da se vzorcem ni treba ujemati s celotnim nizom, lahko pa se začne in konča ujemanje kjer koli v nizu (dokler se vse drugo ujema). Uporabite ^ za ujemanje začetka niza in $ za ujemanje s koncem. Upoštevajte, da če ne čakate na konec niza, se lahko vaši odgovori zlahka končajo na sredini niza, saj se odzovejo od pridobljenega procesa. Čeprav še vedno proizvajajo pravilne rezultate, lahko izhod izgleda nenaravno. Tako je uporaba $ spodbujena, če lahko natančno opišete znake na koncu niza.

Upoštevajte, da v mnogih urednikih se vrstici ^ in $ ujemata z začetkom in koncem vrstic. Vendar, ker pričakovano ni linijsko usmerjeno, se ti znaki ujemajo z začetkom in koncem podatkov (v nasprotju z vrsticami), ki so zdaj v pričakovanju ustreznega medpomnilnika. (Prav tako si oglejte spodnjo opombo o "sistemski prebavi.")

Zastava -ex povzroči, da se vzorec ujema z natančnim nizom. Ni interpretacije *, ^, itd., Čeprav je treba še vedno upoštevati običajne konvencije Tcl. Natančni vzorci so vedno neokrnjeni.

Označba -nocase povzroči, da se velike črke izhoda primerjajo, kot da so male črke. Vzorec ni prizadet.

Med branjem izhode lahko več kot 2000 bajtov prisili prejšnje bajte, da bi bile "pozabljene". To se lahko spremeni s funkcijo match_max . (Upoštevajte, da lahko prekomerno velike vrednosti upočasnijo ujemajočega se vzorca.) Če je patlist full_buffer , se ustrezno telo izvrši, če so bili prejeti match_max bajti in nobeni drugi vzorci niso ujemali. Ne glede na to, ali je uporabljena ključna beseda full_buffer ali ne, so pozabljeni znaki zapisani v pričakovano točko (pufer).

Če je patlist ključna beseda null in dovoljeni so ničli (prek ukaza remove_nulls ), se ustrezno telo izvrši, če se ujema en sam ASCII 0. Ni mogoče ujemati 0 bajtov prek glob ali regexp vzorcev.

Ko se ujema vzorec (ali eof ali full_buffer), se v spremenljivki expect_out (buffer) shrani kateri koli ujemajoči in predhodno neizravnan izhod. Do 9 ujemanja podmenija regexp se shranijo v spremenljivke expect_out (1, niz) skozi expect_out (9, niz) . Če se pred vzorcem uporabi indikator indikatorjev , se začetni in končni indeksi (v obliki, primerni za laž ) od 10 nizov shranijo v spremenljivke expect_out (X, start) in pričakujejo (X, konec), kjer je X števka, ustreza položaju podstavka v pufru. 0 se nanaša na nizove, ki so se ujemali s celotnim vzorcem in se ustvarjajo za vzorce glob in regexp vzorce. Na primer, če je proces proizvedel izhod "abcdefgh \ n", je rezultat:

pričakujte "cd"

je, kot da so bile izvedene naslednje izjave:

set expect_out (0, string) cd set pričakuj (pufer) abcd

in "efgh \ n" ostane v izhodnem medpomnilniku. Če je proces proizvedel izhod "abbbcabkkkka \ n", je rezultat:

pričakujte -indices -re "b (b *). * (k +)"

je, kot da so bile izvedene naslednje izjave:

set wait_out (0, start) 1 set expect_out (0, konec) 10 set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, konec) 3 set expect_out (1, string) bb set expect_out (2, začetek) 10 set expect_out (2, konec) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

in "a \ n" ostane v izhodnem medpomnilniku. Vzorec "*" (in -re ". *") Bo izpustil izhodni medpomnilnik, ne da bi prebral več izhoda iz procesa.

Običajno se ujemanje izloča iz notranjih medpomnilnikov Expect. To se lahko prepreči s prednastavitvijo vzorca z zastavico -notransfer . Ta zastavica je še posebej uporabna pri eksperimentiranju (in lahko med eksperimentiranjem skrajšate na "-not").

ID pričakovanja, povezan z ujemajočim se izhodom (ali eof ali full_buffer), je shranjen v pričakovanju (spawn_id) .

Zastava -timeout povzroči, da trenutni ukaz pričakuje, da kot naslednjo vrednost uporabi časovno omejitev, namesto da uporabi vrednost časovne spremenljivke.

Privzeto se vzorci ujemajo z izhodom iz trenutnega postopka, vendar pa oznaka -i izjavi, da se izhod iz imenovanega seznama spawn_id ujema z naslednjimi vzorci (do naslednjega -i ). Seznam spawn_id bi moral biti seznam s spawn_idom, ločen s presledki, ali spremenljivka, ki se nanaša na tak seznam spawn_ids.

Naslednji primer na primer pričakuje, da je »povezan« iz trenutnega postopka ali »zaseden«, »neuspeli« ali »neveljavno geslo« iz spawn_id, ki ga imenuje $ proc2.

pričakujte {-i $ proc2 zasedeno {postavlja zasedeno \ n; exp_continue} -re "ni uspelo | neveljavno geslo" prekiniti prekinitev prekinitve je prekinjena povezana}

Vrednost globalne spremenljivke any_spawn_id se lahko uporablja za ujemanje vzorcev z vsemi spawn_idami, ki so v imeniku trenutno pričakovane, imenovane z vsemi drugimi -i zastavami. Spawn_id iz oznake -i brez povezanega vzorca (tj. Ki ga takoj sledi drugi -i ) je na voljo vsem drugim vzorcem v istem pričakovanem ukazu, povezanem s katerimkoli_spawn_id.

Zastava -i lahko tudi imenuje globalno spremenljivko, v tem primeru se spremeni spremenljivka za seznam ID-jev drstišč. Spremenljivka se ponovi vsakič, ko se spremeni. To omogoča način spreminjanja vira I / O, medtem ko je ukaz v izvedbi. ID-ji za spawn, ki se na ta način imenujejo, se imenujejo "posredni" izvorni idi.

Ukrepi, kot so prekinitev in nadaljevanje, povzročijo, da se obnašajo kontrolne strukture (npr. Za , proc ) na običajen način. Ukaz exp_continue omogoča, da pričakuje , da bo nadaljeval z izvajanjem, ne pa se vrnil, kot bi običajno.

To je uporabno za izogibanje eksplicitnim zankam ali ponavljajočim pričakovanjem. Naslednji primer je del fragmenta za avtomatizacijo rlogina. Exp_continue se izogne ​​temu, da bi morali napisati drugi pričakovan izpis (če želite znova iskati), če rlogin zahteva geslo.

pričakujte {Password: {stty -echo send_user "geslo (za uporabnika $) na $ hostu:" expect_user -re "(. *) \ n" send_user "\ n" pošlji "$ expect_out (1, niz) echo exp_continue} nepravilno {send_user "neveljavno geslo ali račun \ n" exit} "timeout {send_user" povezava z gostiteljem $ timed out \ n "exit} eof {send_user \" povezavo z gostiteljem ni uspelo: $ expect_out (buffer) "exit} ponovno $ hitro}

Naslednji fragment lahko na primer pomaga uporabniku voditi interakcijo, ki je že popolnoma avtomatizirana. V tem primeru je terminal postavljen v surovi način. Če uporabnik pritisne »+«, se spremenljivka poveča. Če pritisnete "p", se v proces dodeli več vračil, morda ga nekako nagne, in "i" uporabniku omogoča interakcijo s procesom, s čimer uspešno krmili nadzor iz skripte. V vsakem primeru exp_continue omogoča tekočemu pričakovanju, da nadaljuje ujemanje vzorcev po izvedbi trenutnega dejanja.

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

Privzeto je exp_continue ponastavil časomerilec zakasnitve. Časovnik se ne zažene ponovno, če se z oznako -continue_timer kliče exp_continue .

pričakujte po [pričakujte_args]
deluje enako kot pričakovanje, razen če se lahko ujemajo z vzorci iz pričakovanih in pričakovanih , potem pričakujejo vzorec. Za več informacij glejte ukaz expect_before .

expect_background [expect_args]
sprejema iste argumente, kot pričakujejo , vendar se takoj vrnejo. Patterns se preskusijo, ko prihaja nov vnos. Časovna omejitev vzorca in privzeto sta brez pomena pričakovati_background in jih tiho zavržemo. V nasprotnem primeru ukaz expect_background uporablja pričakovanja in pričakovanja po vzorcih, tako kot pričakujejo .

Ko se ocenjujejo dejanja expect_background , je obdelava ozadja za isti igličasti id blokirana. Obdelava ozadja je odblokirana, ko se dejanje konča. Medtem ko je obdelava ozadja blokirana, je možno, da se (ospredje) pričakuje na istem ID-ju.

Pričakovana pričakovanja ni mogoče izvršiti, medtem ko je pričakovanje_backgrounda odblokirano. expect_background za določen id potopa se izbriše tako, da se prikaže nov pričakovni_background z istim ID-jem za spawn. Razglasitev pričakovanja_background brez vzorca odstrani določeni ID drstenja od možnosti, da se vzorci ujemajo v ozadju.

pričakujte_predaj [pričakujte_args]
sprejema iste argumente, kot pričakujejo , vendar se takoj vrnejo. Pari vzorcev in dejanj iz najnovejšega pričakovanega predhodnika z istim ID-jem se samodejno dodajo kateremu koli naslednjemu pričakovanemu ukazu . Če se vzorec ujema, se obravnava, kot da je bilo navedeno v samem pričakovanem ukazu, povezano telo pa se izvrši v kontekstu pričakovanega ukaza. Če se vzorci pričakujejo od pričakovanih in pričakujejo , se uporabi vzorec expect_before .

Če ni podan noben vzorec, se ID kopanja ne preveri za nobene vzorce.

Razen če jih preglasi z -i zastavo, se vzorci pričakujejo, da se ujemajo z ID-jem, ki je bil določen v času, ko je bil izvršen ukaz expect_before (ne, ko se ujema z vzorcem).

Zastava -info povzroči pričakovanje, da vrne trenutne specifikacije, katere vzorce se bo ujemalo. Po privzeti nastavitvi poroča o trenutnem idr. Za informacije o tem ID-ju se lahko navede še izbirno specifikacijsko oznako idr. Na primer

pričakujte-pred-informacijami-i $ proc

Največ je mogoče navesti še eno specifikacijo idrona. Zastavica -indirect zatrjuje neposredne idr., Ki prihajajo samo iz posrednih specifikacij.

Namesto specifikacije ID-ja za spawn bo oznaka "-all" povzročila "-info" za poročanje o vseh ID-jevih.

Izhod znaka -info se lahko ponovno uporabi kot argument, ki ga želite pričakovati.

pričakujte_tty [pričakujte_args]
je kot pričakovati, vendar prebere znake iz / dev / tty (npr. pritiski tipk od uporabnika). Privzeto se odčitava v načinu kuhanja. Tako se morajo vrstice končati z vrnitvijo, da jih pričakujejo . To se lahko spremeni prek stty (glejte spodnji ukaz stty ).

pričakujte_user [pričakujte_args]
je kot pričakovati, vendar prebere znake iz stdin (npr. pritiski tipk od uporabnika). Privzeto se odčitava v načinu kuhanja. Tako se morajo vrstice končati z vrnitvijo, da jih pričakujejo . To se lahko spremeni prek stty (glejte spodnji ukaz stty ).

vilice
ustvarja nov proces . Nov postopek je natanćna kopija trenutnega postopka Expect . Pri uspehu, vilica vrne 0 v nov (otroški) proces in vrne identifikacijsko številko otroškega procesa v nadrejeni proces . Pri neuspehu (vedno zaradi pomanjkanja virov, npr. Swap prostora, pomnilnika), vilice vrne -1 v nadrejeni proces in otrokov postopek ni ustvarjen.

Izgovarjani procesi se izhodi prek ukaza za izhod , tako kot prvotni postopek . Stiskane procese lahko pisate v datoteke dnevnika. Če ne onemogočite razhroščevanja ali prijavljanja v večini procesov, je rezultat zmeden.

Nekatere pty implementacije lahko celo zmedejo več bralcev in piscev. Tako je najvarnejše, preden se začne drstiti.

interaktivno [string1 body1] ... [stringn [bodyn]]
daje nadzor nad trenutnim procesom uporabniku, tako da se tipkam pošiljajo v trenutni postopek in se stdout in stderr trenutnega postopka vrnejo.

Pari nizov vrstic so lahko podani kot argumenti, v tem primeru se telo izvaja, ko je vnesen ustrezen niz. (Privzeto se niz ne pošlje v trenutni postopek .) Ukaz prevajalnika se predpostavlja, če manjka zadnje telo.

Če argumenti za celoten stavek za interakcijo zahtevajo več kot eno vrstico, se vsi argumenti lahko "ojačajo" v eno, tako da se izognemo zaključku vsake vrstice s poševnico. V tem primeru se običajne substitucije Tcl pojavijo kljub oklepajom.

Na primer, naslednji ukaz se izvaja z interakcijo z naslednjimi pari nizov telesa: Ko pritisnete ^ Z, je možnost Expect začasno prekinjena. ( Vrstica -reset obnovi terminalne načine.) Ko pritisnete ^ A, uporabnik vidi, da ste vnesli kontrolnik-A in da se proces pošlje ^ A. Ko pritisnete $, uporabnik vidi datum. Ko pritisnete ^ C, se pričakuje izstop. Če je vnesen "foo", uporabnik vidi "vrstico". Ko pritisnete ~~, interaktor Expect teče interaktivno.

nastavite CTRLZ \ 032 interaktivno {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "vnesli kontrolnik-A \ n"; pošlji "\ 001"} $ {send_user "Datum je [časovni format [ura sekund]]."} \ 003 exit foo {send_user "bar"} ~~}

V parih niza so nize v nizu, kot so navedeni kot argumenti. Nizi, ki se delno ujemajo, se ne pošiljajo v trenutni postopek v pričakovanju preostanka. Če se znaki vnesejo tako, da se ne more več ujemati, bo samo del niza poslal v postopek, ki ne more začeti drugega ujemanja. Tako se lahko nizi, ki so podniz delnih ujemanja, ujemajo kasneje, če se izvirni nizi, ki so poskušali ujemati, končno ne uspe.

Privzeto je ujemanje nizov točno brez divjih kartic . (Nasprotno, ukaz pričakuje privzeto uporabo glob-style vzorcev.) Zastava -ex se lahko uporablja za zaščito vzorcev, ki bi se sicer lahko ujemali z interakcijo zastave od tega. Vsak vzorec, ki se začne z "-", mora biti zaščiten tako. (Vsi nizi, ki se začnejo z "-", so rezervirani za prihodnje možnosti.)

Označba -re prisili niz, ki ga je treba razlagati kot vzorec slogu regexp. V tem primeru so podvajalni elementi shranjeni v spremenljivki interact_out podobno kot pričakujejo, da bo shranil svoj izhod v spremenljivki expect_out . Podobno je podprta tudi zastavica -indices .

Vzorec eof uvaja akcijo, ki se izvede ob koncu datoteke. Poseben vzorec eof lahko sledi tudi oznaki -output, v tem primeru se ujema z zaznavanjem eof med pisanjem izhodov. Privzeto eof ukrep je "vrnitev", tako da se interakcija preprosto vrne na katerokoli EOF.

Časovna omejitev vzorca uvaja časovno zakasnitev (v sekundah) in dejanje, ki se izvede po tem, ko za določen čas ni bilo prebranih znakov. Vzorec časovne omejitve velja za najnovejši postopek . Ni privzetega časovnega zakasnitve. Posebna spremenljivka »časovna omejitev« (ki jo uporablja ukaz pričakovanja ) nima vpliva na ta časovni zamik.

Na primer, lahko uporabite naslednjo izjavo za samodejne uporabnike, ki za uro niso natipkali ničesar, vendar še vedno pogosto prejemajo sistemska sporočila:

interaktivno -input $ user_spawn_id časovna omejitev 3600 return -output \ $ spawn_id

Če je vzorec ključna beseda null in dovoljeni so ničli (prek ukaza remove_nulls ), se ustrezno telo izvrši, če se ujema en sam ASCII 0. Ni mogoče ujemati 0 bajtov prek glob ali regexp vzorcev.

Če napišete vzorec z zastavico, lahko spremenljivka interact_out (spawn_id) nastavite na spawn_id, ki ustreza vzorcu (ali eof).

Ukrepi, kot so prekinitev in nadaljevanje, povzročijo, da se obnašajo kontrolne strukture (npr. Za , proc ) na običajen način. Vendar pa vrnitev povzroči interakcijo, da se vrne na svojega klicatelja, medtem ko inter_return povzroča interakcijo, da povzroči vrnitev v svojem klicatelju. Na primer, če se interaktivno imenuje "proc foo", ki je nato izvedel dejanje inter_return , se proc foo vrne. (To pomeni, da če interaktivni interni klic interaktivno vnaša vrnitev, se bo interakcija nadaljevala, medtem ko bo inter_return povzročil, da bi se interakcija vrnila kličočemu.)

Med interakcijo se uporablja surov način, tako da se lahko vsi znaki prenesejo v trenutni postopek . Če trenutni proces ne zajame signalov za nadzor opravil, se bo ustavil, če bi poslali sporočilo za zaustavitev (privzeto). Če ga želite znova zagnati, pošljite nadaljnji signal (na primer "kill-CONT"). Če res želite poslati SIGSTOP v tak postopek (z ^ Z), najprej razmislite o drstenju csh in nato zaženite svoj program. Po drugi strani pa, če želite poslati SIGSTOP v Expect yourself, najprej prevajalca (morda z uporabo zaščitnega znaka) in nato pritisnite ^ Z.

Pari nizov telesa se lahko uporabljajo kot skrajšana besedila, da bi se izognili temu, da bi morali interaktivno vnesti tolmača in izvrševati ukaze. Uporabljen je prejšnji način terminala, medtem ko se telo para-telesa izvaja.

Za hitrost, dejanja izvedejo v surovem načinu po privzetku. Zastava -reset ponastavi terminal do načina, ki ga je imel pred izvedbo interakcije (vedno, kuhani način). Upoštevajte, da se lahko znaki, ki ste jih vnesli ob preklopu, izgubijo (nesrečna značilnost gonilnika terminalov v nekaterih sistemih). Edini razlog za uporabo -reset je, če je vaše delovanje odvisno od delovanja v načinu kuhanja.

Zastavica -echo pošlje znake, ki se ujemajo z naslednjim vzorcem nazaj v proces, ki ga je ustvaril, ko je vsak znak prebrisan . To je lahko uporabno, ko mora uporabnik videti povratne informacije iz delno vnesenih vzorcev.

Če se vzorec odmeva, vendar se sčasoma ne ujema, se znaki pošljejo v pridobljeni proces . Če se postopek, ki ga sprosti, potem odmeva, bo uporabnik znova videl znake. -echo je verjetno primeren le v primerih, ko uporabnik verjetno ne bo dokončal vzorca. Na primer, naslednji izvleček je iz rftp, rekurzivnega-ftp skripta, kjer je uporabniku pozvan, da vnese ~ g, ~ p ali ~ l, da bi rekurzivno dobil, dal ali seznanil trenutni imenik. Te so tako daleč od običajnih ukazov ftp, da uporabnik verjetno ne bo vnesel čemur sledi ničesar drugega, razen zmotno, v tem primeru pa bodo verjetno samo ignorirali rezultat.

medsebojno delovanje {-ček ~ g {getcurdirectory 1} -ček ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Zastava -bufer pošlje znake, ki se ujemajo z naslednjim vzorec, v izhodni proces, ko so berljivi znaki.

To je uporabno, če želite, da program odzove vzorec nazaj. Na primer, za spremljanje, kje oseba kliče (modem Hayesovega sloga), se lahko uporabi naslednje. Vsakič, ko je viden "atd", skripta hrani ostalo vrstico.

proc lognumber {} {interact -nobuffer -re "(. *) \" vrne postavlja $ log "[časovni format [ura sekund]]: izbrani $ interact_out (1, niz)"} interaktivni -nabuder "atd" log

Med interakcijo se prejšnja uporaba log_user ne upošteva. Zlasti interakcija bo prisilila, da se njegova proizvodnja zabeleži (pošlje na standardni izhod), saj se domneva, da uporabnik ne želi slepo sodelovati.

Zastava -o povzroči, da se na izhod v trenutnem procesu uporabijo naslednji pari ključnih teles. To je lahko koristno, na primer pri ravnanju z gostitelji, ki pošiljajo nezaželene znake med telnetno sejo.

Privzeto interaktivno pričakuje, da bo uporabnik pisal stdin in bral stdout procesa samega Expect . Zastava -u (za uporabnika) omogoča interaktivni videz uporabnika kot proces, imenovan po njegovem argumentu (ki mora biti ID, ki se sprosti).

To omogoča povezovanje dveh nepovezanih procesov brez uporabe eksplicitne zanke. Za pomoč pri odpravljanju napak, Pričakujte diagnostiko vedno pojdite na stderr (ali stdout za določene podatke o beleženju in razhroščevanju). Iz istega razloga bo ukaz interpreter interaktivno prebral iz stdin.

Na primer naslednji fragment ustvari prijavni postopek . Potem pokliče uporabnika (ni prikazano) in na koncu poveže skupaj. Seveda lahko vsak postopek zamenjamo za prijavo. Lupina, na primer, bi omogočila uporabniku, da dela brez napajanja računa in gesla.

spawn login login login $ spawn_id spawn tip modem # dial back to user # povezava uporabnika za prijavo interaktiven -u $ login

Če želite poslati izpis v več procesov, navedite seznam vseh seznamov za spawn, ki jim je postavljena zastava -output . Vnos za skupino izhodnih ID-jev se lahko določi z ID-jem za spawn, predaleč z zastavico -input . (Oba -input in -output lahko sestavita seznamov v isti obliki kot zastavo -i v pričakovanem ukazu, razen da noben_spawn_id ni pomemben za interakcijo .) Vse naslednje zastavice in nizi (ali vzorci) veljajo za ta vnos do drugega - prikaže se vhodna zastavica. Če se ne prikaže noben -input, -output pomeni "-input $ user_spawn_id -output". (Podobno, z vzorci, ki nimajo -input .) Če je določen ena -input, preglasi $ user_spawn_id. Če je podan drugi -input, preglasi $ spawn_id. Lahko se navedejo dodatne -inputne zastavice.

Oba implicitna vhodna postopka sta privzeta, da imajo njihove izhode podano kot $ spawn_id in $ user_spawn_id (v obratnem vrstnem redu). Če se prikaže zastavica -input brez zastave -output , se znaki iz tega postopka zavržejo.

Zastava -i vnese zamenjavo za trenutni spawn_id, če ni uporabljena nobena druga -inputna ali -outputna zastavica. Zastava A-i pomeni oznako -o.

Procese, s katerimi se interakcijo, je mogoče spremeniti z uporabo posrednih idr. (Indirektne ID-jeve za spawn so opisane v odseku o pričakovanem ukazu.) Indirektne ID-je za spawn se lahko določijo z oznakami -i, -u, -input ali -output.

tolmač [args]
povzroči, da je uporabnik interaktivno pozvan za ukaze Expect in Tcl. Rezultat vsakega ukaza je natisnjen.

Ukrepi, kot so prekinitev in nadaljevanje, povzročijo, da se obnašajo kontrolne strukture (npr. Za , proc ) na običajen način. Vendar vrnitev povzroči, da se tolmač vrne svojemu klicatelju, medtem ko inter_return povzroči, da tolmač povzroči vrnitev v svojem klicatelju. Na primer, če bi "proc foo" pozval tolmač, ki je nato izvedel dejanje inter_return , bi se proc foo vrnil. Vsak drug ukaz povzroči, da tolmač nadaljuje z zahtevo po novih ukazih.

Privzeto ima poziv dva cela števila. Prvo celo število opisuje globino ocenjevalnega sklada (tj. Kolikokrat je bilo klicanega Tcl_Eval). Drugo celo število je identifikator zgodovine Tcl. Poziv lahko nastavite tako, da določite postopek, imenovan "prompt1", katerega povratna vrednost postane naslednji poziv. Če ima izjava odprtih ponudb, parensov, oklepaj ali oklepajev, se na novo linijo izda sekundarni poziv (privzeto "+>"). Sekundni poziv se lahko nastavi tako, da se definira postopek, imenovan "poziv2".

Med tolmačem se uporablja kuhani način, tudi če je njegov klicatelj uporabljal surovi način.

Če je stdin zaprt, se bo tolmač vrnil, če ne bo uporabljena zastavica -eof , v tem primeru se uporabi poznejši argument.

log_file [args] [[-a] datoteka]
Če je podano ime datoteke, bo log_file v datoteki zapisal prepis seje (ki se začne na tej točki). log_file bo prenehal snemati, če ni podan noben argument. Vsaka prejšnja datoteka dnevnika je zaprta.

Namesto imena datoteke se lahko z oznakami -open ali -leaveopen zagotovi identifikacija datoteke Tcl. To je podobno ukazu za drstenje . (Za več informacij glejte spawn .)

Za zastavitev -a zastavi izhod za zapis, ki je bil z ukazom log_user potisnjen .

Po privzetku se ukaz log_file prijavi starejšim datotekam, namesto da jih skrajša, da bi se lahko počutili in večkrat v eni seji. Če želite skrajšati datoteke, uporabite oznako -noappend .

Zastava -info povzroči log_file, da vrne opis najnovejših nedodelanih argumentov.

log_user -info | 0 | 1
Privzeto je dialog za pošiljanje / pričakovanje prijavljen v stdout (in logfile, če je odprt). Logging to stdout je onemogočen z ukazom "log_user 0" in ga je ponovno omogočil z "log_user 1". Prijava v log datoteko je nespremenjena.

Zastava -info povzroči log_user, da vrne opis najnovejših nedodeljenih argumentov.

match_max [-d] [-i spawn_id] [velikost]
definira velikost vmesnega pomnilnika (v bajtih), ki jo interno pričakujejo . Brez argumenta velikosti se vrne trenutna velikost.

Z zastavico -d je nastavljena privzeta velikost. (Začetna privzeta vrednost je 2000.) Z zastavico -i je velikost nastavljena za imenovani ID za drstenje, sicer je nastavljen za trenutni postopek .

prekrivni element [- # spawn_id] [- # spawn_id] [...] program [args]
izvede " argumente programa " namesto trenutnega programa Expect , ki se zaključi. Goli trinajst argument povzroči vezaj pred ukaznim imenom, kot če bi bil prijavna lupina. Vsi spawn_ids so zaprti, razen tistih, ki so imenovani kot argumenti. Ti so mapirani na imenovanih identifikatorjev datotek.

Spawn_ids so preslikani v identifikatorje datotek za nov program, ki ga je mogoče podedovati. Na primer, naslednja vrstica izvaja šah in omogoča, da jo nadzira trenutni proces - recimo šahovski mojster.

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

To je bolj učinkovito kot "interaktivno -u", vendar žrtvuje sposobnost za programirano interakcijo, saj proces Expect ni več pod nadzorom.

Upoštevajte, da noben krmilni terminal ni na voljo. Če prekinete ali odstranite standardni vhod, programi, ki opravljajo nadzor opravil (lupine, prijava itd.), Ne bodo pravilno delovali.

pariteta [-d] [-i spawn_id] [vrednost]
določa, ali je treba pariteto ohraniti ali odstraniti iz proizvodnje pridobljenih procesov. Če je vrednost enaka nič, se enakomernost odstrani, sicer se ne odstrani. Brez argumenta vrednosti se vrne trenutna vrednost.

Z zastavico -d je nastavljena privzeta vrednost. (Začetna privzeta vrednost je 1, to pomeni, da se pariteta ne odstrani.) Z zastavico -i je vrednost za paritetno vrednost nastavljena za imenovani ID zarodja, drugače pa je nastavljen za trenutni postopek .

remove_nulls [-d] [-i spawn_id] [vrednost]
definira, ali se nuli ohranijo ali odstranijo iz proizvodnje razvitih procesov pred ujemanjem vzorca ali shranjevanjem v spremenljivki expect_out ali interact_out . Če je vrednost 1, se odstranijo ničli. Če je vrednost 0, se ničle ne odstranijo. Brez argumenta vrednosti se vrne trenutna vrednost.

Z zastavico -d je nastavljena privzeta vrednost. (Začetna privzeta vrednost je 1, to pomeni, da so ničli odstranjeni.) Z zastavico -i je vrednost nastavljena za imenovani ID zarodja, sicer je nastavljen za trenutni postopek .

Ne glede na to, ali so odstranjeni ničli, bo Expect snemal nične bajte v dnevnik in stdout.

pošlji [-flags] niz
Pošlje niz v trenutni postopek . Na primer ukaz

pošlji "hello world \ r"

pošilja znake, helloworld v trenutni proces . (Tcl vsebuje tiskf- podoben ukaz (imenovan format ), ki lahko gradi poljubno zapletene nize.)

Znaki se pošljejo takoj, čeprav programi z vhodom s črtno kodo ne preberejo znakov, dokler se ne pošlje povratni znak. Povratni znak je označen kot "\ r".

Zastava - prisili naslednji argument, da se razlaga kot niz, ne pa zastava. Vsak niz lahko pred "-" ne glede na to, ali je dejansko videti kot zastava ali ne. To zagotavlja zanesljiv mehanizem za določitev spremenljivih nizov, ne da bi jih onesposobili tisti, ki naključno izgledajo kot zastavice. (Vsi nizi, ki se začnejo z "-", so rezervirani za prihodnje možnosti.)

Zastava -i izjavi, da se niz pošlje v imenovanem spawn_id. Če je spawn_id user_spawn_id in terminal je v surovem načinu, so novi vrstici v nizu prevedeni v zaporedja v novo vrsto, tako da se pojavijo, kot da bi bil terminal v načinu kuhanja. Zastava -raw onemogoči ta prevod.

-null zastava pošilja nične znake (0 bajtov). Privzeto se pošlje en nič. Celotno število lahko sledi -null, da se navede, koliko nulls za pošiljanje.

Zastoj -break ustvari stanje počitka. To je smiselno samo, če se id potresa nanaša na tty napravo, odprto prek "spawn -open". Če ste ustvarili postopek , kot je tip, morate uporabiti konvencijo konice za ustvarjanje odmora.

Zastavica -s zapolnjuje izhod, ki se pošlje "počasi", s čimer se izognemo pogostemu položaju, ko računalnik izstopi iz vhodnega medpomnilnika, ki je bil zasnovan za človeka, ki nikoli ne bo istega vmesnika . Ta izhod je pod nadzorom vrednosti spremenljivke "send_slow", ki vsebuje dva elementa. Prvi element je celo število, ki opisuje število bajtov za atomsko pošiljanje. Drugi element je dejansko število, ki opisuje število sekund, od katerih morajo biti atomske pošiljke ločene. Na primer, "nastavljeni send_slow {10 .001}" bi prisilil "poslati-e-pošte" za pošiljanje nizov z 1 milisekundo med 10-imi poslanimi znaki.

Zastavica -h zajema pošiljanje (nekoliko) kot dejansko tipkanje človeka. Med znaki se pojavijo človeške zamude. (Algoritem temelji na porazdelitvi Weibull, z modifikacijami, ki ustrezajo tej posebni aplikaciji.) Ta izhod je pod nadzorom vrednosti spremenljivke "send_human", ki vsebuje seznam petih elementov. Prvi dve elementi sta povprečni čas vkrivljanja znakov v sekundah. Prvi je privzeto uporabljen. Druga se uporablja pri besednih končnicah, da simulira subtilne premore, ki se občasno pojavijo pri takih prehodih. Tretji parameter je merilo spremenljivosti, kjer je 1 precej spremenljiv, 1 je razumno spremenljiv in 10 je precej nespremenljiv. Skrajnosti so 0 do neskončnosti. Zadnja dva parametra sta najmanjša in največja časovna intervala. Zadnji in zadnje čase sta "najmanjša in največja", zadnji čas pa "posnet". Končno povprečje se lahko precej razlikuje od danega povprečja, če sta najmanjša in največja posnetka dovolj vredna.

Na primer, naslednji ukaz emulira hitro in dosledno tipkalo:

nastavi send_human {.1 .3 1 .05 2} pošlji -h "Lačen sem, a kosimo."

medtem ko so po mačkah morda bolj primerni:

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

Upoštevajte, da napake niso simulirane, čeprav lahko sami nastavite stanje popravljanja napak z vdelovanjem napak in popravkov v argument za pošiljanje.

Zastave za pošiljanje ničelnih znakov, pošiljanje odmori, za sprožanje počasnega izhoda in za človeški slog se medsebojno izključujejo. Uporabi se le tisti, ki ste ga nazadnje določili. Poleg tega ni mogoče določiti nobenega argumenta niza z zastavami za pošiljanje ničelnih znakov ali prekinitev.

Dobro je, da pred prvim pošiljanjem v proces pričakujemo . pričakujejo, da bodo počakali, da se postopek začne, medtem ko pošiljanje ne more. Še posebej, če se prvo pošiljanje konča, preden se postopek začne izvajati, tvegate, da bi bili podatki prezrti. V primerih, ko interaktivni programi ne ponujajo začetnega poziva, lahko pred pošiljanjem pošljete zamudo tako:

# Da bi se izognili dajanju hekerjev namigov o tem, kako vdreti, # ta sistem ne zahteva zunanjega gesla. # Počakajte 5 sekund za Exec za dokončanje telnet telesa very.secure.gov 5 spanje gesla \ r

exp_send je vzdevek za pošiljanje. Če uporabljate Expectk ali drugo različico možnosti Expect v okolju Tk, ga pošlje Tk za povsem drugačen namen. Za združljivost med okolji je predviden exp_send . Podobni vzdevki so podani tudi za druge ukaze za pošiljanje Expect.

send_error [-flags] niz
je kot pošiljanje , le da se izhod pošlje stderr namesto trenutnemu procesu .

send_log [-] niz
je kot pošiljanje , le da se niz pošilja le v datoteko dnevnika (glej log_file .) Argumenti so prezrti, če nobena datoteka dnevnika ni odprta.

send_tty [-flags] niz
je kot pošiljanje , le da se izhod pošlje v / dev / tty in ne na trenutni postopek .

send_user [-flags] niz
je kot pošiljanje , le da se izhod pošlje v stdout namesto v trenutni postopek .

spanje sekund
povzroči, da scenarij spi za določeno število sekund. Sekunde so lahko decimalna števila. Prekinitve (in dogodki Tk, če uporabljate Expectk) se obdelajo, medtem ko pričakujete spanje.

spawn [args] program [args]
ustvari nov proces z zagonom "programskih argumentov". Njegova stdin, stdout in stderr sta povezana z Expect, tako da jih berejo in zapisujejo drugi ukazi Expect . Povezava je prekinjena, ali če sam proces zapre katerikoli identifikator datoteke.

Ko se postopek sproži s sproščanjem , je spremenljivka spawn_id nastavljena na deskriptor, ki se nanaša na ta proces . Postopek, ki ga opisuje spawn_id, se šteje za "trenutni proces ". spawn_id je mogoče brati ali pisati, kar dejansko zagotavlja nadzor dela.

user_spawn_id je globalna spremenljivka, ki vsebuje deskriptor, ki se nanaša na uporabnika. Na primer, ko je spawn_id nastavljen na to vrednost, pričakujemo , da se obnaša kot pričakujete .

.I error_spawn_id je globalna spremenljivka, ki vsebuje deskriptor, ki se nanaša na standardno napako. Na primer, ko je spawn_id nastavljen na to vrednost, pošljite obnašanja kot send_error .

tty_spawn_id je globalna spremenljivka, ki vsebuje deskriptor, ki se nanaša na / dev / tty. Če / dev / tty ne obstaja (na primer v cron, at, ali serijski skripti), potem tty_spawn_id ni definiran. To se lahko preskusi kot:

če {{# / dev / tty exists} else {# / dev / tty ne obstaja # verjetno v cronu, seriji ali pri skriptu}

spawn vrne id ID procesa . Če ni nobenega postopka , se vrne 0. Spremenljivka spawn_out (slave, ime) je nastavljena na ime pomožne naprave pty.

Privzeto se drstijo odmeva ime in argumenti. Zastava -oecho preneha s tem.

Ozadje -console povzroči, da se izhod konzole preusmeri na pridobljeni proces . To ni podprto na vseh sistemih.

Interno, drstenje uporablja pty, inicializirano na enak način kot uporabnik tty. To se še inicializira tako, da so vse nastavitve "enostavne" (v skladu s stty (1)). Če je spremenljivka stty_init definirana, se v slogu stty argumentov razlaga kot nadaljnja konfiguracija. Na primer, "nastavi stty_init raw", bo povzročil, da se bodo terminali drugih pridobljenih procesov začeli v surovem načinu. -nottycopy preskoči inicializacijo na osnovi uporabnika tty. - ne prekliče " inicirane " inicializacije.

Običajno se ustvari malo časa za izvedbo. Če opazite, da se drstijo veliko časa, se verjetno srečujete s ptys, ki so zaprte. Številni testi se izvajajo na ptys, da bi se izognili zapletom z napačnimi procesi. (To traja 10 sekund na zapleten pty.) Z možnostjo Running Expect z možnostjo -d se prikaže, če se pri Expectu srečujejo številne ptys v lihih stanju. Če ne morete ubiti procesov, na katere so priključeni ti ptys, se lahko zgodi samo, da se ponovno zagnati.

Če programa ni uspelo uspešno ustvariti, ker je exec (2) neuspešna (npr. Ko program ne obstaja), bo sporočilo o napaki vrnil naslednji ukaz za interaktivno ali pričakovanje, kot da bi program zaženel in priredil sporočilo o napaki kot izhod. To vedenje je naravna posledica izvajanja drstenja . V notranjosti se pojavljajo vilice, po katerih pridelani proces nima nobenega načina komuniciranja z izvirnim procesom Expect , razen s komunikacijo prek spawn_id.

Zgornja zastavica povzroči, da se naslednji argument razlaga kot identifikator datoteke Tcl (tj. Vrnjen z odprtim .) ID se lahko uporabi, kot da bi bil sproščen proces . (Identifikator datoteke ne bi smel več uporabljati.) To vam omogoča obdelavo surovih naprav, datotek in plinovoda kot ustvarjenih procesov brez uporabe pty. 0 se vrne, da označite, da ni povezanega postopka . Ko je povezava z ustvarjenim procesom zaprta, je tudi identifikator datoteke Tcl. Zastava -leaveopen je podobna kot -open, razen da -leaveopen povzroči, da se identifikator datoteke pusti odprt, tudi potem, ko je ID zaprta.

Poda, ki je prazna, povzroči, da se pty odpre, vendar ni nobenega procesa . 0 se vrne, da označite, da ni povezanega postopka . Spawn_id je nastavljen kot običajno.

Spremenljivka spawn_out (slave, fd) je nastavljena na identifikator datoteke, ki ustreza pty slavi. Lahko ga zapremo z uporabo "blizu -slave".

Zastava -igreka označuje signal, ki ga je treba prezreti v ustvarjenem procesu . V nasprotnem primeru signali dobijo privzeto obnašanje. Signali so imenovani kot v ukazu trap , le da vsak signal zahteva ločeno zastavo.

strace ravni
povzroči naslednje izjave, ki bodo natisnjene pred izvedbo. (Tcl-ov sledi ukazov za sledenje ukazov sledi.) Kaže, kako daleč v sledovih klicev sledijo. Na primer, medtem ko sledi prvim štirim nivojem klicev, se prične naslednji ukaz Expect , vendar nobeden pod tem.

pričakujte -c "strace 4" scenarij.exp

Zastava -info povzroči strace, da vrne opis najnovejših ne-info argumentov.

stty args
spremeni načine terminala podobno kot zunanji ukaz stty.

Privzeto je dostopen krmilni terminal. Do drugih terminalov se lahko dostopa z dodajanjem "Zahteve za status vrnejo kot rezultat ukaza. Če ni zahtevan noben status in dostop do krmilnega terminala, se prejšnji status surovin in atributov echo vrne v obliki, ki je lahko pozneje ki ga uporablja ukaz.

Na primer, argumenti surovi ali zaseženi , terminal postavite v surovi način. Argumenti, pripravljeni ali pripravljeni, postavite terminal v kuhani način. Argumenti echo in -echo postavijo terminal v echo in noecho način.

Naslednji primer ponazarja, kako začasno onemogočiti odmev. To bi bilo mogoče uporabiti v drugačnih samodejnih skriptah, da bi se izognili vnašanju gesel v njih. (Glejte več razprav o tem pod EXPECT HINTS spodaj.)

stty -echo send_user "Geslo:" pričakujte_user -re "(. *) \ n" nastavite geslo $ expect_out (1, string) stty echo

sistemski argumenti
daje argumente sh (1) kot vhod, tako kot če bi ga vnesli kot ukaz iz terminala. Pričakuje, da bo lupina končala. Stanje vrnitve iz sh se ravna na enak način, da izvrševalnik opravi vrnitev statusa.

V nasprotju z exec, ki preusmerja stdin in stdout v skript, sistem ne izvaja preusmeritve (razen tistega, ki ga označuje sam niz). Tako je mogoče uporabljati programe, ki morajo govoriti neposredno na / dev / tty. Iz istega razloga rezultati sistema niso zabeleženi v dnevniku.

časovni žig [args]
vrne časovni žig. Brez argumentov je število sekund po vrnitvi epohe.

Zastava -format uvaja vrvico, ki se vrne, vendar s substitucijami, izdelanimi po pravilih POSIX za strftime. Na primer% a nadomesti skrajšano ime dneva v tednu (npr. Sat). Drugi so:

% skrajšano ime dneva v tednu% Celotno ime dneva v tednu% b skrajšano ime meseca% B polno ime meseca% c datum vpisa v: sreda oktober 11:45:56 1993% d dan v mesecu (01-31% H ura (00-23)% I ura (01-12)% j dan (001-366)% m mesec (01-12)% M minuto (00-59)% p am ali pm% S sekundo (00-61) % u dan (1-7, ponedeljek je prvi dan v tednu)% U teden (00-53, prva nedelja je prvi dan v prvem tednu)% V teden (01-53, slog ISO 8601)% w dan (0- 6)% W teden (00-53, prvi ponedeljek je prvi dan v prvem tednu)% x datum-čas kot v: 6. okt. 1993% X čas kot v: 23:59:59% y leto (00-99) % Y leto kot v: 1993% Z časovni pas (ali nič, če ni določljiv) %% znak za odstotek

Druge% specifikacij so nedefinirane. Drugi znaki bodo prešli skozi nedotaknjene. Podpira samo lokacijo C.

Zastava -seconds uvaja število sekund odkar je epoha uporabljena kot vir, iz katerega lahko formatirate. V nasprotnem primeru se uporablja trenutni čas.

Zastava -gmt sili časovni žig za uporabo časovnega pasu GMT . Brez zastave se uporablja lokalni časovni pas.

trap [[ukaz] signali]
povzroči, da se ukaz izvede ob prihodnjem prejemu katerega koli od danih signalov. Ukaz je izveden v globalnem obsegu. Če je ukaz odsoten, se vrne signalno dejanje. Če je ukaz niz SIG_IGN, se signali prezrejo. Če je ukaz niz SIG_DFL, so signali posledica privzetega sistema. signali so en sam signal ali seznam signalov. Signali se lahko numerično ali simbolično določijo glede na signal (3). Predpono »SIG« se lahko izpusti.

Brez argumentov (ali argument -number), trap vrne številko signala ukaza, ki se trenutno izvaja.

Zastavica -code uporablja povratno kodo ukaza namesto katere koli kode, ki bi jo Tcl kmalu vrnil, ko se je ukaz prvotno začel prikazovati.

Označba -interp povzroči, da se ukaz oceni s pomočjo tolmača, ki je bil aktiven v času, ko je ukaz začel teči, kot pa, ko je bil poraz objavljen.

Oznaka -name povzroči, da ukaz za vrenje vrne ime signala ukaza za past, ki se trenutno izvaja.

Oznaka -max povzroči, da ukaz za vrenje vrne največjo številko signala, ki jo je mogoče nastaviti.

Na primer, ukaz "trap {send_user" Ouch! "} SIGINT" natisne "Ouch!" vsakič, ko uporabnik pritisne ^ C.

Privzeto je SIGINT (ki se običajno lahko generira s pritiskom na tipko ^ C) in SIGTERM povzroči pričakovanje izhoda. To je posledica naslednjega pasta, ki je privzeto nastal, ko se začne pričakovati.

izhod iz pasta {SIGINT SIGTERM}

Če za zagon razhroščevalnika uporabite zastavico -D, se SIGINT ponovno definira, da zaženete interaktivni odjemalec. To je posledica naslednjega past:

past {exp_debug 1} SIGINT

Zamenjavo za odpravljanje napak lahko spremenite tako, da spremenljivko EXPECT_DEBUG_INIT spremenite v nov ukaz za past.

Seveda lahko prekličete oba le tako, da dodate ukaze za past v svoj skript. Še posebej, če imate svoj lasten "izstopni trak SIGINT", bo to preglasilo zajemalko za odpravljanje napak. To je uporabno, če želite preprečiti uporabnikom, da sploh ne pridejo do razhroščevalnika.

Če želite na SIGINT določiti svojo lastno past, vendar pa še vedno naletite na razhroščevalnik, ko teče, uporabite:

če je {! [exp_debug]} {trap mystuff SIGINT}

Druga možnost je, da lahko uporabite še kakšen drug signal.

pasti vam ne omogočajo, da preglasite dejanje za SIGALRM, ker se to uporablja interno, da pričakujete . Ukaz za prekinitev nastavi SIGALRM na SIG_IGN (prezreti). To lahko obnovite, dokler ga onemogočite med naslednjimi ukazi za drstenje.

Oglejte si signal (3) za več informacij.

čakati [args]
zamude, dokler se ne sproži postopek (ali trenutni postopek, če ni imenovan) se prekine.

počakajte normalno vrne seznam štirih celih števil. Prvo celo število je pid procesa, ki ga je čakal. Drugo celo število je ustrezni idr. Tretje celo število je -1, če je prišlo do napake operacijskega sistema ali 0 v nasprotnem primeru. Če je tretje celo število 0, je četrto celo število status, ki ga vrne prideljeni postopek . Če je tretje celo število -1, je četrto celo število vrednost errno, ki jo je določil operacijski sistem. Prav tako je nastavljena globalna spremenljivka errorCode.

Dodatni elementi se lahko pojavijo na koncu povratne vrednosti od čakanja . Izbirni peti element opredeljuje vrsto informacij. Trenutno je edina možna vrednost za ta element CHILDKILLED, v tem primeru sta naslednji dve vrednosti ime in ime kratkega besedila.

Zastava -i razglasi proces, da počaka ustreza imenovanemu spawn_id (NE ID-ja procesa ). V orodju SIGCHLD je mogoče počakati na kakršen koli drstni proces z uporabo drevesnega id--1.

Če neveljavna zastava povzroči čakanje, da se takoj vrne z navedbo uspešnega čakanja. Ko proces zapusti (kasneje), bo samodejno izginil brez potrebe po eksplicitnem čakanju.

Ukaz za čakanje lahko uporabite tudi pri počakajočem postopku s pomočjo argumentov "-i -1". Za razliko od njene uporabe z ustvarjenimi procesi, lahko ta ukaz kadar koli izvedete. Noben nadzor nad tem procesom ni. Vendar pa je mogoče povratno vrednost preveriti za identifikacijo procesa .

BIBLIOTEKE

Pričakuje, da samodejno ve za dve vgrajeni knjižnici za Expect skripte. Te jih definirajo imeniki, imenovani v spremenljivkah exp_library in exp_exec_library. Oba naj bi vsebovala pripomočke, ki jih lahko uporabljajo drugi skripti.

exp_library vsebuje datoteke, neodvisne od arhitekture. exp_exec_library vsebuje datoteke, odvisne od arhitekture. Obe imeniki sta lahko popolnoma prazni, odvisno od vašega sistema. Obstoj datoteke $ exp_exec_library / cat-buffers opisuje, ali vaš / bin / cat privzeto dopolnjuje.

PRETTY-PRINTING

Opredelitev vgrind je na voljo za precej tiskanje Expect skripte. Ob predpostavki, da je definicija vgrind, ki je priložena distribuciji Expect , pravilno nameščena, jo lahko uporabite kot:

vgrind -slebrna datoteka

PRIMERI

Mnogim ni jasno, kako bi vse skupaj združili, kar opisuje moški stran. Priporočam, da preberete in preizkusite primere v primernem imeniku distribucije Expect . Nekateri od njih so pravi programi. Drugi preprosto ilustrirajo določene tehnike, seveda pa je nekaj samo hacks. Datoteka INSTALL ima hiter pregled teh programov.

Koristni so tudi dokumenti Expect (glej tudi GLEJ TUDI). Medtem ko nekateri dokumenti uporabljajo sintakso, ki ustreza prejšnjim različicam Expect, so priložene obrazložitve še vedno veljavne in preidejo v veliko več podrobnosti kot ta stran s strani.

PREKLICI

Razširitve se lahko srečujejo z ukaznimi imeni Expect. Na primer, pošljete Tk za povsem drugačen namen. Iz tega razloga je večina ukazov Expect na voljo tudi kot »exp_XXXX«. Ukazi in spremenljivke, ki se začnejo z "exp", "inter", "spawn" in "timeout", nimajo vzdevkov. Če potrebujete to združljivost med okolji, uporabite razširjena imena ukazov.

Pričakuje precej liberalen pogled na obseg. Zlasti bodo spremenljivke, ki jih berejo ukazi, specifični za program Expect, najprej iskali iz lokalnega obsega in, če jih ne bodo našli, v globalnem obsegu. Na primer, to preprečuje, da bi morali v vsakem postopku, ki ga napišete, uporabiti "globalno časovno zakasnitev". Po drugi strani so napisane spremenljivke vedno v lokalnem obsegu (razen če je bil izdan "globalni" ukaz). Najpogostejša težava, ki jo povzroči, je, če se začne postopek v postopku. Zunaj postopka spawn_id ne obstaja več, zato pridelani postopek ni več dostopen samo zaradi obsega. V tak postopek dodajte "globalni spawn_id".

Če ne morete omogočiti zmožnosti multispawning (to pomeni, da vaš sistem ne podpira nobenega izbora (BSD *. *), Ankete (SVR> 2) in nič enakovrednega), bo Expect lahko nadziral samo en proces naenkrat. V tem primeru ne poskušajte nastaviti spawn_id , niti ne bi smeli izvajati procesov prek exec, medtem ko se sproži proces, ki se sproži. Poleg tega ne boste mogli pričakovati od več procesov (vključno z uporabnikom kot enim) hkrati.

Terminalski parametri imajo lahko velik vpliv na skripte. Na primer, če je scenarij napisan, da bi iskal odmev, se bo zmotil, če je oddajanje izklopljeno. Iz tega razloga privzeto nastavite sile parametre terminala. Na žalost lahko to naredi neprijetne za druge programe. Kot primer, lupina emacsa želi spremeniti "običajne" preslikave: nove črte se preslikajo na nove vrstice, namesto na novice za vrnitev v voziček, odmevanje pa je onemogočeno. To omogoča, da uporabite emac za urejanje vhodne linije. Na žalost to ne more verjeti.

Lahko zahtevate, da pričakujete, da ne bo preglasila svoje privzete nastavitve parametrov terminala, vendar morate biti pozorni pri pisanju skriptov za takšna okolja. V primeru emacov se izogibajte, odvisno od stvari, kot so odmevne in končne linije preslikav.

Komande, ki so sprejele argumente, združene v en sam seznam ( pričakovane variante in interakcijo ), uporabijo hevristično, da se odločijo, ali je seznam dejansko en argument ali mnogi. Hevizem lahko izpade samo v primeru, ko seznam dejansko predstavlja en argument, ki ima več vdelanih \ n s ne-presledkih znakov med njimi. To se zdi dovolj nemogoče, vendar se lahko argument »-nobrej« uporabi, da se posamezen argument obravnava kot en argument. To bi bilo mogoče uporabiti s strojno ustvarjeno kodo Expect. Podobno, -brace prisili enoten argument, ki ga je treba obravnavati kot več vzorcev / dejanj.

BUGS

Bilo je zelo vabljivo, da imenujemo program "sex" (za "Smart EXec" ali "Send-Expect"), vendar je prevladal dober občutek (ali morda samo puritanstvo).

V nekaterih sistemih, ko se lupina sprosti, se pritožuje, ker ni mogla dostopati do tty, ampak vseeno teče. To pomeni, da ima vaš sistem mehanizem za pridobitev kontrolnega tty, za katerega Expect ne pozna. Preverite, kaj je, in mi pošljite te podatke nazaj.

Ultrix 4.1 (vsaj najnovejše različice tukaj) meni, da so časovne omejitve nad 1000000 enakovredne 0.

Digital UNIX 4.0A (in verjetno tudi druge različice) zavrača dodeljevanje ptys, če določite vodnik SIGCHLD. Za več informacij glejte stran za dodelitev.

IRIX 6.0 ne ravna pravilno z dovoljenji za pty, tako da če Expect poskuša dodeliti pty, ki jo je prej uporabljal nekdo drug, ne uspe. Nadgradite na IRIX 6.1.

Telnet (preverjen samo pod SunOS 4.1.2) se obesi, če TERM ni nastavljen. To je težava pod cron, na in v cgi skriptih, ki ne opredeljujejo TERM. Tako morate izrecno določiti - katera vrsta je ponavadi nepomembna. Treba je samo nastaviti na nekaj! V večini primerov verjetno zadošča naslednje.

nastavi env (TERM) vt100

Nasvet (preverjen samo pod BSD / OS 3.1 i386) se obesi, če SHELL in HOME niso nastavljeni. To je težava pod cron , na in v cgi skriptih, ki ne opredeljujejo teh spremenljivk okolja. Zato jih morate izrecno določiti - do katere vrste je običajno nepomembno. Treba je samo nastaviti na nekaj! V večini primerov verjetno zadošča naslednje.

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

Nekatera implementacija ptys je zasnovana tako, da jedro odvrne vse nepročitane rezultate po 10 do 15 sekundah (dejansko število je odvisno od izvajanja), potem ko je proces zaprl opisovalnik datoteke. Tako pričakujte programe, kot so

spawn datum spanja 20 pričakujejo

bo propadel. Da bi se temu izognili, se ne-interaktivni programi sklicujejo z ekscem, ne pa z drsti . Čeprav so takšne razmere možne, v praksi nisem naletel na situacijo, v kateri bi se zaradi tega vedenja izgubil končni rezultat resnično interaktivnega programa.

Po drugi strani pa Cray UNICOS ptys vrne vse neprebrane izhode takoj po tem, ko je postopek zaprl opisovalnik datoteke. To sem poročal Crayu in delajo na popravku.

Včasih je potrebna zamuda med pozivom in odzivom, na primer, ko tty vmesnik spreminja nastavitve UART ali ujema z baudami, tako da išče začetne / zaustavitvene bitove. Običajno je vse to potrebno za spanje za drugo ali dve. Bolj robustna tehnika je ponoviti, dokler strojna oprema ni pripravljena za sprejemanje vhodnih podatkov. Naslednji primer uporablja obe strategiji:

pošlji "hitrost 9600 \ r"; spanje 1 pričakujte {timeout {send "\ r"; exp_continue} $ poziv}

trap -code ne bo deloval z nobenim ukazom, ki sedi v zanki Tcl, kot je spanje. Težava je, da v zanki dogodka Tcl zavrže povratne kode iz obdelovalcev dogodkov asinca. Rešitev je, da nastavite zastavo v kodi za vleko. Nato preverite zastavo takoj po ukazu (tj. Spanju).

Ukaz expect_background prezrla -timeout argumente in nima koncepta časovnih omejitev na splošno.

& # 34; PRIČAKOVANI POSTAVKI & # 34;

Obstaja nekaj stvari o pričakovanju, ki morda niso intuitivne. Ta razdelek poskuša obravnavati nekatere od teh stvari z nekaj predlogi.

Skupna pričakovana težava je prepoznavanje navodil za ukazne lupine. Ker jih različno uporabljajo različni ljudje in različne lupine, je lahko prenosno avtomatiziranje rlogina težko brez vednosti. Razumna konvencija je, da imajo uporabniki v spremenljivki okolja EXPECT_PROMPT shranjevanje regularnega izraza, ki opisuje njihov poziv (zlasti konec). Lahko uporabite kodo, kot je naslednja. Če EXPECT_PROMPT ne obstaja, ima koda še vedno dobre možnosti za pravilno delovanje.

nastavite poziv "(% | # | \\ $) $"; # privzeti promptni poziv {nastavi prompt $ env (EXPECT_PROMPT)} pričakaj -re $

Spodbujam vas, da napišete vzorce pričakovanj, ki vključujejo konec, kar pričakujete. To preprečuje možnost odgovora na vprašanje, preden si ogledate celotno stvar. Poleg tega, če boste morda lahko odgovorili na vprašanja, preden jih boste v celoti videli, če se boste zgodaj odzvali, se vaš odgovor morda odzove na sredino vprašanja. Z drugimi besedami, dobljeni dialog bo pravilen, vendar bo videti premešan.

Večina pozivov vključuje znak za vesolje na koncu. Na primer, poziv od ftp je "f", "t", "p", ">" in. Če želite ujemati ta poziv, morate upoštevati vsakega od teh znakov. Pogosta napaka je, da ne vključimo praznega. Postavite prazno v izrecno.

Če uporabljate vzorec obrazca X *, se bo * ujemal z vsemi izhodi, prejetimi od konca X do zadnje prejete stvari. To zveni intuitivno, vendar je lahko nekoliko zmedeno, ker se lahko besedna zveza "zadnja stvar" razlikuje glede na hitrost računalnika in obdelavo vhodno-izhodne naprave tako z jedrom kot gonilnikom naprave.

Ljudje pogosto vidijo, da programski izhod prihaja v ogromne koščke (atomsko), ko v resnici večina programov proizvaja izhodno linijo hkrati. Ob predpostavki, da je to tako, se lahko * v vzorcu prejšnjega odstavka lahko ujema le s koncem trenutne vrstice, čeprav se zdi, da je več, ker v času tekme, ki je bil ves prejetek.

Pričakujte, ne morete vedeti, da pride prihodnja proizvodnja, razen če vaš vzorec posebej navaja.

Tudi v odvisnosti od linijsko usmerjenega pufra ni smiselno. Ne samo, da programi redko dajejo obljube o vrsti pufra, ki ga naredijo, vendar sistemsko prebavo lahko prekine izhodne linije, tako da se vrstice zlomijo na navidezno naključnih mestih. Tako, če lahko pri pisanju vzorcev izrazite zadnjih nekaj znakov odziva, je to pametno storiti.

Če čakate na vzorec v zadnjem izhodu programa in program oddaja nekaj drugega, ga ne boste mogli zaznati s časovno omejitvijo ključne besede. Razlog je, da pričakovanje ne bo prekinilo - namesto tega bo dobil eof indikacijo. Uporabite to. Še bolje, uporabite obe. Na ta način, če je ta vrstica vedno premaknjena, vam ne bo treba urediti same vrstice.

Nove linije se običajno pretvorijo v vozno vrnitev, zaporedja vrstic, ko jih izstopi gonilnik terminalov. Če torej želite vzorec, ki se izrecno ujema z dvema vrsticama, od, recimo, printf ("foo \ nbar"), uporabite vzorec "foo \ r \ nbar".

Podobno prevajanje se pojavlja pri branju od uporabnika preko pričakovalca . V tem primeru, ko pritisnete na vrnitev, se bo prevedel v novo vrstico. Če Expect nato preide v program, ki postavlja svoj terminal v surovi način (npr. Telnet), bo težava postala problem, saj program pričakuje, da bo vrnjen resničen. (Nekateri programi so dejansko odpuščeni, saj bodo samodejno prevedli nove vrstice v vrnitev, a večina jih ne.) Na žalost ni nobenega načina, da bi ugotovili, da program postavlja svoj terminal v surovi način.

Namesto da bi ročno zamenjali nove vrstice z vračili, je rešitev, da uporabite ukaz "stty raw", ki bo ustavil prevod. Vendar pa to pomeni, da ne boste več dobili kuhanih funkcij za urejanje vrstic.

interaktivno implicitno postavlja vaš terminal v surovi način, da se ta problem ne bo pojavil takrat.

Pogosto je koristno shraniti gesla (ali druge zasebne informacije) v scenariju Expect . To ni priporočljivo, saj je vse, kar je shranjeno v računalniku, dovzetno za dostop do kogar koli. Tako je interaktivno pozivanje k geslom iz scenarija pametnejša ideja, kot pa jih dobesedno vnašate. Kljub temu pa je včasih takšno vdelavo edina možnost.

Na žalost, datotečni sistem UNIX nima neposrednega načina ustvarjanja skript, ki so izvedljivi, vendar neberljivi. Sistemi, ki podpirajo setgidne skripte, lahko posredno simulirajo to, kot sledi:

Ustvarite skript Expect (ki vsebuje skrivne podatke) kot ponavadi. Naj bo dovoljenje 750 (-rwxr-x ---) in je v lasti zaupanja vredne skupine, tj. Skupine, ki jo lahko preberete. Po potrebi ustvarite novo skupino za ta namen. Nato ustvarite skript / bin / sh z dovoljenji 2751 (-rwxr-s - x) v lasti iste skupine kot prej.

Rezultat je scenarij, ki ga lahko kdorkoli izvede (in bere). Ko se sklicuje, zažene scenarij Expect .

& # 34; GLEJ TUDI & # 34;

Tcl (3), libexpect (3)
"Raziskava pričakovanj: orodje za avtomatiziranje interaktivnih programov, ki temelji na Tcl", avtor Don Libes, str. 602, ISBN 1-56592-090-2, O'Reilly in Associates, 1995.
"pričakujte: ozdravitev tistih nenadzorovanih zmožnosti interaktivnosti" Don Libesa, Zbornik poletne konference USENIX leta 1990, Anaheim, Kalifornija, 11. in 15. junij 1990.
.I "Uporaba pričakuje, da avtomatizira naloge sistema za upravljanje sistema", ki ga je izvedel Don Libes zbornik USENIX konferenc za administracijo velikih sistemov namestitev leta 1990, Colorado Springs, Colorado, 17.-19. Oktober 1990.
.I "Tcl: vgrajen jezik za ukaze", John Ousterhout, Zbornik zimskih 1990 USENIX konferenc, Washington, DC, 22. in 26. januarja 1990. I "pričakujejo: skripte za nadzor interaktivnih programov" Don Libes, računalniški sistemi , Vol. 4, št. 2, časopisi za medije v Univerzi v Kaliforniji, november 1991..I "Regresijsko testiranje in preverjanje skladnosti interaktivnih programov", avtor Don Libes, Zbornik poletne konference USENIX leta 1992, str. 135-144, San Antonio, TX, 12.-15. Junij 1992 .. I "Kibitz - povezovanje več interaktivnih programov skupaj", ki ga Don Libes, Software - Practice & Experience, John Wiley & Sons, West Sussex, Anglija, Vol.

23, št. 5, maj, 1993..I "Debugger za aplikacije Tcl", ki ga je izvedel Don Libes, Zbornik Delavnice Tcl / Tk 1993, Berkeley, CA, 10. in 11. junija 1993.

AUTHOR

Don Libes, Nacionalni inštitut za standarde in tehnologijo

PRIZNANJA

Zahvaljujoč John Ousterhout za Tcl in Scott Paisley za navdih. Hvala Rob Savoye za kodo avtokonfiguracije Expect.

Datoteka HISTORY dokumentira veliko evolucije pričakovanj . To je zanimivo branje in vam lahko dajo nadaljnji vpogled v to programsko opremo. Hvala ljudem, ki so bili omenjeni v njej, ki so mi poslali popravke žuželk in dal drugo pomoč.

Načrtovanje in izvedbo projekta Expect je deloma plačala vlada ZDA in je zato v javni domeni. Vendar pa avtor in NIST želita kredit, če se uporabita ta program in dokumentacija ali njihovi deli.