Linux / Unix komanda tikisi

Tikėtis yra programa, pagal kurią kalbama apie kitas interaktyvias programas pagal scenarijų. Po scenarijaus "Tikėtis" žino, ko galima tikėtis iš programos ir koks teisingas atsakymas. Suprantama kalba užtikrina šakos ir aukšto lygio valdymo struktūras, norint nukreipti dialogą. Be to, vartotojas gali pageidauti kontroliuoti ir tiesiogiai bendrauti, o po to grįžti į scenarijų.

Expectk yra "Expect" ir "Tk" mišinys. Jis elgiasi taip, kaip Expect ir Tk noras. "Expect" taip pat gali būti naudojamas tiesiogiai C arba C ++ be Tcl.

Pavadinimas "Expect" gaunamas iš "uucp", kermit ir kitų modemų valdymo programų populiarintų siuntimo / laukimo sekų idėjos. Tačiau skirtingai nuo uucp, Expect yra apibendrinta, todėl ją galima paleisti kaip vartotojo lygio komandą su bet kokia programa ir užduotimi. Tikėtis, kad tuo pačiu metu galite kalbėtis su keliomis programomis.

Ką tik gali daryti

Pavyzdžiui, čia yra keletas dalykų, kuriuos gali tikėtis komanda:

Yra keletas priežasčių, kodėl korpusas negali atlikti šių užduočių. Visi yra galimi tikėtinai.

Paprastai "Expect" yra naudinga paleisti bet kurią programą, kuri reikalauja sąveikos tarp programos ir vartotojo. Viskas, ko reikia, yra tai, kad sąveika gali būti apibūdinta programiškai. Tikėtis, kad vartotojas taip pat gali grąžinti valdymą, neužkertamas kelias kontroliuojamai programai. Panašiai vartotojas bet kuriuo metu gali grąžinti valdymą į scenarijų.

Naudojimas

Tikėtis skaito cmdfile komandų vykdymui sąrašą. Tikėtis gali būti naudojamas netiesiogiai sistemose, kurios palaiko #! pažymint scenarijų kaip vykdomąjį ir sudarančios pirmąją scenarijaus eilutę:

#! / usr / local / bin / expect-f

Žinoma, kelias turi tiksliai aprašyti, kur laukia gyvenimo. / usr / local / bin yra tik pavyzdys.

"-c" vėliava priskiria komandą, kuri turi būti vykdoma prieš bet kurį iš scenarijų. Komandą reikia nurodyti, kad nebūtų suskaidyta apvalkalo. Ši parinktis gali būti naudojama kelis kartus. Keli komandos gali būti vykdomos su viena -c, atskiriant juos kabliataškiais. Komandos vykdomi tokiu būdu, kokiu jie rodomi. Naudojant Expectk, ši parinktis nurodoma kaip -command.

"-d" vėliava leidžia atlikti tam tikrą diagnostikos išvestį, kuris visų pirma nurodo komandų vidinę veiklą, pvz., Tikėtiną ir sąveikaujančią. Ši vėliavėlė turi tokį patį efektą, kaip ir "exp_internal 1" "Tikėtino scenarijaus" pradžioje, taip pat spausdinama "Tikėtino" versija.

"D" žymė įgalina interaktyvų debugerį. Turėtų sekti sveika vertė. Derinimo priemonė bus kontroliuojama prieš kitą Tcl procedūrą, jei vertė nėra nulinė arba jei paspaudžiamas ^ C arba pasiekiamas pertraukimo taškas arba kita tinkama derinimo programa pasirodo scenarijuje. Naudojant Expectk ši parinktis nurodoma kaip - Derinimas.

"-f" vėliava nurodo failą, iš kurio galima skaityti komandas. Vėliava yra neprivaloma, nes ji naudinga tik naudojant #! žymėjimas, kad kiti argumentai gali būti pateikti komandinėje eilutėje. Naudojant Expectk, ši parinktis nurodoma kaip -file.

Pagal numatytuosius nustatymus komandų failas yra skaitomas į atmintį ir vykdomas visas. Retkarčiais pageidautina vienu metu skaityti failus iš vienos eilutės. Tam, kad priversti savavališkus failus tvarkyti tokiu būdu, naudokite -b vėliavą. Naudojant Expectk, ši parinktis nurodoma kaip -buffer.

Jei eilutė "-" pateikiama kaip failo pavadinimas, vietoj to reikia skaityti standartinį įvestį. Naudokite "./-" skaityti iš failo, kurio pavadinime yra "-".

"-i" žyma sukelia tikėtis, kad interaktyviai pakviesti komandas, o ne skaityti juos iš failo. Pasikalbėjimas nutraukiamas per komandą išvykimo ar EOF. Įsitikinama, kad žyma-i yra, jei nenaudojama nei komandų failo, nei-c. Naudojant Expectk, ši parinktis nurodoma kaip -interactive.

- gali būti naudojamas norint nustatyti parinkčių pabaigą. Tai naudinga, jei norėsite perduoti tokį variantą panašų argumentą į savo scenarijų, nebent jis būtų interpretuojamas pagal "Expect". Tai gali būti naudingai įdėta į #! kad išvengtumėte jokio "Expect" vertikalaus aiškinimo. Pavyzdžiui, toliau pateikiami originalūs argumentai, įskaitant scenarijaus pavadinimą, kintamasis argv .

#! / usr / local / bin / expect -

Atkreipkite dėmesį, kad pridedant argumentus prie #! Reikia laikytis įprastų getopt (3) ir execve (2) taisyklių. linija

Failas $ exp_library / expect.rc automatiškai gaunamas, jei yra, nebent naudojama -N ženklas. (Kai naudojatės Expectk, ši parinktis nurodyta kaip -NORC.) Iš karto po to failas ~ / .expect.rc automatiškai gaunamas, nebent naudojamas "-n" ženklas. Jei aplinkos kintamasis DOTDIR yra apibrėžtas, jis laikomas aplanku ir .expect.rc skaitomas iš ten. Naudojant Expectk, ši parinktis nurodoma kaip -norc. Šis tiekimas įvyksta tik atlikus bet kurias -c vėliavas.

-v sukelia tikisi spausdinti savo versijos numerį ir išeiti. "Expectk" atitinkama vėliava, kuri naudoja ilgus vėliavų pavadinimus, yra -versija.

Pasirinktiniai args yra sudaryti į sąrašą ir saugomi kintamame pavadinimu argv ir. argc yra inicializuotas pagal argv ilgį.

Argv0 apibrėžiamas kaip scenarijaus ar dvejetainės pavadinimas, jei scenarijus nenaudojamas. Pavyzdžiui, toliau išvardyti scenarijaus vardai ir pirmi trys argumentai:

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

Komandos

Expect naudoja įrankio komandų kalbą. "Tcl" teikia kontrolinį srautą (jei pertrauka), išraiškos vertinimą ir keletą kitų funkcijų, tokių kaip recircijos ir procedūros apibrėžimas. Komandos, naudojamos čia, bet neapibrėžtos (set, if, exec) yra Tcl komandos. Expect palaiko papildomas komandas. Jei nenurodyta kitaip, komandos grąžina tuščią eilutę.

Komandos yra išvardytos abėcėlės tvarka, kad būtų galima greitai rasti. Tačiau naujiems vartotojams gali būti lengviau pradėti skaitydami nerodymo, siuntimo, numatymo ir sąveikos aprašus tokia tvarka.

uždaryti [-slausa] [-onexec 0 | 1] [-i spawn_id]

uždaro ryšį su dabartiniu procesu . Dauguma interaktyvių programų aptiks EOF savo stdin ir išvykstant; taip uždarykite, paprastai pakanka ir proceso nužudymui. "-i" vėliava pareiškia, kad procesas uždarytas, atitinkantis pavadintą spawn_id.

Tiek tikimasi, tiek ir bendraus, bus aptikta, kada dabartinis procesas baigiasi, ir netiesiogiai uždaryti, bet jei jūs nužudysite procesą , tarkim, "exec kill $ pid", turėsite aiškiai paskambinti uždaryti .

"-onexec" vėliava nustato, ar nykščio id yra uždarytas bet kokiuose naujuose procesuose arba procese yra perdengtas. Jei norite palikti spawn id atvirą, naudokite reikšmę 0. Ne nulinė sveika reikšmė verčia spawn uždaryti bet kokiuose naujuose procesuose.

Valdovų vėliava uždaro vergą, susietą su spawn id. Kai jungtis yra uždaryta, vergas taip pat automatiškai uždaromas, jei jis vis dar atidarytas.

Nesvarbu, ar ryšys uždarytas netiesiogiai ar aiškiai, turėtumėte skambinti laukti, kol išvalysite atitinkamą branduolio proceso lizdą. Uždaryti komandą nereikia laukti, nes nėra garantijos, kad proceso prisijungimo uždarymas leis jam išeiti.

derinti [[-now] 0 | 1]

kontroliuoja "Tcl" debugerį, leidžiantį jums pereiti per pareiškimus ir nustatyti pertraukties taškus.

Nesant jokių argumentų, jei debugeris neveikia, grąžinamas 1, kitaip grąžinamas 0.

Su 1 argumentu paleidžiamas debugeris. Su 0 argumentu debugeris yra sustabdytas. Jei iki 1 argumento yra "-now flag", debugeris nedelsiant paleidžiamas. Priešingu atveju, debugeris bus paleistas naudojant kitą "Tcl" pareiškimą.

Derinimo komanda nepakeičia spąstų. Palyginkite tai su "Expect" su "-D" vėliava.

Atjungimo komanda atsijungia nuo terminalo pagaminto proceso . Jis tęsiasi fone. Procesui suteikiama proceso grupė. Standartinis I / O nukreipiamas į / dev / null .

Toliau pateiktame fragmente naudojamas atjungimas, kad fonas toliau tęstų scenarijų.

jei {[fork]! = 0} išjunkite atjungimą. . .

Šis scenarijus nuskaito slaptažodį ir paleidžia programą kas valandą, kuri reikalauja slaptažodžio kiekvieną kartą paleidus. Šis scenarijus pateikia slaptažodį, kad jį turėtumėte įvesti tik vieną kartą.

send_user "slaptažodis? \" expect_user -re "(. *) \ n" už {} 1 {} {if {[fork]! = 0} (miegoti 3600; tęsti) atjungti spawn priv_prog tikėtis Slaptažodis: siųsti "$ expect_out 1, eilutė) ". . . išeiti}

Prieiga prie atsijungimo naudojant apvalkalo asinchroninį proceso funkciją (&) yra ta, kad tikėtis gali išsaugoti terminalo parametrus prieš atjungiant, o vėliau pritaikyti juos naujiems ptys. Naudojant "&", "Expect" nėra galimybės perskaityti terminalo parametrus, nes terminalas jau yra atjungtas iki laiko, kurį laukia gaunama kontrolė.

išeiti [-opts] [statusas]

sukelia tikėtis išeiti ar kitaip pasiruošti tai padaryti.

" -onexit" vėliava lemia, kad kitas argumentas naudojamas kaip išeigos tvarkyklė. Be argumento, grąžinamas dabartinis išvesties tvarkyklė.

Neaktyvus vėliava sukelia tikėtis pasiruošti išeiti, bet sustabdyti faktiškai grąžinti valdymą į operacinę sistemą. Nustatomas vartotojo apibrėžtas išėjimo tvarkiklis paleidžiamas taip pat, kaip ir "Expect" vidaus tvarkytojai. Daugiau nebesitikima, kad komandos būtų vykdomos. Tai naudinga, jei naudojate tikėtis su kitais Tcl plėtiniais. Dabartinis vertėjas (ir pagrindinis langas, jei Tk aplinkoje) lieka taip, kad kiti Tcl plėtiniai galėtų išvalyti. Jei "Expect" išėjimas išjungiamas dar kartą (tačiau tai gali įvykti), tvarkytojai nebus pakartojami.

