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:
- Vzrok računalnika, da vas pokliče nazaj, tako da se lahko prijavite brez plačila za klic.
- Zaženite igro in če se ne prikaže optimalna konfiguracija, znova zaženite znova in znova), dokler je ne izvede, in vam nato predali nadzor.
- Zaženite fsck in v odgovor na njena vprašanja odgovorite na "da" ali "ne" ali pa vrnite nadzor nad vami na podlagi vnaprej določenih meril.
- Povežite se z drugim omrežjem in samodejno naložite pošto, tako da se zdi, kot da je bila prvotno poslana v vaš lokalni sistem.
- Spremenljivke nosijo okolje, trenutni imenik ali kakršnekoli informacije preko rlogina, telneta, konice, su ali čgrp
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, naslednje bodo zapustile izvirne argumente, vključno z imenom skripte 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 ponavadi zadostuje za ubijanje procesa. 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 proces ubijete, recimo, "exec kill $ pid", morate izrecno pokličite.
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.
The -onxit zastava povzroči, da bo naslednji argument uporabljen kot izhodni upravljalnik. Brez argumenta se vrne trenutni program za izstop.
The -noexit povzroča zastava Pričakovati da se pripravi na izhod, vendar ne ustavi dejanskega vračanja nadzora operacijskemu sistemu. 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 je Expect izhod se ponovno pojavi (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, razen tistih, ki jih 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 (ali 0, če ni določeno) se vrne kot status izhoda Pričakovati . izhod je implicitno izveden, če je dosežen konec skripta.
exp_continue -continue_timer
Ukaz exp_continue dovoljuje pričakovati sama nadaljevati z izvajanjem, ne pa z vračanjem, kot bi običajno. Privzeto exp_continue ponastavi časomer. The -continue_timer zastava preprečuje ponovni zagon časovnika. (Glej pričakovati za več informacij.)
exp_internal -f datoteka vrednost
povzroča nadaljnje ukaze za pošiljanje notranjih diagnostičnih informacij Pričakovati stderr če vrednost ni nič. Ta izhod je onemogočen, če vrednost je 0. Diagnostične informacije vključujejo vse prejete znake in vsak poskus, da se trenutni rezultat uskladi z vzorci.
Če je izbirno mapa je na voljo vsa normalna in razhroščevalna izhodišča v to datoteko (ne glede na vrednost vrednost ). Vsaka prejšnja diagnostična izhodna datoteka je zaprta.
The -info zastava povzroči exp_internal, da vrne opis najnovejših argumentov, ki niso navedeni v podatkih.
exp_open args -i spawn_id
vrne identifikator datoteke Tcl, ki ustreza prvotnemu idr. Identifikator datoteke se nato lahko uporabi, kot da ga je odprl Tcl odprto ukaz. (ID ne sme biti več uporabljen počakaj ne bi smeli izvajati.
The -leaveopen zastava zapusti ID odprtin za dostop do ukazov Expect. A počakaj mora biti izveden na ID-ju za drstenje.
exp_pid -i spawn_id
vrne identifikacijsko številko procesa, ki ustreza trenutno ustvarjenemu procesu. Če je -jaz zastava se uporabi, vrne vrne pidro, ki ustreza tistemu danega idr.
exp_send
je vzdevek za pošlji .
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, trenutna različica Pričakovati se vrne. 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. Skripti, napisani za različice Pričakovati z drugo večjo številko skoraj zagotovo ne bo delovala. 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 skripta pa je večja od tiste, ki se izvaja Pričakovati .
Tretjič je številka, ki v primerjavi z različico ne sodeluje. Vendar pa se poveča, če Pričakovati distribucija programske opreme se 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 -exit zastava, Pričakovati natisne napako in izstopi, če je 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 najnovejših pričakujte pred tem ukaz se implicitno uporablja pred drugimi vzorci. Vzorec iz najnovejših pričakujte ukaz se implicitno uporablja po vseh drugih vzorcih.
Če so argumenti v celoti pričakovati stavek zahteva več kot eno vrstico, se vsi argumenti lahko "ojačijo" v eno, da se ne bi končali z vsako črto. 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 ključna beseda odmor , se ustrezno telo izvaja po časovni omejitvi. Č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 ključna beseda privzeto , se ustrezno telo izvrši ob čakalnem ali končnem delu datoteke.
Če se vzorec ujema, se izvrši ustrezno telo. pričakovati vrne rezultat telesa (ali prazen niz, če vzorec ni ujemal). 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 odmor (tako kot bi si, če bi delovali ročno).
Vzorci so podani na tri načine. Privzeto so vzorci navedeni kot pri Tcl niz tekmo ukaz. (Taki vzorci so podobni tudi regularnim izrazom C-shell, ki se ponavadi imenujejo vzorci "glob"). The -gl Zastava se lahko uporablja za zaščito vzorcev, ki bi se sicer lahko ujemali pričakovati 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.)
Na primer, naslednji fragment išče uspešno prijavo. (Upoštevajte, da prekiniti se domneva, da je postopek, določen drugje v skripti.)
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 (kratka za ukaz "regular expression"). Ponatisni vzorci so uvedeni z zastavico -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.")
The -ex zastava povzroči ujemanje vzorca kot "natančen" niz. Ni interpretacije *, ^, itd., Čeprav je treba še vedno upoštevati običajne konvencije Tcl. Natančni vzorci so vedno neokrnjeni.
The -Nesto zastava 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 pretirano velike vrednosti upočasnijo ujemanje vzorcev.) Če patlist je full_buffer , se ustrezno telo izvede, če match_max prejetih bajtov in nobenih drugih vzorcev se ni ujemalo. Ne glede na to ali ne full_buffer Ključna beseda se uporablja, pozabljeni znaki so zapisani na pričakovanje_a (buffer).
Če patlist je ključna beseda nič , in dovoljene so ničle (preko remove_nulls ukaz), se ustrezno telo izvaja, č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 shrani kateri koli ujemajoči in predhodno neizravnan izhod expect_out (pufer) . V spremenljivke so shranjene do 9 podmenskih ujemanja podmenija pričakujte (1, niz) skozi expect_out (9, niz) . Če je -indikacije zastava se uporablja pred vzorcem, začetnim in končnim indeksom (v primerni obliki lanj ) od 10 niza so shranjene v spremenljivkah pričakujte (X, začnite) in pričakujte (X, konec) kjer je X številka, 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 -Ne prenosi zastava. Ta zastavica je še posebej uporabna pri eksperimentiranju (in lahko med eksperimentiranjem skrajšate na "-not").
ID pomnilnika, povezan z ujemajočim se izhodom (ali eof ali full_buffer), je shranjen v pričakujte (spawn_id) .
The -odmor zastava povzroči, da trenutni ukaz pričakuje, da uporabi naslednjo vrednost kot časovno omejitev, namesto da uporabi vrednost časovne spremenljivke.
Privzeto se vzorci ujemajo z izhodom iz trenutnega postopka, vendar pa -jaz označuje, da se izhod iz imenovanega seznama spawn_id ujema z naslednjimi vzorci (do naslednjega -jaz ). 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 uporabljajo za ujemanje vzorcev z vsemi spawn_ids, ki so imenovani z vsemi drugimi -jaz zastave v toku pričakovati ukaz. Spawn_id iz a -jaz zastava brez pripadajočega vzorca (t.j., takoj sledi drugi -jaz ) je na voljo vsem drugim vzorcem istega pričakovati ukaz povezan z any_spawn_id.
The -jaz zastava 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.
Akcije, kot so odmor in nadaljuj povzročijo kontrolne strukture (npr. za , proc ), da se obnašajo na običajen način. Ukaz exp_continue dovoljuje pričakovati sama nadaljevati z izvajanjem, ne pa z vračanjem, kot bi običajno.
To je uporabno za izogibanje eksplicitnim zankam ali ponavljajočim pričakovanjem. Naslednji primer je del fragmenta za avtomatizacijo rlogina. The exp_continue se izogiba temu, da bi napisal drugo pričakovati izjavo (če želite znova poiskati poziv), č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 tok pričakovati da nadaljujete 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, exp_continue ponastavi časomer. Časovnik se ne zažene, če exp_continue se imenuje z -continue_timer zastava.
pričakujte po pričakujte_args
deluje enako kot pričakujte pred tem razen če vzorci iz obeh pričakovati in pričakujte se lahko ujema, pričakovati vzorec se uporablja. Oglejte si pričakujte pred tem ukaz za več informacij.
expect_background expect_args
ima enake argumente kotpričakovati , vendar se takoj vrne. Patterns se preskusijo, ko prihaja nov vnos. Vzorecodmor inprivzeto so brez pomenaexpect_background in se tiho zavržejo. V nasprotnem primeruexpect_background uporaba ukazovpričakujte pred tem inpričakujte vzorce prav takopričakovati ne.
Kdajexpect_background dejavnosti se ocenjujejo, obdelava ozadja za isti igličasti id je blokirana. Obdelava ozadja je odblokirana, ko se dejanje konča. Medtem ko je obdelava ozadja blokirana, je mogoče (ospredje)pričakovati na istem mestu.
Ni mogoče izvestipričakovati medtem koexpect_background deblokira.expect_background za določen id potopa se izbriše tako, da se prikaže novo pričakovanje_background z istim ID-jem za spawn. Razglasitevexpect_background brez vzorca odstrani naveden id drľave od sposobnosti vzorčenja v ozadju.
pričakujte_predaj pričakujte_args
ima enake argumente kotpričakovati , vendar se takoj vrne. Vzorec par iz vzorca iz najnovejšihpričakujte pred tem z istim ID-jem se implicitno dodajo kateremu koli naslednjemupričakovati ukaze. Če se vzorec ujema, se obravnava, kot da je bil določen vpričakovati ukaz sam, in povezano telo se izvaja v kontekstupričakovati ukaz. Če vzorci iz obehpričakujte pred tem inpričakovati se lahko ujema,pričakujte pred tem vzorec se uporablja.
Če ni podan noben vzorec, se ID kopanja ne preveri za nobene vzorce.
Razen če jih ne preglasi z-jaz zastava,pričakujte pred tem vzorci se ujemajo z idr. idr., določenim v času, ko jepričakujte pred tem ukaz je bil izveden (ne, ko se ujema z vzorcem).
Zastava -info povzročapričakujte pred tem za vrnitev trenutnih specifikacij o tem, katere vzorce se bo ujemala. 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 kotpričakovati vendar prebere znake iz / dev / tty (to je keystrokes od uporabnika). Privzeto se odčitava v načinu kuhanja. Tako se morajo vrstice končati z vrnitvijopričakovati da jih vidim. To se lahko spremeni prekstty (glejstty ukaz spodaj).
pričakujte_user pričakujte_args
je kotprič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 vrnitvijopričakovati da jih vidim.To se lahko spremeni prekstty (glejstty ukaz spodaj).
vilice
ustvarja nov proces. Novi proces je točna kopija trenutnegaPričakovati proces. Na uspeh,vilice vrne 0 v nov (otroški) proces in vrne ID procesa otrokovega 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.
Stisnjeni procesi izstopajo prekizhod ukaz, 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ševilice pred drstmi.
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.)tolmača predpostavlja se, če manjka zadnje telo.
Če so argumenti v celotiinterakcijo stavek zahteva več kot eno vrstico, se vsi argumenti lahko "ojačijo" v eno, da se ne bi končali z vsako črto. V tem primeru se običajne substitucije Tcl pojavijo kljub oklepajom.
Na primer, naslednji ukaz deluje v interakciji z naslednjimi pari niza črk: Ko pritisnete ^ Z,Pričakovati je prekinjena. (The-ponastaviti zastava obnovi terminalne načine.) Ko pritisnete ^ A, uporabnik vidi "vnesel kontrolnik-A" in postopek se pošlje ^ A. Ko pritisnete $, uporabnik vidi datum. Ko pritisnete ^ C,Pričakovati izstopa. Če je vnesen "foo", uporabnik vidi "vrstico". Ko pritisnete ~~, sePričakovati interpreter 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,pričakovati ukaz privzeto uporablja vzorce glob-style)-ex zastava se lahko uporablja za zaščito vzorcev, ki bi se sicer lahko ujemaliinterakcijo 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.)
The-re zastava prisiljuje, da se niz razlaga kot regexp slog. V tem primeru so podmenije shranjene v spremenljivki interact_out podobno načinupričakovati shranjuje svoj izhod v spremenljivkopričakujte . The-indikacije Podobno je podprta tudi zastava.
Vzoreceof uvaja akcijo, ki se izvede ob koncu datoteke. Posebnoeof vzorec lahko sledi tudiIzhod zastava, v katerem primeru se ujema, če je med pisanjem izpisan eof. Privzetoeof dejanje je "vrnitev", tako dainterakcijo preprosto vrne na katerikoli EOF.
Vzorecodmor uvaja časovno zakasnitev (v sekundah) in dejanje, ki se izvede po tem, ko za določen čas ni bilo prebranih znakov. Theodmor vzorec se nanaša na najnovejši postopek. Ni privzetega časovnega zakasnitve. Posebna spremenljivka "timeout" (ki jo uporabljapričakovati ukaz) nima vpliva na ta čas.
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 besedanič , in dovoljene so ničle (prekoremove_nulls ukaz), se ustrezno telo izvaja, če se ujema en sam ASCII 0. Ni mogoče ujemati 0 bajtov prek glob ali regexp vzorcev.
Pretakanje vzorca z zastavico-pišem povzroči spremenljivko interact_out (spawn_id) da se nastavi na spawn_id, ki ustreza vzorcu (ali eof).
Akcije, kot soodmor innadaljuj povzročijo kontrolne strukture (npr.za , proc ), da se obnašajo na običajen način. Vendarvrnitev povzroči interakcijo, da se vrnete na svojega klicatelja, medtem kointer_return vzrokiinterakcijo da v svojem kličočem povzroči vračilo. Na primer, če se imenuje "proc foo"interakcijo ki je nato izvedel akcijointer_return , proc foo bi se vrnila. (To pomeni, da čeinterakcijo klicetolmača interaktivno tipkanjevrnitev bo povzročil, da se interakcija nadaljuje, medtem kointer_return bo interakcija vrnila klicatelju.)
V časuinterakcijo , 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 vPričakovati samega, tolmača prvega klica (morda z uporabo zaščitnega znaka), nato pa 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. The-ponastaviti zastava ponastavi terminal na način, ki ga je imel prejinterakcijo je bil izveden (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-ponastaviti je, če je vaše dejanje odvisno od delovanja v načinu kuhanja.
The-ček zastava pošilja znake, ki se ujemajo z naslednjim vzorcem nazaj v proces, ki ga ustvari, 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.-ček je verjetno primeren le v primerih, ko uporabnik verjetno ne bo dopolnil 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}}
The-nabuder zastava pošilja znake, ki se ujemajo z naslednjim vzorcem na izhodni proces, ko se znaki preberejo.
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
V časuinterakcijo , prejšnja uporabalog_user se zanemari. Še posebej,interakcijo bo prisilil, da bo njegova proizvodnja zapisana (poslana na standardni izhod), saj se domneva, da uporabnik ne želi slepo sodelovati.
The-o zastava povzroči, da se na izhod v trenutnem procesu uporabijo katerikoli 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,interakcijo pričakuje, da bo uporabnik pisal stdin in bral stdoutPričakovati sam proces. The-u zastava (za uporabnika)interakcijo poiščite uporabnika kot proces, imenovan po njegovem argumentu (ki mora biti ID, ki ga je ustvaril).
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 razlogatolmača ukaz bo 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 izhod v več procesov, navedite seznam vseh seznamov idr., Ki jih je predal aIzhod zastava. Vnos za skupino izhodnih ID-jev se lahko določi s seznamom id seznama, v katerem je a-input zastava. (Oboje-input inIzhod lahko sprejme sezname v isti obliki kot-jaz zastava vpričakovati ukaz, razen da noben_spawn_id ni pomembeninterakcijo .) Vse naslednje oznake in nizi (ali vzorci) veljajo za ta vnos, dokler se ne prikaže drugo -inputna zastavica. Če ne-input se prikaže,Izhod pomeni "-input $ user_spawn_id -output". (Podobno, z vzorci, ki nimajo-input .) Če enega-input je podan, preglasi $ user_spawn_id. Če sekundo-input je določen, preglasi $ spawn_id. Dodatno-input oznake se lahko določijo.
Oba implicitna vhodna postopka sta privzeta, da imajo njihove izhode podano kot $ spawn_id in $ user_spawn_id (v obratnem vrstnem redu). Če-input zastava se prikaže s štIzhod flag, znaki iz tega procesa se zavržejo.
The-jaz zastava uvaja zamenjavo za trenutni spawn_id, ko ni nobene druge-input aliIzhod Uporabljajo se zastave. 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 interaktivno zahtevo uporabnikaPričakovati in Tcl ukaze. Rezultat vsakega ukaza je natisnjen.
Akcije, kot soodmor innadaljuj povzročijo kontrolne strukture (npr.za , proc ), da se obnašajo na običajen način. Vendarvrnitev povzroči, da se tolmač vrne kličočemu, medtem kointer_return vzrokitolmača da v svojem kličočem povzroči vračilo. Na primer, če se imenuje "proc foo"tolmača ki je nato izvedel akcijointer_return , proc foo bi se vrnila. Vsak drug vzrok povzročitolmača nadaljujte s pozivanjem k novim ukazom.
Privzeto ima poziv dva cela števila. Prvo celo število opisuje globino ocenjevalnega sklada (to je, kolikokrat je bila klicana 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".
V časutolmača , se uporablja kuhani način, tudi če njegov klicatelj uporablja surovi način.
Če je stdin zaprt,tolmača se bo vrnil, razen če-eof se uporabi zastava, v tem primeru se uporabi poznejši argument.
log_file args -a datoteka
Če je ime datoteke,log_file bo zapisal prepis seje (ki se začne na tej točki) v datoteki.log_file bo prenehal snemati, če ni podan noben argument. Vsaka prejšnja datoteka dnevnika je zaprta.
Namesto imena datoteke se lahko uporabi identifikator datoteke Tcl z uporabo-odprto ali-leaveopen zastave. To je podobno kotspawn ukaz. (Glejspawn za več informacij.)
The-a izhod sile za zastavo, ki je bil zabeležen in je bil potisnjen s stranilog_user ukaz.
Privzeto jelog_file ukaz dodaja na stare datoteke, namesto da jih skrajšate, in sicer zaradi lažje odjavljanja in večkratnih opravil v eni seji. Če želite skrajšati datoteke, uporabite-noappend zastava.
The-info zastava 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.
The-info zastava povzroči, da log_user vrne opis najnovejših argumentov, ki niso navedeni v podatkih.
match_max -d -i spawn_id velikost
definira velikost pufra (v bajtih), ki ga interno uporabljapričakovati . Brez velikost argument, vrne se trenutna velikost.
Z-d zastava, privzeta velikost je nastavljena. (Začetna privzeta vrednost je 2000.)-jaz zastava, velikost je nastavljena za imenovani ID za drstenje, v nasprotnem primeru je nastavljen za trenutni postopek.
prekrivni element - # spawn_id - # spawn_id … program args
izvede "program args "namesto trenutnegaPričakovati program, 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 programiranja interakcije odPričakovati proces 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 vrednost je nič, enakost je odstranjena, v nasprotnem primeru se ne odstrani. Brez vrednost argument, se vrne trenutna vrednost.
Z-d zastava je nastavljena privzeta vrednost. (Začetna privzeta vrednost je 1, kar pomeni, da paritete ni ločeno)-jaz zastavica je vrednost za pariteto nastavljena za imenovani ID zarodja, v nasprotnem primeru 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 pričakujte ali interact_out . Če vrednost je 1, nulls se odstranijo. Če vrednost je 0, ničle se ne odstranijo. Brez vrednost argument, se vrne trenutna vrednost.
Z-d zastava, nastavljena je privzeta vrednost. (Začetna privzeta vrednost je 1, to pomeni, da so odstranjeni ničli.)-jaz zastava, je vrednost nastavljena za imenovanega ID-ja, v nasprotnem primeru je nastavljena za trenutni postopek.
Ne glede na to, ali so odstranjeni ničli,Pričakovati bodo zapisali null bajtove v dnevnik in stdout.
pošlji -flags niz
Pošlje niz na trenutni proces. Na primer ukaz
pošlji "hello world r"
pošilja znake, ki so v teku procesu. (Tcl vključuje tiskf-podoben ukaz (imenovanformatu ), ki lahko gradijo poljubno zapletene strune.)
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".
The-- zastava prisiljuje 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.)
The-jaz zastava izjavlja, da se niz pošlje v imenovanem spawn_id. Če je spawn_id user_spawn_id , terminala pa je v surovem načinu, nove vrstice v nizu se prevedejo v zaporedja vnovičnega zaporedja, tako da se pojavijo, kot da bi bil terminal v načinu kuhanja. The-surov zastava onemogoči ta prevod.
The-nič zastava pošilja nične znake (0 bajtov). Privzeto se pošlje en nič. Celotno število lahko sledi-nič da navedete, koliko nulls želite poslati.
The-Break zastava 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.
The-s izhod sile za zastavo pošilja "počasi", s čimer se izognemo pogostemu položaju, ko računalnik odpre vhodni medpomnilnik, ki je bil zasnovan za človeka, ki ne bi nikoli izstopil iz istega vmesnega pomnilnika. 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, "nastavljen send_slow {10 .001}" bi prisilil pošiljati s pošiljanjem nizov z 1 milisekundo med vsakih 10 znakov.
The-H izhodišča sile, ki jih je treba pošiljati (nekoliko) kot človeški tipkanje. Med znaki se pojavijo človeške zamude. (Algoritem temelji na porazdelitvi Weibull, s spremembami, ki ustrezajo tej posebni aplikaciji.) Ta izhod je pod nadzorom vrednosti spremenljivke "send_human", ki sprejme pet-elementni seznam. Prvi dve elementi sta povprečni čas medkrajevanja 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. Še več, ne niz argument lahko določite z zastavami za pošiljanje ničelnih znakov ali prekinitev.
Dobra ideja je pred prvimpošlji na proces zpričakovati. pričakovati počakati, da se postopek začne, medtem kopošlji ne morem. Še posebej, če je prvipošlji dokler postopek ne začne delovati, tvegate, da bi bili podatki prezrti. V primerih, ko interaktivni programi ne ponujajo začetnega poziva, lahko pred tempošlji z zamudo, kot je v:
# 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šlji. Če uporabljate Expectk ali drugo različico možnosti Expect v okolju Tk,pošlji je definiran s Tk za povsem drugačen namen.exp_send je zagotovljena združljivost med okolji. Podobni vzdevki so podani tudi za druge ukaze za pošiljanje Expect.
send_error -flags niz
je kotpošlji , razen, da se izhod pošlje stderr namesto sedanjega postopka.
send_log - niz
je kotpošlji , razen da je niz poslan le v datoteko dnevnika (glejlog_file .) Argumenti se prezrejo, če nobena datoteka dnevnika ni odprta.
send_tty -flags niz
je kotpošlji , razen, da se izhod pošlje na / dev / tty namesto na trenutni proces.
send_user -flags niz
je kotpošlji , le da se izhod pošlje v stdout namesto v trenutni proces.
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, ki se izvaja "program args ". Stdin, stdout in stderr sta povezana z Expect, tako da jih berejo in zapisujejo drugiPričakovati ukaze. Povezava je prekinjenablizu ali če sam proces zapre katerikoli identifikator datoteke.
Ko se postopek začne sspawn , spremenljivka spawn_id je nastavljen na deskriptor, ki se nanaša na ta proces. Postopek, ki ga opisuje spawn_id se šteje za "trenutno proces ". spawn_id se lahko berejo ali zapisujejo, kar dejansko zagotavlja nadzor dela.
user_spawn_id je globalna spremenljivka, ki vsebuje deskriptor, ki se nanaša na uporabnika. Na primer, kdaj spawn_id je nastavljena na to vrednost,pričakovati Obnaša se kotpričakujte .
.JAZ error_spawn_id je globalna spremenljivka, ki vsebuje deskriptor, ki se nanaša na standardno napako. Na primer, kdaj spawn_id je nastavljena na to vrednost,pošlji Obnaša se kotsend_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 batch script), 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 za proces UNIX. Če ni nobenega postopka, se vrne 0. Spremenljivka spawn_out (slave, ime) je nastavljen na ime pomožne naprave pty.
Privzeto,spawn odzove na ime in argumente. The-noecho zaustavitev zastavespawn od tega.
The-konzola zastava povzroči, da se izhod konzole preusmeri na pridobljeni proces. To ni podprto na vseh sistemih.
V notranjosti,spawn uporablja pty, inicializiran na enak način kot uporabniški tty. To se še inicializira tako, da so vse nastavitve "enostavne" (v skladu s stty (1)). Če spremenljivka stty_init je definiran, se razlaga v slogu stty argumentov 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.-notkopija preskoči inicializacijo na osnovi uporabnika tty.- Ne vem preskoči "injekcijsko" inicializacijo.
Običajno,spawn traja 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 za zagrnjeno pty.) Running Expect with-d možnost bo pokazala, čePričakovati se srečuje z mnogimi ptys v lihih državah. Če ne morete ubiti procesov, na katere so priključeni ti ptys, se lahko zgodi samo, da se ponovno zagnati.
Če program ni mogoče uspesno ustvariti, ker ne uspe (exec (2) (npr program ne obstaja), bo sporočilo o napaki vrnilo naslednjeinterakcijo alipričakovati ukaz, kot da program je zagnal in izdelal sporočilo o napaki kot izhod. To vedenje je naravna posledica izvajanjaspawn . V notranjosti se pogonska vilica, po kateri pridelani proces ne more komunicirati z izvirnikomPričakovati proces, razen s komunikacijo prek spawn_id.
The-odprto zastava povzroči, da se naslednji argument razlaga kot identifikator datoteke Tcl (to je, vrnil ga jeodprto .) Nato se lahko uporabi idrino, kot da bi bil vzgojen 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. The-leaveopen zastava je podobna-odprto razen tega-leaveopen povzroči, da ostane identifikator datoteke odprt, tudi potem, ko je ID zaprta.
The-Prazno zastava 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 nastavljen na identifikator datoteke, ki ustreza pty slavi. Lahko ga zapremo z uporabo "blizu -slave".
The-igre zastava imenuje signal, ki ga je treba prezreti v ustvarjenem procesu. V nasprotnem primeru signali dobijo privzeto obnašanje. Signali so imenovani kot vpast ukaz, razen da vsak signal zahteva ločeno zastavo.
strace ravni
povzroči naslednje izjave, ki bodo natisnjene pred izvedbo. (Tcl-ov sledi ukazov za sledenje sledi spremenljivk.) ravni označuje, kako daleč je v sledi klicev sledenje. Na primer se zažene naslednji ukazPričakovati medtem ko sledi prvim štirim nivojem klicev, vendar nobeden pod temi.
pričakujte -c "strace 4" scenarij.exp
The-info zastava 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, argumentisurov ali-učeno terminal postavite v surovi način. Argumenti-surov alikuhano terminal postavite v kuhani način. Argumentiodmev in-ček postavite 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 args do sh (1) kot vhod, tako kot če bi ga vnesli kot ukaz iz terminala.Pričakovati čaka, dokler se lupina ne konča. Stanje vrnitve iz sh se ravna tako, kot jeexec obravnava status vrnitve.
Za razliko odexec ki preusmeri stdin in stdout v scenarij,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 so bili rezultatisistem se ne zabeležijo v dnevniku.
časovni žig args
vrne časovni žig. Brez argumentov je število sekund po vrnitvi epohe.
The-format zastava uvaja vrvico, ki se vrne, vendar s substitucijami, izvedenimi po pravilih POSIX za strftime. Na primer% a nadomesti skrajšano ime dneva v tednu (tj. 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.
The-seconds zastava uvaja število sekund od časa, ki se uporablja kot vir, iz katerega lahko formatirate. V nasprotnem primeru se uporablja trenutni čas.
The-gmt zastava prisili časovni žig za uporabo časovnega pasu GMT. Brez zastave se uporablja lokalni časovni pas.
trap ukaz signali
povzroči dano ukaz ki se izvede ob prihodnjem prejemu katerega koli od danih signalov. Ukaz je izveden v globalnem obsegu. Če ukaz je odsoten, signalno dejanje se vrne. Če ukaz je niz SIG_IGN, signali se prezrejo. Če ukaz je niz SIG_DFL, signali so posledica privzetega sistema. signale je bodisi en 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),past vrne številko signala ukaza za past, ki se trenutno izvaja.
The-Koda zastava uporablja vrnitveno kodo ukaza namesto katere koli kode, ki bi jo Tcl kmalu vrnil, ko se je ukaz prvotno začel prikazovati.
The-interp zastava povzroči, da se ukaz oceni s pomočjo tolmača, ki je bil aktiven v trenutku, ko je ukaz začel teči, ne pa, ko je bil pasti objavljen.
Theime