Pasibaigus, visos jungtys su sukurtais procesais yra uždaryti. Užkrėtimo procesai bus aptikti kaip EOF. išeiti nereikalauja jokių kitų veiksmų, neviršijančių įprastos _exit (2) procedūros. Taigi, sugeneruoti procesai, kurie netikrina EOF, gali tęstis. (Įvairios sąlygos yra svarbios norint nustatyti, pvz., Kokie signalai bus siunčiami atsiradusiam procesui, tačiau jie priklauso nuo sistemos, dažniausiai dokumentuojami išėjimo metu (3).) Nepagrįsti procesai, kurie ir toliau bus vykdomi, bus paveldėti init.

statusas (arba 0, jei nenurodyta) grąžinamas kaip laukimo būsena. išeitis yra netiesiogiai įvykdyta, jei pasiekiamas scenarijaus pabaiga.

exp_continue [-continue_timer]
Komanda exp_continue leidžia tikėtis , kad ji toliau vykdys, o ne grąžins, kaip paprastai. Pagal nutylėjimą exp_continue iš naujo nustatomas laikmatis. Ženklas -continue_timer neleidžia paleisti laikmačio. (Žiūrėkite daugiau informacijos).

exp_internal [-f file] vertė
sukelia papildomas komandas siunčiant diagnostikos informaciją iš " Expect" į " stderr", jei vertė nėra lygi nuliui. Ši išvestis yra išjungta, jei vertė yra 0. Diagnostikos informacija apima visus gautus ženklus ir kiekvieną bandymą suderinti dabartinę išvestį su modeliais.

Jei pateikiamas neprivalomas failas , įprastą ir derinimo išvestį įrašoma į tą failą (nepriklausomai nuo vertės vertės ). Bet koks ankstesnis diagnostikos išvesties failas yra uždarytas.

" -info" vėliava sukelia exp_internal, kad būtų grąžintas naujausių neinformuojamų argumentų aprašymas.

exp_open [args] [-i spawn_id]
grąžina Tcl failo identifikatorių, kuris atitinka pradinį spawn id. Tada failo identifikatorius gali būti naudojamas taip, tarsi jis būtų atidarytas atidarius komandą Tcl. (Nepavyko naudoti spawn id. Laukti negalima.

Atvirkštinė vėliava palieka neršto ID, prieinamą per " Expect" komandas. Laukimas turi būti įvykdytas ant spawn id.

exp_pid [-i spawn_id]
grąžina proceso ID, atitinkantį šiuo metu sukurtą procesą. Jei naudojama " -i" vėliava, " pid" grąžinimas atitinka nurodyto spawn id.

exp_send
yra siuntimo slapyvardis.

exp_send_error
yra vardas send_error .

exp_send_log
yra send_log slapyvardis.

exp_send_tty
yra vardas send_tty .

exp_send_user
yra " send_user " slapyvardis.

exp_version [[-exit] versija]
yra naudinga siekiant užtikrinti, kad scenarijus yra suderinamas su dabartine tikėtinos versijos versija.

Nesant argumentų grąžinama dabartinė tikėtino varianto versija. Ši versija gali būti užkoduota jūsų scenarijuje. Jei iš tikrųjų žinote, kad nesinaudojate naujausių versijų funkcijomis, galite nurodyti ankstesnę versiją.

Versijos susideda iš trijų skaičių, atskirtų taškais. Pirmasis yra didžiausias skaičius. Beveik neabejotinai neveikia skriptai, kurie parašyti "Expect" versijoms su kitokiu pagrindiniu numeriu. exp_version grąžina klaidą, jei pagrindiniai numeriai nesutampa.

Antrasis yra nedidelis skaičius. Skriptai, parašyti versijai su mažesne nei dabartinės versijos versija, gali priklausyti nuo kai kurių naujų funkcijų ir gali neveikti. exp_version grąžina klaidą, jei pagrindiniai skaičiai atitinka, tačiau mažesnio scenarijaus numeris yra didesnis nei veikiančio laukimo .

Trečia, yra numeris, kuris neturi jokios versijos palyginimo. Tačiau jis didinamas, kai " Expect" programinės įrangos platinimas bet kokiu būdu keičiamas, pavyzdžiui, papildomais dokumentais arba optimizavimu. Kiekvienai naujajai nepilnametei versija yra nustatoma iš naujo.

Su išeitine vėliava, tikėtis spausdina klaidą ir išeina, jei versija yra pasenusi.

tikėtis [[-opts] pat1 body1] ... [-opts] patn [bodyn]
Laukia, kol vienas iš modelių neatitinka pagamintos proceso rezultatų, praėjus tam tikram laikotarpiui arba matyti failo pabaiga. Jei paskutinė įstaiga yra tuščia, ji gali būti praleista.

Naujausios expect_before komandos modeliai yra netiesiogiai naudojami prieš kitus modelius. Naujausios expect_after komandos modeliai yra netiesiogiai naudojami po bet kurių kitų modelių.

Jei argumentams, susijusiems su visais tikėtino teiginio reikalavimais, reikia daugiau nei vienos eilutės, visi argumentai gali būti "pririšti" į vieną, kad nebūtų nutraukta kiekviena eilutė su grįžtamojo brūkšniu. Šiuo vienu atveju, įprasti Tcl pakeitimai įvyks nepaisant liemenių.

Jei modelis yra raktinis žodis eof , atitinkamas kūnas paleidžiamas failo pabaigoje. Jei modelis yra raktinio žodžio laiko tarpas , atitinkamas kūnas vykdomas pasibaigus laikui. Jei nenaudojamas "timeout" raktinis žodis, numanomas nulinis veiksmas vykdomas pasibaigus taimatui. Numatytasis laiko tarpas yra 10 sekundžių, tačiau gali būti nustatytas, pavyzdžiui, iki 30, pagal komandą "set timeout 30". Begalinis laiko tarpas gali būti žymimas -1 reikšme. Jei modelis yra numatytasis pagal raktinį žodį, atitinkamas kūnas vykdomas po laiko tarpo arba pabaigos failo.

Jei modelis sutampa, tuomet vykdomas atitinkamas kūnas. tikimasi, kad grąžinamas kūno rezultatas (arba tuščia eilutė, jei nėra modelio). Jei įvairaus pobūdžio modeliai sutampa, pirmasis rodomas pirmasis naudojamas kūno pasirinkimui.

Kiekvieną kartą, kai gaunamas naujas produktas, jis yra lyginamas su kiekvienu modeliu, kuris yra sąraše. Taigi, galite patikrinti, ar nėra atitikties, nes paskutinį modelį garantuojote, kad jis pasirodys, pvz., Greita. Tais atvejais, kai nėra greitos, turite naudoti laiko pabaigą (kaip ir jūs, jei bendraujate rankiniu būdu).

Temos yra nurodytos trimis būdais. Pagal numatytuosius nustatymus, modeliai nurodyti kaip su Tcl eilutės atitikmenų komanda. (Tokie modeliai taip pat panašūs į C-shell reguliarios išraiškos, paprastai vadinamos "glob" modeliais). Ženklas " -gl" gali būti naudojamas apsaugoti modelius, kurie priešingu atveju galėtų atitikti numatytas vėliavas. Bet koks modelis, prasidedantis "-", turėtų būti apsaugotas tokiu būdu. (Visos eilutės, prasidedančios "-", yra rezervuotos būsimoms parinktims.)

Pavyzdžiui, šis fragmentas ieškos sėkmingo prisijungimo. (Atminkite, kad abortas yra procedūra, apibrėžta kitur scenarijuje.)

tikėtis {busy {užimtas \ n; exp_continue) nepavyko nutraukti "netinkamo slaptažodžio" nutraukti laiko praleidimą nutraukti prisijungimą}

Citatos yra būtinos ketvirtajame rašte, nes jame yra erdvė, kuri kitaip atskirtų modelį nuo veiksmo. Su tokiu pačiu veiksmu (pvz., 3 ir 4) modeliai reikalauja iš naujo įrašyti veiksmus. Tai galima išvengti naudojant regexp stiliaus modelius (žr. Toliau). Daugiau informacijos apie pasaulinio stiliaus modelių kūrimą galite rasti "Tcl" vadovo.

Regexp stiliaus modeliai seka sintaksė, apibrėžta komandos "Tcl" regexp (santrumpa "reguliarios išraiškos"). regexp modeliai pateikiami su vėliava -re . Ankstesnis pavyzdys gali būti perrašytas naudojant regexp kaip:

tikėtis {busy {užimtas \ n; exp_continue) -re "nepavyko | neteisingo slaptažodžio" nutraukti laiko praleidimą nutraukti prisijungti}

Abu tipų modeliai yra "neprilygstami". Tai reiškia, kad modeliai neturi atitikti visos eilutės, bet gali pradėti ir baigti rungtynes ​​bet kurioje eilutėje (tol, kol viskas atitinka). Naudokite ^, kad atitiktų eilutės pradžią, ir $, kad atitiktų pabaigą. Atkreipkite dėmesį, kad jei nelaukite eilutės pabaigos, jūsų atsakymai gali lengvai pasibaigti eilutės viduryje, nes jie yra pakartoti iš sukurto proceso. Nors vis dar gaminami teisingi rezultatai, produkcija gali atrodyti nenatūrali. Taigi, "$" naudojimas yra skatinamas, jei galite tiksliai apibūdinti simbolius eilutės pabaigoje.

Atkreipkite dėmesį, kad daugumoje redaktorių "^" ir "$" atitinka linijų pradžią ir pabaigą. Tačiau, nes tikimasi, kad jis nėra orientuotas į linijas, šie simboliai atitinka duomenų pradžią ir pabaigą (priešingai nei eilutės), kurios šiuo metu yra tikėtinas atitikimo buferis. (Taip pat žr. Toliau pateiktą užrašą apie "sistemos virškinimą.")

Ženklas -ex sukelia modelio atitikimą kaip "tikslią" eilutę. Nebuvo išaiškinta *, ^ ir tt (nors vis dar turi būti laikomasi įprastų TCL susitarimų). Tikslūs modeliai visada yra neprilygstami.

" -Nocase" žyma sukelia išvesties didžiąsias raides palyginti taip, lyg būtų mažosios raidės. Šablonas neturi įtakos.

Skaičiuojant išvesties duomenis, daugiau nei 2000 baitų gali priversti ankstesnius baitus būti "pamiršti". Tai gali būti pakeista funkcija match_max . (Atkreipkite dėmesį, kad pernelyg didelės vertės gali sulėtinti modelio matricą.) Jei patlistas yra full_buffer , atitinkamas kūnas paleidžiamas, jei match_max baitai buvo gauti ir jokių kitų modelių atitiko. Nesvarbu, ar naudojamas full_buffer raktinis žodis, užmirštieji simboliai yra įrašomi į expect_out (buferinis).

Jei patlistas yra raktažodis nulis , o nuliai yra leidžiami (per komandą remove_nulls ), atitinkamas kūnas vykdomas, jei yra suderintas vienas ASCII kodas 0. Neįmanoma suderinti 0 baitų per glob arba regexp modelius.

Suderinus modelį (arba eof arba full_buffer), bet kokia suderinta ir anksčiau nesuderinta išvestis išsaugoma kintamame expect_out (buferio) . Iki 9 regexp substring rungtynės išsaugomos kintamuosiuose expect_out (1, string) per expect_out (9, string) . Jei simbolis -indeksas yra naudojamas prieš modelį, pradžios ir pabaigos indeksai (formoje, tinka lange ) iš 10 eilučių yra saugomi kintamuose lauke_out (X, start) ir expect_out (X, end), kur X yra skaitmuo, atitinka buferio antrinės eilutės poziciją. 0 nurodo eilutes, kurios atitiko visą modelį ir sukurtos globų modeliams bei regexp modeliams. Pavyzdžiui, jei procesas generuoja "abcdefgh \ n" rezultatą, rezultatas:

tikėtis "cd"

tarsi įvykdytų šie teiginiai:

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

ir "efgh \ n" lieka išvesties buferyje. Jei procesas generuoja išvestį "abbbcbkkkka \ n", rezultatas:

tikėtis -indeksai -re "b (b *). * (k +)"

tarsi įvykdytų šie teiginiai:

set expec_out (0, start) 1 set expec_out (0, end) 10 set expec_out (0, string) bbbcabkkkk set expec_out (1, start) 2 set expec_out (1, end) 3 set expec_out (1, string) bb set expec_out (2, start) 10 set expec_out (2, end) 10 set expec_out (2, string) k set expec_out (buffer) abbbcabkkkk

ir "a \ n" lieka išvesties buferyje. Modulis "*" (ir -re ". *") Išstumia išvesties buferį, neišskaičius jokio proceso išėjimo.

Paprastai suderinta išvestis yra atmestos iš "Expect" vidinių buferių. Tai gali užkirsti kelią, nurodant modelį su " -notransfer flag". Ši vėliava yra ypač naudinga eksperimentuojant (ir eksperimentuojant ją galima sutrumpinti "-not" patogumui).

Nepavyko id, susietas su atitinkančia išvestimi (arba eof arba full_buffer) saugomas expect_out (spawn_id) .

Laikas " -timeout" sukelia dabartinės tikimybės komandą naudoti šią reikšmę kaip laiko tarpą, o ne naudoti laiko pabaigos kintamojo reikšmę.

Pagal numatytuosius nustatymus modeliai suderinami su dabartinio proceso išvedimu, tačiau -i vėliava skelbia, kad išvardytų spawn_id sąrašų išvestis turi būti suderinta su bet kuriais toliau nurodytais modeliais (iki kito -i ). "Spawn_id" sąrašas turėtų būti atskirtas atskirai nuo spawn_ids arba kintamasis, nurodantis tokį spawn_ids sąrašą.

Pvz., Šis pavyzdys laukia "connected" iš dabartinio proceso arba "occupy", "failed" arba "invalid password" iš spawn_id, pavadinto $ proc2.

tikėtis {-i $ proc2 užimtas {užimtas \ n; exp_continue) -re "nepavyko | neteisingo slaptažodžio" nutraukti laiko praleidimą nutraukti prisijungti}

Viso kintamojo any_spawn_id vertė gali būti naudojama siekiant suderinti modelius su bet kokiais spawn_ids, kurie yra pavadinti su visomis kitomis " -i" vėliavomis esančioje numatomoje komandoje. "Spawn_id" iš -i vėliavos, neturinčios atitinkamo modelio (ty, po to tuoj pat vykdo kitas -i ), yra prieinamas bet kokiems kitiems tos pačios tikimybės komandų, susijusių su any_spawn_id, modeliais.

" -i" vėliava taip pat gali pavadinti globalų kintamąjį, tokiu atveju kintamasis skaitomas neršto ID pavadinimui. Kintamasis perskaičiuojamas kiekvieną kartą, kai jis pasikeičia. Tai suteikia galimybę pakeisti įvesties / išvesties šaltinį vykdant komandą. Tokiu būdu pateikiami spawn ids vadinami "netiesioginiais" spawn ids.

Tokie veiksmai kaip pertrauka ir tęsinys sukelia kontrolės struktūras (ty, proc ) elgtis įprastu būdu. Komanda exp_continue leidžia tikėtis , kad ji toliau vykdys, o ne grąžins, kaip paprastai.

Tai naudinga siekiant išvengti aiškių kilpų ar pakartotinių numatytų teiginių. Šis pavyzdys yra fragmentas, skirtas rlogin automatizuoti. " Exp_continue" vengia rašyti antrą tikėtiną teiginį (norint vėl ieškoti eilutės), jei rlogin raginama įvesti slaptažodį.

\ n "send_user" \ n "siųsti" $ expect_out (1, eilutė) \ r "stty", "$ {{{{password: {stty -echo send_user" slaptažodis ($ user) $ hoste: "expect_user -re" (. *) echo exp_continue} neteisingas {send_user} neteisingas slaptažodis arba sąskaita \ n "exit" timeout {send_user "ryšys su $ hoste baigėsi \ n" exit} eof (send_user) ryšys su priimančiuoju nepavyko: $ expec_out (buferinis) "exit} pakartotinai sumokėti}

Pavyzdžiui, šis fragmentas gali padėti naudotojo vadove sąveikai, kuri jau yra visiškai automatizuota. Tokiu atveju terminalas įvedamas į žaliavinį režimą. Jei vartotojas paspaudžia "+", kintamasis padidinamas. Jei paspausite "p", į procesą bus išsiųstas keli grąžinimo būdai, galbūt tam tikru būdu sukimba, o "i" leidžia vartotojui sąveikauti su procesu, veiksmingai ištrindami scenarijaus valdymą. Kiekvienu atveju, exp_continue leidžia dabartinei tikėtis tęsti modelio suderinimą atlikus dabartinį veiksmą.

stty raw - ne "expect_after" (-i $ user_spawn_id "p" (siųsti "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "išeiti" išeiti}

Pagal numatytuosius nustatymus exp_continue iš naujo nustato laikmatis. Laikmatis nebus iš naujo paleistas, jei exp_continue skambinama su vėliava -continue_timer .

tikimasi po ateities [expect_args]
veikia tiek, kiek tikėtasi anksčiau, išskyrus tai, kad jei modeliai iš abiejų tikėtis ir tikisi , kad gali sutapti, tikimasi, kad modelis bus naudojamas. Daugiau informacijos rasite komandoje expect_before .

expect_background [expect_args]
laikosi tų pačių argumentų kaip ir tikimasi , tačiau jis grįžta iš karto. Modeliai yra išbandomi kiekvieną kartą, kai ateina nauja įvestis. Modelio laikas ir numatytoji reikšmė yra nereikšmingi expect_background ir yra tyliai atmesti. Priešingu atveju, komanda expect_background naudoja expect_before ir expect_after modelius, kaip tikėtis .

Kai vertinami expect_background veiksmai, fono apdorojimas to paties spawn id yra užblokuotas. Fono apdorojimas atblokuotas, kai veiksmas baigtas. Nors fono apdorojimas yra užblokuotas, galima tikėtis (pirmojo plano) tos pačios veislės id.

Negalima įvykdyti tikimybės, o expect_background yra atblokuota. "expect_background", skirtas konkretaus spawn id, yra ištrinamas nurodant naują expect_background su ta pačia veisle id. Pasakydamas, kad expect_background be modelio pašalina nurodytą spawn id iš gebėjimo fone suderinti modelius.

laukti_prieš [expect_args]
laikosi tų pačių argumentų kaip ir tikimasi , tačiau jis grįžta iš karto. Veiksmų poros iš paskutinių expect_before su tuo pačiu spawn id yra netiesiogiai įtrauktos į visas kitas norimas komandas. Jei modelis sutampa, jis laikomas taip, tarsi jis būtų nurodytas pačiame tikėtinoje komandoje, o susijęs subjektas įvykdomas tikėtinos komandos kontekste. Jei modeliai iš abiejų expect_before ir expect, gali atitikti expect_prex modelį.

Jei nenurodyta jokio modelio, nėrinių identifikatoriaus negalima patikrinti jokių modelių.

Jei nepaisoma -i ženklo, expect_before, modeliai atitiktų spawn id, nustatytą tuo metu, kai komanda exec_date_beg_executed (ne tuo atveju, kai jos modelis yra suderintas).

Informacijos žyma kelia expect_before, kad grąžintų dabartines specifikacijas, kokius modelius jis atitiks. Pagal numatytuosius nustatymus pateikiama informacija apie dabartinį spawn id. Galima pateikti neprivalomą spaustuvių identifikacijos specifikaciją, kad būtų galima gauti informacijos apie šį veislės ID. Pavyzdžiui

expect_before-info-i $ proc

Gali būti suteikta bent viena spawn id specifikacija. Vėliavos-netiesioginis slopina tiesiogines spawn ids, kurios pateikiamos tik iš netiesioginių specifikacijų.

Vietoje spawn id specifikacijos vėliava "-all" sukels "-info" ataskaitą apie visus spawn ids.

Informacijos vėliavos išvestis gali būti pakartotinai naudojama kaip argumentas expect_before.

expect_tty [expect_args]
yra kaip tikiuosi, bet jis skaito simbolius iš / dev / tty (ty vartotojo klaviatūros). Pagal numatytuosius nustatymus skaitymas atliekamas paruoštu režimu. Taigi, linijos turi baigtis grįžti, kad tikėtis juos pamatyti. Tai gali būti pakeista per stty (žr. Žemiau esančią komandą stty ).

expect_user [expect_args]
yra tikėtis, bet jis skaito simbolius iš stdin (ty vartotojo paspaudimai). Pagal numatytuosius nustatymus skaitymas atliekamas paruoštu režimu. Taigi, linijos turi baigtis grįžti, kad tikėtis juos pamatyti. Tai gali būti pakeista per stty (žr. Žemiau esančią komandą stty ).

šakutė
sukuria naują procesą . Naujas procesas yra tiksli dabartinio tikėtino proceso kopija. Sėkmingai šakė grąžina 0 į naują (vaiko) procesą ir grąžina vaiko proceso proceso ID tėvų procesui . Dėl nesėkmės (visada dėl išteklių trūkumo, pvz., Apsikeitimo vietos, atminties), šakutė grąžina -1 į tėvų procesą ir nėra sukurtas vaiko procesas .

Forked procesai išeina per komandą išeiti , kaip ir pirminis procesas . Forked procesai leidžiama rašyti į žurnalo failus. Jei neveikia daugelio procesų derinimo ar prisijungimo, rezultatas gali būti paini.

Kai kuriuos pty diegimus gali supainioti keli skaitytojai ir rašytojai, netgi akimirksniu. Taigi, saugiausia šakutė prieš neršiančių procesų.

bendrauti [string1 body1] ... [stringn [bodyn]]
suteikia dabartiniam procesui valdyti naudotoją, taigi klaviatūros siunčiamos į dabartinį procesą ir grąžinamos dabartinio proceso stdout ir stderr.

Styginių kūno poros gali būti nurodytos kaip argumentai, tokiu atveju kūnas yra vykdomas, kai įvedama atitinkama eilutė. (Numatyta, kad eilutė nėra siunčiama į dabartinį procesą .) Manoma, kad interpretuotojo komanda yra, jei trūksta galutinio kūno.

Jei visam sąveikos teiginiui reikalingi argumentai reikalauja daugiau nei vienos eilutės, visi argumentai gali būti "pritvirtinti" į vieną, kad nebūtų nutraukta kiekviena eilutė su backslash. Šiuo vienu atveju, įprasti Tcl pakeitimai įvyks nepaisant liemenių.

Pavyzdžiui, ši komanda paleidžia sąveiką su šiomis eilučių kūno poromis: kai paspaudžiamas ^ Z, laukiama "Expect". (" -reset" vėliava atkuria terminalo režimus.) Paspaudus "^ A", vartotojas mato "įrašėte" control-A ", o procesas išsiųstas ^ A. Kai paspaudus $, vartotojas mato datą. Kai paspausite ^ C, laukite išėjimų. Jei įvesta "foo", vartotojas mato "juostą". Kai paspausite ~~, " Expect" vertėjas veikia interaktyviai.

nustatyti CTRLZ \ 032 bendrauti {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 (send_user) įvedėte valdiklį-A \ n "; išsiųskite "\ 001") $ {send_user "data yra [laikrodžio formatas [laikrodžio sekundės]]."} \ 003 išeiti foo {send_user "juosta"} ~~}

Styginių kūno porose stygos sutampa tokia tvarka, kokia jie yra išvardyti kaip argumentai. Stygos, kurios iš dalies sutampa, nėra siunčiamos į dabartinį procesą , laukiant likusios ateities. Jei tada simboliai įvesti tokiu būdu, kad nebegalima būti tos pačios rungtynės, tik proceso dalis bus siunčiama tiktai eilutei, kuri negali pradėti kito atitikimo. Taigi, stygos, kurios yra dalinių atitikmenų substrings, gali atitikti vėliau, jei pradinės stygos, kurios bandė rungtyniauti, galiausiai nepavyks.

Pagal numatytuosius žodžius eilučių atitikimas yra tikslus be laukinių kortelių . (Priešingai, laukiama komanda pagal numatytuosius nustatymus naudoja globinio stiliaus schemas.) " -ex" vėliava gali būti naudojama apsaugoti modelius, kurie, priešingu atveju, galėtų suderinti vėliavų keitimą . Bet koks modelis, prasidedantis "-", turėtų būti apsaugotas tokiu būdu. (Visos eilutės, prasidedančios "-", yra rezervuotos būsimoms parinktims.)

Ženklas -re nurodo, kad eilutė turi būti interpretuojama kaip regexp stiliaus raštas. Šiuo atveju, substrys atitinka kintamasis interact_out, panašiai kaip tikisi, kad jo kintamasis expect_out išgaunamas . " Instrukcijų" vėliava taip pat palaikoma.

Modelis eof pateikia veiksmą, kuris vykdomas failo pabaigoje. Atskiras eof modelis taip pat gali atitikti išvesties vėliavėlę, tokiu atveju jis yra suderinamas, jei eOf aptikta rašydamas išvestį. Numatytasis eof veiksmas yra "grįžti", todėl bendraujant tiesiog grįžta į bet kurį EOF.

Modelio laiko nustatymas nurodo laiko pabaigą (sekundėmis) ir veiksmą, kuris atliekamas po to, kai tam tikru laiku nėra perskaitytų simbolių. Laikinosios versijos modelis taikomas vėliausiai nurodytam procesui . Nenustatytas numatytasis laikas. Specialus kintamasis "timeout" (naudojamas tikėtinos komandos) neturi įtakos tam laikui.

Pvz., Šis teiginys gali būti naudojamas autologuojantiems vartotojams, kurie valandą neįvedė, bet vis dar dažnai gauna sisteminius pranešimus:

sąveikauti -input $ user_spawn_id timeout 3600 return-output \ $ nerwn_id

Jei modelis yra raktažodis nulinis , o nuliai yra leidžiami (per komandą remove_nulls ), atitinkamas kūnas yra vykdomas, jei atitinka vieną ASCII 0. Neįmanoma suderinti 0 baitų per glob arba regexp modelius.

Iš anksto sukūrus modelį su vėliavos raidėmis , kintamasis interact_out (spawn_id) nustatomas į spawn_id, kuris atitiko modelį (arba eof).

Tokie veiksmai kaip pertrauka ir tęsinys sukelia kontrolės struktūras (ty, proc ) elgtis įprastu būdu. Tačiau grąžinimo priežastys sąveikauja, kad grįžtų į savo skambinančiojo, o inter_return sukelia sąveiką, kad sukeltų grįžimą savo skambinančiojo. Pavyzdžiui, jei "proc foo" vadinamas " interact", kuris tada įvykdė veiksmą inter_return , proc foo sugrįš. (Tai reiškia, kad jei sąveikauja su skambučių interpretatoriais, interaktyviai spausdindami grįžimą , sąveika tęsis, o inter_return sukels sąveiką, kad grįžtų į skambintoją.)

Per sąveiką , žalias režimas yra naudojamas, kad visi simboliai gali būti perduodami į dabartinį procesą . Jei dabartinis procesas nesulaiko darbo valdymo signalų, jis sustabdomas, jei siunčiamas stabdymo signalas (pagal nutylėjimą ^ Z). Jei norite iš naujo paleisti, išsiųskite tęsti signalą (pvz., "Nužudyti -CONT"). Jei tikrai norite nusiųsti SIGSTOP tokį procesą (pagal ^ Z), pirmiausia apsvarstykite neršimą csh ir paleiskite programą. Kita vertus, jei norite nusiųsti SIGSTOP laukti pats, pirmiausia paskambinkite vertėju (galbūt naudodami pabraukimo simbolį), tada paspauskite ^ Z.

Styginių kūno poros gali būti naudojamos kaip stenograma, siekiant išvengti, kad reikia įvesti vertėją ir vykdyti komandas interaktyviai. Ankstesnio terminalo režimas naudojamas, kai vykdomas styginių kūno poros kūnas.

Greičio atveju veiksmai vykdomi žaliaviniu režimu pagal nutylėjimą. " -reset" vėliava nustato, kad terminalas yra režimas, kurį jis veikė prieš sąveikaudamas, buvo įvykdytas (visada buvo paruoštas režimas). Atkreipkite dėmesį į tai, kad simboliai, įvestos, kai įjungiamas režimas, gali būti prarasti (gaila terminalų tvarkyklės funkcija kai kuriose sistemose). Vienintelė priežastis naudoti -reset yra tai, ar jūsų veiksmas priklauso nuo paruošto režimo veikimo.

Ženklas -echo siunčia simbolius, kurie atitinka šį modelį, atgal į procesą, kuris sukūrė juos, kai skaitoma kiekvienas simbolis. Tai gali būti naudinga, kai vartotojas turi matyti iš dalies įvestų modelių atsiliepimus.

Jei modelis persijungia, bet galiausiai neatitinka, simboliai siunčiami į sukurtą procesą . Jei atsiradęs procesas juos perkaina, vartotojas du kartus pamatys simbolius. -echo tikėtina, kad jis bus tinkamas situacijose, kai vartotojas greičiausiai neužpildys modelio. Pavyzdžiui, ištrauka yra iš rftp, rekursyvo-ftp scenarijaus, kur naudotojas raginamas įvesti ~ g, ~ p arba ~ l, gauti reikiamą katalogą, įdėti jį ar į jį į sąrašą. Tai yra taip toli nuo įprastų ftp komandų, kad vartotojui greičiausiai netyčia įvesti ~ ir nieko kito, išskyrus klaidingą, tokiu atveju jie vis tiek ignoruoja rezultatą.

bendrauti {-echo ~ g (getcurdirectory 1) -echo ~ l (getcurdirectory 0) -echo ~ p (putcurdkeyory}}

" -Nobuffer" vėliava siunčia simbolius, kurie atitinka šį modelį į išvesties procesą, kai skaitmenys skaitomi.

Tai naudinga, kai norite leisti programai atkurti modelį. Pavyzdžiui, toliau nurodyta informacija gali būti naudojama stebint, kur asmuo yra rinkęs numerį ("Hayes" stiliaus modemas). Kiekvieną kartą, kai matysite "atd", scenarijus užregistruos likusią eilutės dalį.

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

Per sąveiką ankstesnis log_user naudojimas ignoruojamas. Visų pirma, bendraujant , priverstinai bus įvesta išvestis (siunčiama į standartinę išvestį), nes manoma, kad vartotojas nenori aklai bendrauti.

" -o" vėliava sukelia bet kokias toliau nurodytas raktų kūno poras, taikomas dabartinio proceso išėjimui. Tai gali būti naudinga, pavyzdžiui, bendraujant su kompiuteriais, kurie siunčia nepageidaujamus simbolius Telnet sesijos metu.

Pagal numatytuosius nustatymus sąveikauti tikisi, kad vartotojas rašys "stdin" ir skaito "Expect" proceso stdout. " -u" vėliava ("naudotojui") sąveikauja, ieškant vartotojo kaip proceso, nurodyto jo argumentu (kuris turi būti sukurtas id).

Tai leidžia sujungti du nesusijusius procesus be aiškios kilpos. Norėdami padėti derinti, tikiuosi, kad diagnostika visada eina į stderr (arba stdout tam tikrai prisijungimo ir derinimo informacijai). Dėl tos pačios priežasties, vertėjas komanda interaktyviai skaito iš stdin.

Pavyzdžiui, šis fragmentas sukuria prisijungimo procesą . Tada jis renka vartotoją (nerodomas) ir pagaliau sujungia abi. Žinoma, visi prisijungimo procesai gali būti pakeisti. Pavyzdžiui, lukštas gali leisti vartotojui dirbti nepateikus paskyros ir slaptažodžio.

spawn login set login $ spawn_id spawn tip modemas # nukreipti atgal į vartotoją # sujungti naudotoją prisijungti bendrauti -u $ login

Norėdami išsiųsti produkciją į kelis procesus, išvardykite kiekvieną spaustuvių identifikatorių sąrašą, iš anksto pažymėtą išvesties vėliava. Įvestis iš išvestinių nerštų idijų grupės gali būti nustatoma spawn id sąrašu, kurį sudaro įvesties vėliava. (Abu įvesties ir išvesties elementai gali būti tokie patys kaip " -i" žyma laukiant komandų sąraše, išskyrus tai, kad bet kuri_spawn_id sąveika nėra prasminga). Visos šios vėliavos ir stygos (arba modeliai) atsiras įvesties ženklas. Jei pasirodo ne -input , -output reiškia "-input $ user_spawn_id -output". (Panašiai ir su modeliais, kurie neturi įvesties .) Jei yra nurodytas vienas -input, jis ignoruoja $ user_spawn_id. Jei nurodomas antrasis įvestis, jis viršija $ spawn_id. Galima nurodyti papildomas įvesties vėliavas.

Du numatytieji įvesties procesai pagal nutylėjimą reiškia, kad jų išvestys nurodytos kaip $ spawn_id ir $ user_spawn_id (atvirkščiai). Jei rodomos įvesties vėliavėlės be išvesties vėliavos, šio proceso simboliai bus atmesti.

" -i" vėliava pakeičia esamą spawn_id, kai nenaudojama jokių kitų įvesties arba išvesties vėliavų. Žymė "-i" reiškia "-o" vėliavą.

Galima keisti procesus, su kuriais susiduriama, naudojant netiesioginius spawn ids. (Netiesioginiai spawn id yra apibūdinami skyriuje apie tikėtiną komandą.) Netiesioginiai spawn ids gali būti nurodyti su-i, -u, -input arba-output flags.

vertėjas [args]
sukelia vartotojui interaktyviai paraginti " Expect" ir "Tcl" komandas. Kiekvienos komandos rezultatas išspausdinamas.

Tokie veiksmai kaip pertrauka ir tęsinys sukelia kontrolės struktūras (ty, proc ) elgtis įprastu būdu. Tačiau grįžimas priverčia vertėją grįžti į savo skambinančiojo, o inter_return sukelia vertėją, kuris sukelia grįžimą savo skambinančiojo. Pavyzdžiui, jei "proc foo" vadinamas interpretuoju, kuris tada įvykdė veiksmą inter_return , proc foo sugrįš. Bet kokia kita komanda verčia verbą toliau raginti naujas komandas.

Numatyta, kad eilutėje yra du sveikieji skaičiai. Pirmasis sveikasis skaičius apibūdina vertinimo kampo gylį (ty, kiek kartų buvo išsiųstas Tcl_Eval). Antrasis sveikasis skaičius yra Tcl istorijos identifikatorius. Parametras gali būti nustatomas apibrėžiant procedūrą, vadinamą "prompt1", kurios grąžinamoji vertė tampa kita eilute. Jei teiginys turi atviras kabutes, parencijas, petnešomis ar skliaustus, antrinis eilutė (pagal nutylėjimą "+>") išduodama naujoje eilutėje. Antrinį greitį galima nustatyti apibrėžiant procedūrą, vadinamą "prompt2".

Vertintojo metu naudojamas virtos režimas, net jei jo skambinančiojo telefonas naudojo žaliavinį režimą.

Jei stdin uždarytas, vertėjas grąžins, nebent bus naudojama "flag-flag", tokiu atveju bus naudojamas vėlesnis argumentas.

log_file [args] [[-a] failas]
Jei pateikiamas failo vardas, failas log_file įrašys seanso s ± ra¹ ± (pradedant tuo ta¹ku). Log_file nustos įrašyti, jei nėra argumentų. Bet koks ankstesnis žurnalo failas yra uždarytas.

Vietoj failo pavadinimo Tcl failo identifikatorius gali būti pateiktas naudojant atvirkštinio arba atvirkštinio žymes . Tai panaši į spawn komandą. (Daugiau informacijos ieškokite spawn ).

" -a" vėliavos jėga reiškia, kad reikia užregistruoti, kuris buvo užblokuotas komandą log_user .

Pagal numatytuosius nustatymus komanda log_file prideda prie senų failų, o ne juos trinasi, kad patogiau būtų galima išjungti ir kelis kartus per vieną seansą. Norėdami sutrumpinti failus, naudokite vėliavėlę -noappenduoti .

" -info" vėliava sukelia log_file grąžinti naujausių neinformuojamų argumentų apibūdinimą.

log_user -info | 0 | 1
Pagal numatytuosius nustatymus dialogas siųsti / laukti įrašomas į stdout (ir logfile, jei jis atidarytas). Prisijungimas prie stdout yra išjungtas komandą "log_user 0" ir vėl įjungta "log_user 1". Prisijungimas prie žurnalo yra nepakeistas.

Informacijos vėliava sukelia log_user grąžinti naujausių neinformuojamų argumentų apibūdinimą.

match_max [-d] [-i spawn_id] [dydis]
apibrėžia buferio dydį (baitais), kurį naudoja viduje tikimasi . Jei nėra dydžio argumentų, grąžinamas dabartinis dydis.

Su -d vėliava nustatomas numatytasis dydis. (Pradinis numatytasis yra 2000 m.). Su -i vėliava, dydis nustatomas pavadintam spawn id, kitaip jis nustatomas dabartiniam procesui .

perdanga [- # spawn_id] [- # spawn_id] [...] programa [args]
vykdo "programas args" vietoj dabartinės Expect programos, kuri baigiasi. Gautas brūkšnio argumentas verčia brūkšnelį prieš komandų pavadinimą, tarsi jis būtų prisijungimo lukštas. Visi spawn_ids yra uždaryti, išskyrus tuos, kurie vadinami argumentais. Jie yra susieti su nurodytais failų identifikatoriais.

Spawn_ids yra susietos su failo identifikatoriais, skirtais paveldėti naują programą. Pavyzdžiui, ši eilutė paleidžia šachmatą ir leidžia kontroliuoti dabartinį procesą, tarkim, šachmatą.

perdanga -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id šachmatai

Tai yra efektyvesnis už "interact -u", tačiau jis aukoja galimybę atlikti programuotą sąveiką, nes " Expect" procesas nebevaldomas.

Atkreipkite dėmesį, kad nėra valdymo terminalo. Taigi, jei atsijungsite arba pakeisite standartinį įvestį, programos, kuriose vykdoma darbo kontrolė (kriauklės, prisijungimas ir tt), netinkamai funkcionuos.

paritetas [-d] [-i spawn_id] [vertė]
apibrėžia, ar paritetas turėtų būti išlaikytas ar pašalintas iš generuojamų procesų rezultatų. Jei vertė yra lygi nuliui, paritetas yra pašalinamas, nes priešingu atveju jis nenuimtas. Jei reikšmės argumentas nėra, dabartinė vertė grąžinama.

Su -d vėliava nustatoma numatytoji pariteto reikšmė. (Pradinis numatytasis yra 1, ty, paritetas nėra išvalytas.) Su -i vėliava, pariteto vertė nustatoma pavadintam spawn id, kitaip jis nustatomas dabartiniam procesui .

remove_nulls [-d] [-i spawn_id] [vertė]
apibrėžia, ar nuliai yra išsaugomi arba pašalinami iš sukurtų procesų išvesties, kol modelis suderinamas arba saugomas kintamasis expect_out arba interact_out . Jei vertė yra 1, nuliai pašalinami. Jei vertė yra 0, nulles nepašalinami. Jei reikšmės argumentas nėra, dabartinė vertė grąžinama.

Su -d vėliava nustatoma numatytoji reikšmė. (Pradinis numatytasis yra 1, ty nulls are removed.) Su -i vėliava, vertė yra nustatyta pavadinimui spawn id, kitaip jis nustatomas dabartiniam procesui .

Nesvarbu, ar nuliai pašalinami, laukite , kad žurnale ir stdout užfiksuos nulinius baitus.

siųskite [-flags] eilutę
Siunčia eilutę į dabartinį procesą . Pavyzdžiui, komanda

siųsti "sveika pasaulis"

siunčia simbolius, "helloworld" į dabartinį procesą . ("Tcl" yra " printf" tipo komanda (vadinama formatu ), kuri gali kurti savavališkai sudėtines eilutes.)

Simboliai siunčiami iš karto, nors programos su linijiniu tašku užpildytu įvestu elementu neskaitys, kol nebus siunčiamas grąžinimo simbolis. Grąžinimo simbolis žymimas "\ r".

"The - flag" verčia kitą argumentą suprasti kaip eilutę, o ne vėliavą. Bet kokia eilutė gali būti prieš "-", ar ji iš tikrųjų atrodo kaip vėliava. Tai užtikrina patikimą mechanizmą, skirtą nurodyti kintamas stygas, netrukdydamas tų, kurie atsitiktinai atrodo kaip vėliavos. (Visos eilutės, prasidedančios "-", yra rezervuotos būsimoms parinktims.)

" -i" vėliava pareiškia, kad eilutė bus siunčiama į pavadintą spawn_id. Jei spawn_id yra user_spawn_id , o terminalas yra neapdorotas, eilutės naujos eilutės verčiamos į "return-newline" sekas, kad jie atrodytų taip, tarsi terminalas būtų paruoštas. Žymė -Raww išjungia šį vertimą.

Nulinė žymė siunčia nulinius simbolius (0 baitų). Pagal nutylėjimą siunčiamas vienas nulis. Visą skaičių gali sekti " -null", kad būtų nurodyta, kiek nulių siųsti.

" Neveikia" vėliava sukuria pertraukos būklę. Tai tik prasminga, jei spawn id reiškia tty įrenginį, atidarytą per "spawn-open". Jei sukėlėte tokį procesą , kaip antspaudas, turėtumėte naudoti "tip" sutartį, kad galėtumėte sukurti pertrauką.

" -i" vėliavos jėgos išvesties siunčiamos "lėtai", taigi išvengiama bendros situacijos, kai kompiuteris išveda įvesties buferį, kuris buvo sukurtas žmogui, kuris niekada nebūtų išimtas tuo pačiu buferiu . Ši išvestis yra kontroliuojama kintamojo "send_slow" vertės, kuris apima dviejų elementų sąrašą. Pirmasis elementas yra sveikasis skaičius, apibūdinantis baitų skaičių atominiu būdu. Antrasis elementas yra tikras skaičius, apibūdinantis sekundžių skaičių, per kurį turi būti atskiriamas atominis signalas. Pavyzdžiui, "set send_slow" (10 .001) "privers" send -s "siųsti eilutes su 1 milisekundėmis tarp kiekvieno iš 10 siunčiamų simbolių.

" -h" žyma reiškia, kad išvestis turi būti išsiųsta (šiek tiek) kaip žmogus, iš tikrųjų rašydamas. Tarp simbolių atsiranda žmogaus panašūs vėlavimai. (Šis algoritmas remiasi "Weibull" paskirstymu, kurio pakeitimai atitinka konkrečią taikomąją programą.) Šią produkciją valdo kintamasis "send_human", kuris apima penkių elementų sąrašą. Pirmieji du elementai yra vidutinis simbolių interraviumas per sekundes. Pirmasis naudojamas pagal nutylėjimą. Antrasis naudojamas žodžių pabaigoje, kad būtų imituojamos subtilios pauzės, kurios retkarčiais atsiranda tokiuose perėjimuose. Trečiasis parametras yra kintamumo matas, kai .1 yra gana kintamas, 1 yra pagrįstai kintamasis, o 10 yra gana nesikeičiamas. Galūnės yra nuo 0 iki begalybės. Paskutiniai du parametrai yra atitinkamai mažiausias ir didžiausias tarpinis laikas. Mažiausias ir didžiausias naudojamas paskutinis ir "klipas" paskutinį kartą. Galutinis vidurkis gali labai skirtis nuo nurodyto vidurkio, jei minimalus ir didžiausias klipas pakankamai vertingas.

Pavyzdžiui, ši komanda imituos greitą ir nuoseklią mašinistą:

set send_human (.1 .3 1 .05 2) siųsti -h "Aš alkanas. Darykime pietus".

o pogiriai gali būti tinkamesni:

set send_human (.4 .4 .2 .5 100) siųsti -h "Goodd party lash night!"

Atminkite, kad klaidos nėra imituojamos, tačiau galite patys nustatyti klaidų taisymo situacijas, įtraukdami klaidas ir pataisymus siuntimo argumentuose.

Nulinių simbolių siuntimo vėliavos, pertraukos siuntimo, lėto išvesties įvedimo ir žmogaus formos išvesties, yra viena išimčių. Bus naudojamas tik vienas nurodytas paskutinis. Be to, nulinių simbolių ar pertraukų siuntimui negalima nurodyti jokių eilučių argumentų su vėliavomis.

Tai yra gera idėja prieš pirmą nusiųsti į procesą tikėtis . Tikėtis laukia proceso pradžios, o siuntimo negalės. Visų pirma, jei pirmasis siuntimas baigia prieš pradedant procesą , galite išvengti duomenų praradimo. Tais atvejais, kai interaktyviosios programos nesiūlo jokio pradinio greitojo pokalbio, prieš jus galite siųsti vėlavimą, kaip:

# Siekiant išvengti, kad įsilaužėliai nepateiks patarimų, kaip įsilaužti, # ši sistema nerodo išorinio slaptažodžio. # Palaukite 5 sekundes, kol exec užpildys spawn telnet very.secure.gov miego 5 siųsti slaptažodį

exp_send yra siuntimo slapyvardis . Jei Tk aplinkoje naudojate Expectk arba kitą variantą Expect, siųskite apibrėžiamas Tk visiškai kitokiu tikslu. Aplinkos suderinamumui yra numatyta exp_send . Panašios slapyvardžiai yra numatyti kitoms "Expect" kitoms siuntimo komandoms.

send_error [-flags] string
yra kaip siųsti , išskyrus tai, kad produkcija siunčiama į stderr, o ne dabartinį procesą .

send_log [-] eilutė
yra kaip siųsti , išskyrus tai, kad eilutė yra siunčiama tik į žurnalo failą (žr. log_file .) Argumentai yra ignoruojami, jei nėra žurnalo failo.

siųsti_tty [-flags] eilutė
yra kaip siųsti , išskyrus tai, kad produkcija siunčiama į / dev / tty, o ne dabartinį procesą .

send_user [-flags] eilutė
yra kaip siųsti , išskyrus tai, kad produkcija siunčiama į stdout, o ne pagal dabartinį procesą .

miego sekundes
sukelia scenarijų miegoti tam tikrą sekundžių skaičių. Sekundės gali būti dešimtainis skaičius. Pertraukimai (ir Tk įvykiai, jei naudojate Expectk) yra apdorojami, o tikisi, kad miega.

spawn [args] programa [args]
sukuria naują procesą, kuriame veikia "programos args". Jo stdin, stdout ir stderr yra prijungti prie "Expect", kad juos būtų galima perskaityti ir parašyti kitomis " Expect" komandomis. Ryšys yra sugadintas ar uždaromas, arba pats procesas uždaro bet kurį failo identifikatorių.

Kai procesas prasideda spawn , kintamasis spawn_id nustatomas į deskriptorių, susijusį su tuo procesu . " Spawn_id" aprašytas procesas laikomas "dabartiniu procesu ". Spawn_id gali būti skaitoma arba parašyta, iš tikrųjų suteikiant darbo kontrolę.

user_spawn_id yra globalus kintamasis, kuriame yra deskriptorius, kuris nurodo naudotoją. Pavyzdžiui, kai spawn_id nustatytas į šią vertę, tikėtis elgsis kaip expect_user .

.I error_spawn_id yra globalus kintamasis, kuriame yra deskriptorius, kuris nurodo standartinę klaidą. Pavyzdžiui, kai spawn_id nustatytas į šią vertę, siuntimas elgiasi kaip " send_error" .

tty_spawn_id yra globalinis kintamasis, kuriame yra deskriptorius, kuris nurodo / dev / tty. Jei / dev / tty neegzistuoja (pvz., Cron, at, arba partijos scenarijus), tada tty_spawn_id nėra apibrėžta. Tai gali būti išbandyta kaip:

jei {[info vars tty_spawn_id]} {# / dev / tty egzistuoja} else {# / dev / tty neegzistuoja # tikriausiai cron, partijos ar scenarijaus}

spawn grąžina UNIX proceso id. Jei procesas nėra sukurtas, 0 grąžinamas. Kintamasis spawn_out (vergas, vardas) yra nustatytas kaip pty slave įrenginio pavadinimas.

Pagal numatytuosius nustatymus, spawn atsiranda komandos pavadinimas ir argumentai. Nuo to nedarant, " noecho" vėliava sustoja.

"Console" vėliava reiškia, kad konsolės išvestis bus peradresuota į sukurtą procesą . Tai nėra palaikoma visose sistemose.

Viduje nerštukas naudoja pty, inicializuotas taip pat, kaip vartotojo tty. Tai dar kartą inicijuojama taip, kad visi nustatymai yra "normalūs" (pagal stty (1)). Jei yra nustatytas kintamasis stty_init , jis yra interpretuojamas kaip stty argumentų kaip papildoma konfigūracija. Pavyzdžiui, "nustatytas stty_init žaliavinis" bus toliau generuojamų procesų terminalai pradėti žaliaviniu režimu. -nottycopy praleidžia inicializavimą pagal vartotojo tty. -notieji praleidžia "normalus" iniciacijos.

Paprastai spawnas užima mažai laiko, kad būtų įvykdyta. Jei pastebėjote, kad neršia daug laiko, tai tikriausiai susiduria su kliūtimis. Siekiant išvengti klaidinančių procesų, atliekami keli testai. (Tai užtrunka 10 sekundžių už kiekvieną suspaustą kt.) Veikia Laukiama, kai parinktis -d parodys, jei lauke "Expect" susiduriama su daugybe ptys nepakartojoje būsenoje. Jei negalite nužudyti procesų, prie kurių pridedami šie ptys, jūsų vienintelis būdas gali būti iš naujo paleisti.

Jei programa nesėkminga, nes exec (2) nepavyksta (pvz., Kai programa neegzistuoja), klaidos pranešimas bus grąžintas kito sąveikaujančio arba numatomo komandos, tarsi programa būtų paleista, ir pateikia klaidos pranešimą kaip išvestį. Šis elgesys yra natūralus neršto įgyvendinimo rezultatas. Viduje šerkšnies šakutės, po kurios atsiradęs procesas negali bendrauti su pradiniu tikėtino proceso, išskyrus ryšį per spawn_id.

Atvirkštinė vėliava lemia, kad kitas argumentas turi būti interpretuojamas kaip Tcl failo identifikatorius (ty grąžintas atidarius ). Tada spawn id gali būti naudojamas taip, tarsi jis būtų sukurtas procesas . (Failo identifikatorius nebeturėtų būti naudojamas.) Tai leidžia apdoroti žaliuosius įrenginius, failus ir vamzdynus kaip sukurtus procesus, nenaudojant pty. 0 grąžinamas norint parodyti, kad nėra susijusio proceso . Kai ryšys su sukurtu procesu yra uždarytas, taip pat yra Tcl failo identifikatorius. Atvirkštinė atvaizdo vėliava yra panaši į -open, išskyrus tai, kad -leaveopen sukelia failo identifikatoriaus atidarymą net tada, kai uždaromas spawn id.

" -pty" vėliava sukelia "pty" atidarymą, bet procesas nėra sukurtas. 0 grąžinamas norint parodyti, kad nėra susijusio proceso . Spawn_id nustatytas kaip įprasta.

Kintamasis spawn_out (slave, fd) yra nustatytas kaip failo identifikatorius, atitinkantis pty slave. Jis gali būti uždarytas naudojant "close-slave".

Ženkliukas -ignore žymi signalą, kurį reikia ignoruoti sukurtu procesu . Priešingu atveju signalai gauna numatytąjį elgesį. Signalai vadinami gaudyklių komandoje, išskyrus tai, kad kiekvienam signalui reikalinga atskira vėliava.

strace lygis
Prieš pradedant versijas, atsiranda nurodymų, kuriuos reikia išspausdinti. ("Tcl" maršruto komandų kryptys atsekamųjų.) Lygis rodo, kiek toli žemyn skambučio kampe atsekti. Pavyzdžiui, paleidus sekančią komandą laukite " Tikėtis" , atskleidžiant pirmuosius 4 skambučių lygius, bet jų nėra.

tikėtis-c "strace 4" script.exp

" -info" vėliava sukelia "Strace" grąžinti naujausių neinformuojamų argumentų aprašymą.

stty args
keičia terminalų režimus panašiai kaip išorinė komanda stty.

Pagal numatytuosius nustatymus pasiekiamas valdymo terminalas. Prie kitų terminalų galima susipažinti, pridedant "Statuso užklausos grąžina ją kaip komandos rezultatą. Jei statuso neprašoma ir prieiga prie valdymo terminalo, ankstesnis neapdorotų ir echo atributų statusas grąžinamas į formą, kuri vėliau gali būti naudoja komanda.

Pavyzdžiui, argumentai neapdoroti arba suvynioti į terminalą į žaliavinį režimą. Argumentai -raw arba pagaminti įterpia terminalą į paruoštą režimą. Argumentai echo ir -echo nukreipia terminą atitinkamai į echo ir noecho režimą.

Toliau pateiktas pavyzdys iliustruoja, kaip laikinai išjungti echo. Tai gali būti naudojama kitais būdais - automatiniais scenarijais, kad būtų išvengta jų įterpimo. (Žiūrėkite daugiau diskusijų šiuo klausimu žemiau esančiame lauke EXPECT HINTS).

stty -echo send_user "Slaptažodis:" expect_user -re "(. *) \ n" nustatyti slaptažodį $ expect_out (1, string) stty echo

sistemos args
duoda args prie sh (1) kaip įvesties, tarsi jis būtų įvestas kaip komanda iš terminalo. Laukiama laukti, kol lukštais nebus. Grąžinimo statusas iš sh yra tvarkomas taip pat, kaip exec vykdo grąžinimo statusą.

Skirtingai nuo exec, kuris nukreipia stdin ir stdout į scenarijų, sistema neprivalo atlikti peradresavimo (išskyrus tą, kurį nurodo pati eilutė). Taigi, galima naudoti programas, kurios turi tiesiogiai bendrauti su / dev / tty. Dėl tos pačios priežasties sistemos rezultatai nėra įrašomi žurnale.

laiko žymuo [args]
grąžina laiko žymę. Be jokių argumentų, sekundžių skaičius nuo epochos grąžinimo.

Žyma " formatas" įveda grąžinamą eilutę, bet pakeičiamas pagal "POSIX" taisykles strftime. Pavyzdžiui,% a pakeičiamas trumpuoju savaitės pavadinimu (ty, šeštadieniais). Kiti yra:

% a sutrumpintas savaitės pavadinimas% Pilnas savaitės pavadinimas% b sutrumpintas mėnuo pavadinimas% B pilnas mėnuo pavadinimas% c datos laikas kaip: Wed Oct 6 11:45:56 1993% d mėnesio diena (01-31% H valandos (00-23)% I valandą (01-12)% j dieną (001-366)% m mėnuo (01-12)% M minutė (00-59)% p am arba pm% S antra (00-61) % u diena (1-7, pirmadienis yra pirmoji savaitės diena)% U savaitė (00-53, pirmas sekmadienis yra pirmoji pirmosios savaitės diena)% V savaitė (01-53, ISO 8601 stilius)% dienos diena (0- 6)% W savaitė (00-53, pirmas pirmadienis yra pirmas pirmos savaitės diena)% x datos laikas kaip: Wed Oct 6 1993% X laikas: 23:59:59% y metų (00-99) % Y metai kaip: 1993% Z laiko juostos (arba nieko, jei neįmanoma nustatyti) %% neužpildytas procentas ženklas

Kiti% specifikacijos yra neapibrėžtos. Kiti simboliai bus perduodami per nepaliestą. Palaikoma tik C kalba.

" -seconds" vėliava įveda keletą sekundžių, nes epocha turi būti naudojamas kaip šaltinis, iš kurio formatuoti. Priešingu atveju naudojamas dabartinis laikas.

" -gmt" vėliava išleidžia laiko žymę, kad galėtumėte naudoti GMT laiko juostą. Be žymos, naudojamas vietinis laiko juostas.

gaudyklė [[command] signalai]
lemia, kad ši komanda bus vykdoma, kai bus gautas bet kuris iš nurodytų signalų ateityje. Komanda vykdoma visame pasaulyje. Jei komanda nėra, signalo veiksmas grąžinamas. Jei komanda yra eilutė SIG_IGN, signalai ignoruojami. Jei komanda yra eilutė SIG_DFL, signalai yra sistemos numatytasis rezultatas. signalai yra arba vienas signalas, arba signalų sąrašas. Signalai gali būti nurodyti skaičiais arba simboliškai pagal signalą (3). "SIG" prefiksas gali būti praleistas.

Nesant argumentų (ar argumentų-numerių), gaudyklė grąžina šiuo metu vykdomos gaudyklės komandos signalo numerį.

Kodo vėliava naudoja komandos grąžinimo kodą vietoj bet kurio kodo, kurį Tcl turėjo grįžti, kai pradinė komanda pradėjo veikti.

" -interp" vėliava reiškia, kad komandą reikia vertinti naudodamiesi vertėjo, aktyviu tuo metu, kai komanda pradėjo veikti, o ne tada, kai buvo paskelbta spąstai.

Ženklo vardas sukelia gaudyklės komandą grąžinti šiuo metu vykdomos gaudyklės komandos signalo pavadinimą.

Didžiausia žyma sukelia gaudyklės komandą grąžinti didžiausią galimą nustatyti signalo numerį.

Pavyzdžiui, komanda "trap (send_user" Ouch! ") SIGINT spausdins" Ouch! " kiekvieną kartą, kai vartotojas paspaudžia ^ C.

Pagal numatytuosius nustatymus SIGINT (kuris paprastai gali būti generuojamas paspaudus ^ C) ir SIGTERM priežastis Tikėtis išeiti. Taip yra dėl šios spąstos, sukurtos pagal numatytuosius nustatymus, kai laukiama "Tikėtis".

spąstai išeiti {SIGINT SIGTERM}

Jei norite paleisti debugerį naudodamas -D vėliavą, SIGINT iš naujo apibrėžiamas, norint pradėti interaktyvų debugerį. Taip yra dėl šios spąstelės:

gaudyklė {exp_debug 1} SIGINT

Nutlerio spąstus galima pakeisti nustatant aplinkos kintamąjį EXPECT_DEBUG_INIT į naują gaudyklės komandą.

Galite, žinoma, anuliuoti abu šiuos, tiesiog pridėdami gaudyklės komandas į scenarijų. Visų pirma, jei turite savo "spąstų išvažiavimą SIGINT", tai pakeis debugerio spąstus. Tai naudinga, jei norite, kad vartotojai nenukentėtų į visus debugerius.

Jei norite nustatyti savo spąstus SIGINT, bet paleisti debugerį vis dar spąstais, naudokite:

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

Arba galite sugadinti į debugerį naudodami kitą signalą.

spąstai neleis jums perimti SIGALRM veiksmo, nes tai naudojama viduje, kad tiktų . Atšaukimo komanda nustato SIGALRM į SIG_IGN (ignoruoja). Galite iš naujo įjungti šį veiksmą tol, kol jį išjungsite paskesnių spaustuvių komandų metu.

Norėdami gauti daugiau informacijos, žr. Signalą (3).

laukti [args]
vėluojama, kol bus sukurtas procesas (arba dabartinis procesas, jei nė vienas nėra nurodytas).

palaukite, paprastai grąžina keturių sveikųjų skaičių sąrašą. Pirmasis sveikasis skaičius yra proceso, kuris buvo laukiamas, pid. Antras sveikasis skaičius yra atitinkamas spawn id. Trečias sveikasis skaičius yra -1, jei įvyko operacinės sistemos klaida, arba 0 kitaip. Jei trečiasis sveikasis skaičius buvo 0, ketvirtasis sveikasis skaičius yra sugadintas proceso sugadintas statusas. Jei trečiasis sveikasis skaičius buvo -1, ketvirtasis sveikasis skaičius yra operacinės sistemos nustatytas errno dydis. Taip pat yra nustatytas globalus kintamas klaidos kodas.

Grąžinamos vertės pabaigoje gali pasirodyti papildomi elementai nuo laukimo . Neprivalomas penktasis elementas identifikuoja informacijos klasę. Šiuo metu vienintelis galimas šio elemento vertės yra CHILDKILLED, tokiu atveju kitos dvi reikšmės yra C stiliaus signalo pavadinimas ir trumpas teksto aprašymas.

" -i" vėliava deklaruoja procesą laukti, atitinkantį pavadintą spawn_id (ne proceso ID). SIGCHLD tvarkytojo viduje galima laukti bet kokio kūnas, naudojant spawn id -1.

Ženklas -nowait sukelia laukti, kol grįžta iš karto, nurodant sėkmingą palaukti. Kai procesas baigiasi (vėliau), jis automatiškai išnyks, nereikės aiškiai laukti.

Laukimo komanda taip pat gali būti naudojama laukiant proceso, kuriame naudojami argumentai "-i -1". Skirtingai nuo jos naudojimo su sukurtais procesais, ši komanda gali būti vykdoma bet kuriuo metu. Nebuvo kontroliuojamas, koks procesas bus panaudotas. Tačiau grįžtamąją vertę galima patikrinti proceso ID.

BIBLIOTEKOS

Tikėtis, kad automatiškai žino apie dvi įmontuotas bibliotekas laukiantiems scenarijus. Tai apibrėžiami katalogai, nurodyti kintamose exp_library ir exp_exec_library. Abi turi turėti naudingų failų, kuriuos gali naudoti kiti scenarijai.

exp_library yra architektūros nepriklausomų failų. exp_exec_library yra architektūros priklausomi failai. Priklausomai nuo jūsų sistemos, abu katalogai gali būti visiškai tušti. Failo $ exp_exec_library / cat-buffer egzistavimas aprašo, ar jūsų / bin / cat buferiai yra numatytieji.

GERIAUSIAS SPAUSDINIMAS

Vgrind apibrėžimas galimas gana spausdinti tikėtis scenarijus. Darant prielaidą, kad "Expect" paskirstymas pateikiamas su "vgrind" apibrėžtimi, jis gali būti naudojamas kaip:

vgrind - atvirkštinis failas

PAVYZDŽIAI

Daugeliui nėra akivaizdu, kaip viską išdėstyti, kaip apibūdina žmogus . Aš siūlau jums perskaityti ir išbandyti pavyzdžių kataloge " Tikėtis platinimo". Kai kurie iš jų yra tikrosios programos. Kiti paprasčiausiai parodo tam tikrus metodus, ir, žinoma, pora yra tiesiog greitas. INSTALL failas turi greitą šių programų apžvalgą.

" Expect papers" (taip pat žiūrėkite TAIP PAT ŽR.) Taip pat naudingi. Nors kai kuriuose dokumentuose naudojama sintaksė, atitinkanti ankstesnes "Expect" versijas, pridedamos priežastys vis dar galioja ir yra daug išsamesnės nei šis žmogaus puslapis.

CAVEATS

Plėtiniai gali susidurti su "Expect" komandų pavadinimais. Pavyzdžiui, siųsti yra apibrėžiamas Tk visiškai kitokiu tikslu. Dėl šios priežasties daugelis laukiamų komandų taip pat yra "exp_XXXX". Komandos ir kintamieji, prasidedantys "exp", "inter", "spawn" ir "timeout", neturi slapyvardžių. Naudokite išplėstinius komandų pavadinimus, jei jums reikia šio aplinkos suderinamumo.

Tikėtis yra gana liberalus požiūris į apimtį. Visų pirma, kintamieji, skaitomi komandoms, būdingoms " Expect" programai, pirmiausia bus ieškomi pagal vietinę taikymo sritį, o jei jų nerandama, visame pasaulyje. Pavyzdžiui, tai pašalina poreikį nustatyti "globalų laiką" kiekvienoje jūsų parašytoje procedūroje, kurioje tikimasi . Kita vertus, parašyti kintamieji visada yra lokaliai (nebent buvo išleista "globali" komanda). Dažniausiai tokia problema kyla, kai procedūros metu įvykdoma spaustuvė. Be procedūros, spawn_id nebėra, todėl atsiradęs procesas nebėra prieinamas tik dėl apimties. Pridėkite "globalų spawn_id" prie tokios procedūros.

Jei negalite įjungti daugiapakopės funkcijos (ty jūsų sistema nepalaiko nei pasirinkimo (BSD *. *), Apklausos (SVR> 2), nei kažko panašaus), tikėtis galės valdyti tik vieną procesą vienu metu. Tokiu atveju nebandykite nustatyti spawn_id , taip pat neturėtumėte vykdyti procesų per exec, kol veikia sukurtas procesas . Be to, tuo pačiu metu negalėsite tikėtis iš kelių procesų (įskaitant naudotoją kaip vieną).

Terminalo parametrai gali turėti didelį poveikį scenarijus. Pavyzdžiui, jei scenarijus yra parašytas norint ieškoti echoingumo, jis bus blogai veikiamas, jei echoing bus išjungtas. Dėl šios priežasties "Expect" pagal numatytuosius parametrus reikalauja tinkamų terminalo parametrų. Deja, tai gali padaryti nemalonų kitų programų atžvilgiu. Pavyzdžiui, emacs lukštais norima pakeisti "įprastą" atvaizdavimą: "newlines" yra susietos su naujomis eilutėmis, o ne "carriage-return" naujomis eilutėmis, o echoing yra išjungtas. Tai leidžia naudoti emacs, norint redaguoti įvesties liniją. Deja, "Expect" to negalima spėti.

Galite reikalauti, kad tikėtina, kad neatsisakytų jo numatytų terminalo parametrų, bet tuomet esi labai atsargus rašydamas tokioms aplinkoms scenarijus. Emacs atveju vengiama priklausomai nuo to, kaip reaguoja ir pabaigos eilučių atvaizdavimai.

Komandos, kurios priėmė argumentus, įtrauktus į vieną sąrašą ( tikėtini variantai ir sąveikaujantys ), naudoja euristiką, kad nuspręstų, ar sąrašas iš tikrųjų yra vienas ar keli argumentai. Eirizmas gali žlugti tik tuo atveju, kai iš tikrųjų šis sąrašas yra vienas argumentas, kuriame yra keletas įterptųjų \ n su ne tarpai tarp simbolių. Tai atrodo pakankamai neįtikėtina, tačiau argumentas "-nobrace" gali būti naudojamas priversti vieną argumentą tvarkyti kaip vieną argumentą. Galbūt tai gali būti naudojama su kompiuteriu generuojamu laukimo kodu. Panašiai "judėjimas" verčia vieną argumentą tvarkyti kaip kelis modelius / veiksmus.

KLAIDAS

Tai buvo labai viliojanti pavadinti programą "seksas" ("Smart EXec" arba "Send-EXpect"), tačiau vyravo gera prasme (ar galbūt tiesiog puritonizmas).

Kai kuriose sistemose, atsiradus lukštui, skundžiasi, kad negalima pasiekti tty, bet vis tiek veikia. Tai reiškia, kad jūsų sistemoje yra mechanizmas, leidžiantis įgyti kontrolinį tty, kurio tikimasi apie tai nežino. Prašau sužinoti, kas tai yra, ir grąžinkite šią informaciją man.

"Ultrix 4.1" (bent jau naujausios versijos, esančios čia) mano, kad daugiau kaip 1000000 atidėjimų yra lygiaverčiai 0.

Skaitmeninis UNIX 4.0A (ir tikriausiai kitos versijos) atsisako priskirti ptys, jei nustatysite SIGCHLD tvarkytoją. Daugiau informacijos rasite tinklapyje.

"IRIX 6.0" neteisingai tvarko "pty" leidimus, todėl jei "Expect" bando paskirstyti ktk, kurį anksčiau naudojo kažkas kitas, tai nepavyksta. Atnaujinkite iki IRIX 6.1.

Telnet (patvirtinta tik pagal SunOS 4.1.2) pakimba, jei nenustatytas TERM. Tai yra problema pagal Cron, CGI scenarijus ir CGI, kurie nenustato TERM. Taigi, jūs turite tai aiškiai nustatyti - kokio tipo paprastai nesvarbu. Tai turi būti tik kažkas! Daugeliu atvejų tai gali pakakti.

nustatyti env (TERM) vt100

Patarimas (patikrintas tik pagal BSDI BSD / OS 3.1 i386) pakimba, jei nenustatytos SHELL ir HOME. Tai yra problema pagal Cron , CGI scenarijus ir CGI scenarijus, kurie neapibrėžia šių aplinkos kintamųjų. Taigi, jūs turite juos aiškiai nustatyti - kokio tipo paprastai nesvarbu. Tai turi būti tik kažkas! Daugeliu atvejų tai gali pakakti.

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

Kai kurie "ptys" įdiegimai yra suprojektuoti taip, kad po to, kai procesas uždarė failo deskriptorių, branduolys išstumia bet kurią neskaitytą išvestį po 10 iki 15 sekundžių (faktinis skaičius priklauso nuo įgyvendinimo). Taigi tikėtis tokių programų kaip

nerimo data miegas 20 tikėtis

nepavyks. Norėdami to išvengti, naudokite neinteraktyvias programas su exec, o ne spawn . Nors tokios situacijos yra įmanomos, praktikoje aš niekada nebuvo susidūręs su situacija, kai galutinis iš tiesų interaktyvios programos rezultatas būtų prarastas dėl tokio elgesio.

Kita vertus, "Cray UNICOS" pašalina bet kokią neskaitytą produkciją iš karto po to, kai procesas uždaro failo deskriptorių. Aš pranešiau apie tai Cray'ui ir jie stengiasi išspręsti.

Kartais tarp greito ir atsakymo reikalingas delsimas, pvz., Kai "tty" sąsaja keičia UART nustatymus arba atitinkančius bodų dažnius, ieškodama pradžios / pabaigos bitų. Paprastai visa tai reikalauja miegoti antras ar du. Tvirtesnis būdas yra bandyti dar kartą, kol aparatūra pasirengusi priimti įvestį. Šiame pavyzdyje naudojamos abi strategijos:

siųsti "greitis 9600"; miegas 1 tikisi {timeout (siųsti "\ r"; exp_continue} $ prompt

trap-code neveiks su bet kokia komanda, kuri sėdi Tcl įvykių cikle, pavyzdžiui, miego. Problema ta, kad įvykio cikle Tcl atmetė kodus iš async įvykių tvarkytojų. Apdorojimo būdas - nustatyti vėliavėlę į spąstų kodą. Tada patikrinkite vėliavą iš karto po komandos (ty miego).

"Expect_background" komanda ignoruoja laiko argumentus ir apskritai neturi jokių terminų sąvokos.

& # 34; EXPECT HINTS & # 34;

Yra keletas dalykų, susijusių su " Expect", kuris gali būti ne intuityvus. Šiame skyriuje bandoma išspręsti kai kuriuos šiuos dalykus keliais pasiūlymais.

Paprasta tikėtis, kad problema yra tai, kaip atpažinti "shell" instrukcijas. Kadangi jie skirtingai pritaikomi skirtingai, žmonės ir skirtingos kriauklės, rlogin automatiškai automatiškai gali būti sunku nežinant greito. Protinga yra tai, kad vartotojai saugo įprastinę išraišką, nurodydami greitą (ypač jo pabaigą) aplinkos kintamąjį EXPECT_PROMPT. Galima naudoti tokį kodą kaip šis. Jei EXPECT_PROMPT neegzistuoja, vis tiek yra gerų galimybių tinkamai funkcionuoti.

nustatyti greitą "(% | # | \\ $) $"; # numatytoji eilutė catch {nustatyti eilutę $ env (EXPECT_PROMPT)} tikėtis -re $ greita

Raginu jums parašyti tikėtinus modelius, kurie apimtų bet kokį tikėjimą. Taip išvengiama galimybės atsakyti į klausimą prieš pamatydami visą dalyką. Be to, nors jūs galbūt galėsite atsakyti į klausimus prieš pamatydami juos visiškai, jei atsakysite anksti, jūsų atsakymas gali būti pakartotas klausimo viduryje. Kitaip tariant, susidariusysis dialogas bus teisingas, bet bus išbandytas.

Daugelyje eilučių priskiriamas tarpo simbolis pabaigoje. Pavyzdžiui, ftp eilutė yra "f", "t", "p", ">" ir. Kad atitiktumėte šį raginimą, turite atsiskaityti už kiekvieną iš šių simbolių. Tai dažna klaida netaikyti tuščiajai medžiagai. Įdėkite blanką aiškiai.

Jei naudojate X * formos modelį, "*" atitiks visą iš X pabaigos gaunamą produkciją iki paskutinio gauto daikto. Tai skamba intuityviai, bet gali būti šiek tiek paini, nes frazė "paskutinis dalykas, gauta" gali skirtis priklausomai nuo kompiuterio greičio ir I / O apdorojimo tiek branduolio, tiek įrenginio tvarkyklės.

Visų pirma, žmonės linkę pamatyti programos išvestį, atvykstantį į didžiulius fragmentus (atomiškai), kai iš tikrųjų dauguma programų tuo pačiu metu išveda vieną eilutę. Darant prielaidą, ankstesnėje pastraipoje esantis modelis * gali atitikti tik dabartinės linijos pabaigą, nors atrodo, kad yra daugiau, nes rungtynių metu tai buvo visa gaunama produkcija.

tikimės , kad nėra jokio būdo sužinoti, kad ateityje bus pasiekta daugiau rezultatų, išskyrus tuos atvejus, kai jūsų modelis konkrečiai jį paskirsto.

Net priklausomai nuo linijinės orientacijos buferizavimas yra neprotingas. Programos ne tik atlieka pažadus apie buferinės sistemos tipą, bet ir sistemos virškinimo sutrikimas gali sulaužyti išvesties linijas taip, kad linijos rodomos atrodo atsitiktinėse vietose. Taigi, jei jūs galite išreikšti paskutinius keletą greitojo rašmenų rašant modelius, būtų protinga tai padaryti.

Jei laukiate modelio paskutiniame programos išeityje, o programa išleis kažką kito, jūs negalėsite tai aptikti naudojant " timeout" raktinį žodį. Priežastis yra tai, kad tikimasi , kad nebus laiko - o bus gauti eof indikaciją. Vietoj to naudokite. Dar geriau, naudokite abi. Tokiu būdu, jei ši eilutė kada nors perkelta, jums nereikės redaguoti pačios eilutės.

Naujos eilutės dažniausiai konvertuojamos į vežimėlio grąžinimą, linijinio eigos seką, kai terminalo tvarkyklė išveda. Taigi, jei norite, kad modelis, kuris aiškiai atitiktų dvi eilutes, nuo, tarkim, printf ("foo \ nbar"), turėtumėte naudoti modelį "foo \ r \ nbar".

Panašus vertimas atsiranda, skaitant iš vartotojo, naudojant expect_user . Šiuo atveju, kai paspausite grįžti, jis bus išverstas į naują eilutę. Jei tikitės, tada pereisite į programą, kuri nustato terminalą žaliaviniam režimui (pvz., Telnet), bus problema, nes programa tikisi tikrosios grąžos. (Kai kurios programos iš tikrųjų atleidžia, nes jie automatiškai išvers naują eilutę į grįžtamąjį ryšį, bet dauguma to nedaro). Deja, nėra galimybės sužinoti, ar programa įvedė terminalą į neapdorotą režimą.

Užuot rankiniu būdu pakeisti naujus eilutes su grąžinais, sprendimas yra naudoti komandą "stty raw", kuri sustabdo vertimą. Nepamirškite, kad tai reiškia, kad jums nebebus gauti paruoštų redagavimo funkcijų.

sąveika netiesiogiai nustato jūsų terminalą žaliaviniu režimu, taigi ši problema nebus iškilusi.

Dažnai naudinga saugoti slaptažodžius (arba kitą privačią informaciją) lauke " Tikėtini scenarijai". Tai nerekomenduojama, nes nieko, kuris saugomas kompiuteryje, gali būti prieinamas visiems. Taigi interaktyviai paskatinus slaptažodžius iš scenarijaus yra protingesne idėja nei įterpti juos pažodžiui. Nepaisant to, kartais toks įterpimas yra vienintelė galimybė.

Deja, UNIX failų sistema neturi tiesioginio scenarijų kūrimo, kurie yra vykdomi, bet neįskaitomi. Sistemos, kurios palaiko "setgid shell" scenarijus, gali netiesiogiai imituoti tai taip:

Sukurkite laukimo scenarijų (kuriame yra slapti duomenys) kaip įprasta. Leidimų skaičius turi būti 750 (-rwxr-x ---) ir priklauso patikimos grupės, ty grupės, kuriai leidžiama ją perskaityti. Jei reikia, sukurkite naują grupę. Tada sukurkite scenarijų / bin / sh su leidimais 2751 (-rwxr-s-x), priklausančiais tai pačiai grupei kaip ir anksčiau.

Rezultatas yra scenarijus, kurį gali atlikti (ir skaityti) bet kas. Paskui jis paleidžia tikėtiną scenarijų.

& # 34; TAIP PAT ŽR. & # 34;

Tcl (3), libexpect (3)
"Išnagrinėti tikėtis:" Tcl pagrįstas priemonių rinkinys interaktyvių programų automatizavimui " , Don Libesas, 602 p., ISBN 1-56592-090-2," O'Reilly and Associates ", 1995.
" Tikėkitės: išgydykite tuos nekontroliuojamus interaktyvumo požymius " Don Libes , 1990 m. birželio 11-15 d. Anaheimo, Kalifornijos konferencija "USENIX".
"Aš naudoju tikėtis automatizuoti sistemos administravimo uždavinius", kurį pateikė Don Libes, 1990 m. Spalio 19-17 d., 1990 m. Spalio 19-19 d., "USENIX Large Installation Systems Administration Conference", Colorado Springs, Colorado Springsas.
"Aš" Tcl: "Embedcable Command Language" John Ousterhout, Proceedings of the Winter 1990 USENIX Conference, Washington, DC, January 22-26, 1990. "Aš tikiu: scenarijus kontroliuoti interaktyvių programų" Don Libes, Computing Systems , T. 4, Nr. 2, Kalifornijos spaudos universiteto žurnalai, 1991 m. Lapkritis. "Dvigubas Libesas", 1992 vasaros "USENIX" konferencija, p. 135-144, San Antonijas, TX, "Regresijos testavimas ir atitikties testų interaktyviosios programos" 1992 m. Birželio 12-15 d. "Kibitz - Daugkartinės interaktyvios programos sujungimas", Don Libes, "Software - Practice & Experience", John Wiley & Sons, West Sussex, Anglija, Vol.

23, Nr. 5, 1993 m. Gegužė, 1993 m., "Tvarkyklė už Tcl taikymams", Don Libes, 1993 m. Tcl / Tk seminaras, Berkeley, CA, 1993-11-10.

AUTHOR

Don Libes, Nacionalinis standartų ir technologijų institutas

PATVIRTINIMAI

Dėkojame John Ousterhout už Tcl ir Scott Paisley už įkvėpimą. Dėkojame Rob Savoye už "Expect" automatinio konfigūravimo kodą.

"HISTORY" failas nurodo daugelį tikėtinų pokyčių. Tai įdomu skaityti ir gali suteikti jums daugiau informacijos apie šią programinę įrangą. Dėkoju tiems žmonėms, kurie atsiuntė man klaidų pataisymus ir davė kitą pagalbą.

"Expect" projektavimą ir įgyvendinimą iš dalies sumokėjo JAV vyriausybė ir todėl yra vieša. Tačiau autorius ir NIST norėtų gauti kreditą, jei ši programa ir dokumentai ar jų dalys yra naudojamos.