Linux / Unix-komento odottaa

Odotetaan, että ohjelma käsittelee muita interaktiivisia ohjelmia skriptin mukaan. Käsikirjoituksen jälkeen Expect tietää, mitä ohjelmasta voidaan odottaa ja mikä oikea vastaus on. Tulkittu kieli tarjoaa haarautumisen ja korkean tason ohjausrakenteet ohjaamaan dialogia. Lisäksi käyttäjä voi hallita ja toimia vuorovaikutuksessa suoraan halutulla tavalla ja palauttaa sen jälkeen komentosarjan.

Expectk on yhdistelmä Expect ja Tk. Se käyttäytyy aivan kuten odottaa ja Tk: n toive. Odota voidaan käyttää myös suoraan C tai C ++ ilman Tcl: ää.

Nimi "Odottaa" tulee käsitteestä lähettää / odottaa sekvenssejä, joita uucp, kermit ja muut modeemiohjausohjelmat suosittivat. Kuitenkin toisin kuin uucp, Expect on yleistetty niin, että sitä voidaan käyttää käyttäjäkohtaisena komennona minkä tahansa ohjelman ja tehtävän mielessä. Odottaa voi puhua useille ohjelmille samanaikaisesti.

Mitä odottaa voivansa tehdä

Esimerkiksi tässä on joitakin asioita, joita odottaa komento voi tehdä:

On olemassa useita syitä, miksi kuori ei pysty suorittamaan näitä tehtäviä. Kaikki ovat mahdollisia odottaa.

Yleensä Expect on hyödyllinen minkä tahansa ohjelman suorittamiseen, joka edellyttää vuorovaikutusta ohjelman ja käyttäjän välillä. Tarvitaan vain, että vuorovaikutusta voidaan karakterisoida ohjelmallisesti. Odotettavissa voi myös antaa takaisin ohjauksen käyttäjälle pysäyttämättä ohjelmaa ohjattavaksi. Samoin käyttäjä voi palauttaa ohjauksen komentosarjalle milloin tahansa.

Käyttö

Odottaa lukee cmdfile listalle suorittavat komennot. Odotetaan, että niitä voidaan käyttää implisiittisesti järjestelmiin, jotka tukevat #! merkinnällä merkitsemällä komentosarja suoritettavaksi ja tekemällä komentorivin ensimmäisellä rivillä:

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

Tietenkin polku on kuvattava tarkasti, missä odottaa elää. / usr / local / bin on vain esimerkki.

-c-lippu esikentää komennon, joka on suoritettava ennen komentoa. Komento tulisi mainita estääkseen sen, että kuori murtautuu. Tätä vaihtoehtoa voidaan käyttää useita kertoja. Useita komentoja voidaan suorittaa yhdellä -c: llä erottamalla ne puolipisteillä. Komennot suoritetaan siinä järjestyksessä kuin ne näkyvät. Käytettäessä Expectkia tämä vaihtoehto määritellään -komennoksi.

-d-lippu mahdollistaa joitain vianmääritystuloksia, jotka kertovat ensisijaisesti sellaisten komentojen sisäisestä toiminnasta kuin odottaa ja vuorovaikutteisesti. Tämä lippu on sama kuin "exp_internal 1" Expect-komentosarjan alussa, ja Expect-version versio tulostetaan.

-D-lippu mahdollistaa interaktiivisen virheenkorjaajan. Tällöin tulee olla kokonaisluku. Debuggeri ottaa hallinnan ennen seuraavaa Tcl-menettelyä, jos arvo ei ole nolla tai jos ^ C on painettu tai breakpoint on osuma tai jokin muu asianmukainen virheenkorjauskomento ilmestyy käsikirjoituksessa. Käytettäessä Expectkia tämä vaihtoehto on määritetty nimellä - Debug.

-f-lippu esikentää tiedoston, josta lukea komentoja. Lippu itsessään on valinnainen, koska se on vain hyödyllistä käytettäessä #! merkintä, niin että muita argumentteja voidaan toimittaa komentoriville. Käytettäessä Expectkia tämä vaihtoehto määritellään -fileksi.

Oletuksena komentotiedosto luetaan muistiin ja toteutetaan kokonaisuudessaan. On toisinaan toivottavaa lukea tiedostoja yhdellä rivillä kerrallaan. Jotta pakotettaisiin mielivaltaisia ​​tiedostoja käsiteltäväksi tällä tavalla, käytä -b-lippua. Käytettäessä Expectkia, tämä vaihtoehto määritetään -puhelimeksi.

Jos merkkijono "-" toimitetaan tiedostonimenä, sen sijasta lukee tavallinen tulo. Käytä "./-" lukea tiedostoa nimeltä "-".

-i-lipun syyt Odottavat, että komennot komennetaan vuorovaikutteisesti sen sijaan, että ne lukisivat ne tiedostosta. Kutsu päättyy poistokomennon tai EOF: n kautta. -i lippu oletetaan, jos komentotiedostoa tai -c ei ole käytössä. Käytettäessä Expectkia tämä vaihtoehto määritellään -interaktiiviseksi.

- voidaan käyttää rajojen lopettamiseen. Tämä on hyödyllistä, jos haluat välittää optiomallin argumentin käsikirjoituksestasi ilman, että odottaa sitä. Tämä voidaan kätevästi sijoittaa #! line estää odottamattoman tulkinnan lippua. Esimerkiksi seuraavat jättävät alkuperäiset argumentit, mukaan lukien skriptin nimi variaatiossa argv .

#! / usr / local / bin / expect -

Huomaa, että tavanomaisia getopt (3) ja execve (2) -käytäntöjä on noudatettava lisäämällä argumentteja #! linja.

Tiedosto $ exp_library / expect.rc hankitaan automaattisesti, jos se on läsnä, ellei N-lippua käytetä. (Käytettäessä Expectkia, tämä vaihtoehto on määritetty nimellä -NORC.) Välittömästi tämän jälkeen tiedosto ~ / .expect.rc saadaan automaattisesti, ellei -n-lippua käytetä. Jos DOTDIR-ympäristömuuttuja on määritetty, sitä käsitellään hakemistona ja .expect.rc luetaan siellä. Käytettäessä Expectkia tämä vaihtoehto on määritetty -norciksi. Tämä hankinta tapahtuu vasta sen jälkeen, kun suoritetaan mitään -c-lippuja.

-v-syyt Odottaa tulostaa versionumeron ja poistua. Vastaava lipun Expectkissa, joka käyttää pitkää lipun nimeä, on -versio.

Valinnainen argumentti luodaan luetteloon ja tallennetaan muuttujalle nimeltä argv ja. argc alustetaan argv: n pituuteen.

Argv0 määritellään komentosarjan nimeen tai binaariin, jos komentosarjaa ei käytetä. Seuraavassa tulostetaan esimerkiksi käsikirjoituksen nimi ja kolme ensimmäistä argumenttia:

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

komennot

Odota käyttää työkalun komentokieltä. Tcl tarjoaa ohjauksen virtauksen (jos, katkeaa), lausekkeen arviointi ja useita muita ominaisuuksia, kuten rekursiota ja prosessin määrittelyä. Komentoja, joita ei ole määritelty (asetettu, jos, exec) ovat Tcl-komentoja. Odottaa tukee muita komentoja. Jollei toisin mainita, komennot palauttavat tyhjä merkkijonon.

Komennot on lueteltu aakkosjärjestyksessä, jotta ne voidaan sijoittaa nopeasti. Uudet käyttäjät saattavat kuitenkin helpommin aloittaa lukemalla kutsujen, lähetysten, odotusten ja vuorovaikutusten kuvaukset tässä järjestyksessä.

sulje [-selaus] [-onexec 0 | 1] [-i spawn_id]

sulkee yhteyden nykyiseen prosessiin . Useimmat interaktiiviset ohjelmat havaitsevat EOF : n niiden stdin ja exit: niin lähellä tavallisesti riittää myös tappaa prosessi . -i lippu ilmoittaa, että prosessi sulkeutuu vastaamaan nimettyä spawn_id.

Molemmat odottavat ja toimivat vuorovaikutuksessa havaitsevat, milloin nykyinen prosessi poistuu ja implisiittisesti sulkeutuu, mutta jos menetät prosessin esimerkiksi sanoilla "exec kill $ pid", sinun täytyy nimenomaisesti soittaa lähelle .

-onexec-lippu määrittää, onko kutujakso suljettu mistä tahansa uudesta kutuutetusta prosessista tai jos prosessi on päällystetty. Jätä uusi kutu auki, käytä arvoa 0. Muu kuin nollan kokonaisluvun arvo pakottaa kutunsa sulkeutumaan uusissa prosesseissa.

-lave-lippu sulkee isännän, joka liittyy kutujakaan. Kun yhteys suljetaan, orja suljetaan automaattisesti myös, jos se on vielä auki.

Riippumatta siitä, onko yhteys suljettu epäsuorasti tai eksplisiittisesti, sinun pitäisi soittaa, odottaa, että poistetaan vastaava ydinprosessi. Sulkeutuva komento ei anna odotustilaa, koska ei ole takeita siitä, että prosessiliitännän sulkeminen aiheuttaa sen lopettamisen.

debug [[-now] 0 | 1]

ohjaa Tcl-vianmääritysohjelmaa, jonka avulla voit selata lausekkeita ja asettaa raja-arvot.

Jos argumentteja ei ole, 1 palautetaan, jos debuggeri ei ole käynnissä, muuten 0 palautetaan.

1-argumentilla debuggeri käynnistetään. 0-argumentilla debuggeri pysäytetään. Jos 1-argumenttia edeltää -now flag, debugger käynnistyy välittömästi. Muutoin debuggeri käynnistetään seuraavalla Tcl-lausunnolla.

Debug-komento ei muuta lukkoja. Vertaa tätä aloittaaksesi odottaa -D-lippua.

Disconnect-komento irrottaa haarukkaprosessin päätelaitteesta . Se jatkuu taustalla. Prosessille annetaan oma prosessiryhmä. Standardi I / O ohjataan / dev / nulliksi .

Seuraava fragmentti käyttää yhteyden katkaisemista, jotta komentojonoa jatketaan taustalla.

jos {[fork]! = 0} poistuu irti. . .

Seuraava käsikirjoitus lukee salasanan ja suorittaa sen joka tunti, joka vaatii salasanan joka kerta, kun sitä ajetaan. Skripti antaa salasanan, joten sinun tarvitsee vain kirjoittaa se kerran.

send_user "salasana? \" expect_user -re "(. *) \ n" for {} 1 {} {if {[fork]! = 0} {sleep 3600; 1, merkkijono) \ r ". . . poistu}

Etuna kuoren asynkronisen prosessiominaisuuden (&) yli tapahtuvan irrottamisen käyttämisen kanssa on, että odottaa voi tallentaa päätelaitteen parametrit ennen irtikytkemistä ja sitten soveltaa niitä myöhemmin uuteen ptys-järjestelmään. With &, Expect ei ole mahdollisuutta lukea päätelaitteen parametreja, koska päätelaite on jo katkaistu, kun odottaa, että odottaa ohjausta.

poistu [-opts] [tila]

odottaa poistua tai muuten valmistautua tekemään niin.

-onexit- lippu aiheuttaa seuraavan argumentin käyttämisen poistumiskäsittelijänä. Ilman argumenttia, nykyinen poistumiskäsittelijä palautetaan.

-nonexit- lippu aiheuttaa odottaa valmistautua poistumaan, mutta lopettaa todellisen ohjauksen palauttaminen käyttöjärjestelmään. Käyttäjän määrittelemä poistokäsittelijä suoritetaan sekä odottaa omaa sisäistä käsittelijää. Ei enää odottaa komentoja olisi suoritettava. Tämä on hyödyllistä, jos käytät odottaa muiden Tcl-laajennusten kanssa. Nykyinen tulkki (ja pääikkuna, jos Tk-ympäristössä) säilyvät niin, että muut Tcl-laajennukset voivat puhdistaa. Jos Expectin poistumista kutsutaan uudelleen (mutta tämä saattaa ilmetä), käsittelijät eivät toistu uudelleen.

Poistuessaan kaikki yhteydet kutsuihin ovat suljettuina. Sulkeminen havaitaan EOF: ksi kutsuvien prosessien avulla. poistuminen ei tee muita toimenpiteitä kuin tavallinen _exit (2) -menetelmä. Siten kutomatut prosessit, jotka eivät tarkista EOF: ää, voivat jatkaa toimintaansa. (Erilaiset olosuhteet ovat tärkeitä esimerkiksi sen määrittämiseksi, mitä signaaleja kutsuun prosessiin lähetetään, mutta nämä ovat järjestelmän riippuvuuksia, tyypillisesti dokumentoituna poistumisen (3) alla.) Init: n periytyvät prosessoidut prosessit.

status (tai 0, jos ei ole määritetty) palautetaan Expectin poistumistilaksi. exit poistetaan implisiittisesti, jos komentosarjan loppu on saavutettu.

exp_continue [-continue_timer]
Komennolla exp_continue odottaa itsensä jatkaa suorittamista sen sijaan, että palaa normaalisti. Oletusarvon mukaan exp_continue nollaa aikakatkaisun ajastimen. -continue_timer- lippu estää ajastimen uudelleenkäynnistyksen. (Katso lisätietoja.)

exp_internal [-f-tiedosto] -arvo
aiheuttaa lisäkomentoja lähettää vianmääritystiedot sisäpuolelle odottaa stderr- arvoa, jos arvo ei ole nolla. Tämä lähtö on pois käytöstä, jos arvo on 0. Diagnostiikkatiedot sisältävät jokaisen vastaanotetun merkin ja jokaisen yrityksen, joka on tehnyt vastaamaan nykyistä lähtöä kuviin.

Jos valinnaista tiedostoa toimitetaan, kaikki normaalit ja virheenkorjauslähdöt kirjoitetaan kyseiseen tiedostoon (riippumatta arvon arvosta ). Kaikki aiemmat vianmääritystiedostot on suljettu.

-info- lipun avulla exp_internal palauttaa kuvauksen tuoreimmista ei-info-argumentteista.

exp_open [args] [-i spawn_id]
palauttaa Tcl-tiedostunnisteen, joka vastaa alkuperäistä kutualuetta. Tiedostunnistetta voidaan käyttää sitten kuin se avautui Tcl: n avoimella komennolla. (Kutama tunnusta ei tule enää käyttää. Odota ei saa suorittaa.

-leaveopen- lippu jättää kutu-id avoimeksi pääsyä odottaa komentoja. Odotus on suoritettava roskan tunnuksella.

exp_pid [-i spawn_id]
palauttaa prosessin id, joka vastaa tällä hetkellä syntynyttä prosessia. Jos käytetään -i- lippua, palautettu pid vastaa kyseisen kutevan tunnisteen arvoa.

exp_send
on alias lähetettäväksi .

exp_send_error
on alias send_errorille .

exp_send_log
on alias send_logille .

exp_send_tty
on alias send_ttyille .

exp_send_user
on alias send_userille .

exp_version [[-exit] versio]
on hyödyllinen sen varmistamiseksi, että käsikirjoitus on yhteensopiva Expectin nykyisen version kanssa.

Ilman argumentteja Expectin nykyinen versio palautetaan. Tämä versio voidaan sitten koodata käsikirjassasi. Jos tiedät itse, että et käytä viimeisimpien versioiden ominaisuuksia, voit määrittää aiemman version.

Versiot koostuvat kolmesta numerosta, jotka on erotettu pisteillä. Ensimmäinen on suurin numero. Expect- version versiot, jotka on kirjoitettu eri suurella numerolla, eivät varmasti toimi. exp_version palauttaa virheen, jos suurimmat numerot eivät täsmää.

Toinen on pieni numero. Skriptit, jotka on kirjoitettu versioon, jolla on pienempi määrä kuin nykyinen versio, voivat olla riippuvaisia ​​uudesta ominaisuudesta, ja ne eivät ehkä toimi. exp_version palauttaa virheen, jos suuret numerot vastaavat, mutta komentosarjan vähäinen luku on suurempi kuin odotetun odottaa .

Kolmas on numero, jolla ei ole mitään osaa versiovertailussa. Sitä kuitenkin kasvatetaan, kun odotetaan ohjelmiston jakautumista muutetaan millään tavalla, kuten lisädokumentaation tai optimoinnin avulla. Se nollataan 0 uudelle pienemmälle versiolle.

Exit- lippua odottaa Expect tulostaa virheen ja poistuu, jos versio on vanhentunut.

odottaa [[-opts] pat1 body1] ... [-opts] patn [bodyn]
odottaa, kunnes jokin kuvioista vastaa kutustetun prosessin tuotos, tietyn ajan kuluttua tai tiedoston loppu on näkyvissä. Jos lopullinen elin on tyhjä, se voidaan jättää pois.

Viimeisimmän odotuskomitean mallit implisiittisesti käytetään ennen muita malleja. Viimeisimmän expect_after- komennon mallit implisiittisesti käytetään minkä tahansa muun mallin jälkeen.

Jos koko odotuslausekkeen argumentit vaativat useamman kuin yhden rivin, kaikki argumentit voidaan "sulauttaa" yhdeksi niin, että vältetään kunkin rivin lopettaminen vastakkaisella kielellä. Tässä tapauksessa tavanomaiset Tcl-substituutit tapahtuvat rintaliiveistä huolimatta.

Jos kuvio on avainsana eof , vastaava elin suoritetaan tiedoston loppuessa. Jos kuvio on avainsanan aikakatkaisu , vastaava elin suoritetaan aikakatkaisun jälkeen. Jos aikakatkaisun avainsanaa ei käytetä, implisiittinen nollaustoiminto suoritetaan aikakatkaisun aikana. Oletusajanjakso on 10 sekuntia, mutta se voidaan asettaa esimerkiksi 30: een komennolla "asetettu aikakatkaisu 30". Lopullinen aikakatkaisu voidaan nimetä arvolla -1. Jos kuvio on avainsanan oletusarvo , vastaava elin suoritetaan joko aikakatkaisun tai loppu-tiedoston jälkeen.

Jos kuvio täsmää, vastaava kappale suoritetaan. odottaa palauttaa kehon tuloksen (tai tyhjän merkkijonon, jos kuvio ei vastaa). Jos useat kuvakkeet sopivat yhteen, sitä käytetään ensin valitsemaan keho.

Joka kerta, kun uusi tuotos saapuu, sitä verrataan kuhunkin kuvioon siinä järjestyksessä kuin ne on lueteltu. Siksi voit testata ottelun poissaoloa tekemällä viimeisen mallin, jolla jotain taatusti ilmestyy, kuten kehote. Tilanteissa, joissa ei ole kehotetta, sinun on käytettävä aikakatkaisua (aivan kuten jos olisit vuorovaikutuksessa manuaalisesti).

Mallit on määritetty kolmella tavalla. Oletusarvon mukaan kuvioita määritellään kuten Tcl: n merkkijono- komennolla. (Tällaiset mallit ovat myös samanlaisia ​​kuin C-kuoren säännölliset ilmaisut, joita yleensä kutsutaan "glob" -malleiksi). -gl- lippua voidaan käyttää sellaisten kuvioiden suojaamiseen, jotka muutoin vastaavat odotuslippuja . Kaikki "-" -alkuisesta kuvioista tulisi suojata tällä tavoin. (Kaikki merkkijonot, jotka alkavat "-", varataan tuleville vaihtoehdoille.)

Esimerkiksi seuraava kappale etsii onnistuneen kirjautumisen. (Huomaa, että keskeytyksen oletetaan olevan muussa käsikirjoituksessa määritelty menettely.)

odottaa {busy {asettaa varattu \ n; exp_continue} epäonnistui keskeyttää "virheellinen salasana" keskeyttää aikakatkaisu keskeytetty kytketty}

Lainaukset ovat välttämättömiä neljännellä kuvioinnilla, koska siinä on tilaa, joka muutoin erottaa kuvion toiminnosta. Samat toiminnot (kuten kolmas ja neljäs) vaativat, että toiminnot luetellaan uudelleen. Tämä voidaan välttää käyttämällä regexp-tyyppisiä kuvioita (katso alla). Tcl-käsikirjasta löytyy lisää tietoa globaalien kuvioiden muodostamisesta.

Regexp-tyylirakenteet noudattavat Tcl: n regexpin (lyhytaikaista "säännöllistä ilmaisua") käsittelevää syntaksia. regexp-kuviot otetaan käyttöön lipun -re kanssa . Edellinen esimerkki voidaan kirjoittaa käyttäen regexp: tä seuraavasti:

odottaa {busy {asettaa varattu \ n; exp_continue} -re "epäonnistui | virheellinen salasana" keskeytys aikakatkaisu keskeytetty kytketty}

Kummankin tyyppiset kuviot ovat "ankkuroitumattomia". Tämä tarkoittaa, että kuvioiden ei tarvitse olla koko merkkijono, mutta ne voivat alkaa ja lopettaa ottelun missä tahansa merkkijono (niin kauan kuin kaikki muut vastaavat). Käytä ^ vastaamaan merkkijonon alkua ja $ vastaamaan loppua. Huomaa, että jos et odota merkkijoukkojen loppua, vastauksesi voivat helposti päätyä merkkijonon keskelle, kun ne kerätään uudestaan. Vaikka tuottaa edelleen oikeita tuloksia, tuotos voi näyttää luonnottomalta. Näin ollen $: n käyttöä kannustetaan, jos voit tarkasti kuvata merkkejä merkkijonon lopussa.

Huomaa, että monissa editorissa ^ ja $ vastaavat rivien alkua ja loppua. Koska odotukset eivät kuitenkaan ole linja-suuntaisia, nämä merkit sopivat vastaavan puskurin odottamassa olevan datan alkuun ja loppuun (toisin kuin rivit). (Katso myös alla oleva huomautus "systeemihäiriöistä".)

-ex- lippu saa mallin sovituksi "tarkaksi" merkkijonoksi. Ei *, ^ jne. Tulkinta tehdään (vaikka tavallisia Tcl-konventiona on vielä noudatettava). Täsmälliset kuviot ovat aina ankkuroitumattomia.

Nollapisteen lippu merkitsee ulostulon isojen kirjainten vertailua ikään kuin ne olisivat pieniä merkkejä. Kuvio ei vaikuta.

Lukemisen aikana yli 2000 tavua voi pakottaa aikaisemmat tavut "unohtumaan". Tätä voidaan muuttaa funktiolla match_max . (Huomaa, että liian suuret arvot voivat hidastaa kuvion sovitinta .) Jos patlisto on full_buffer , vastaava elin suoritetaan, jos match_max tavua on vastaanotettu eikä muita kuvioita ole sovitettu. Käytetäänkö full_buffer- avainsanaa, unohdetut merkit kirjoitetaan expect_out (puskuri).

Jos patlistin avainsana on nolla ja nullit sallitaan ( remove_nulls -komennolla), vastaava elin suoritetaan, jos yhden ASCII 0: n arvo on sovitettu. Ei ole mahdollista vastata 0 tavua glob- tai regexp-mallien kautta.

Kun kuvio (tai eof tai full_buffer) on sovitettu, kaikki vastaava ja aiemmin vertaansa vailla oleva tuotos tallennetaan muuttujalle expect_out (puskuri) . Jopa 9 regexp-merkkijoukko tallennetaan muuttujiin expect_out (1, merkkijono) expect_out (9, merkkijono) kautta . Jos -indeksin lippua käytetään ennen kuviointia, 10 merkkijonon alkamis- ja päättymisindeksit (muodossa, joka sopii lantaan ) säilytetään muuttujissa expect_out (X, start) ja expect_out (X, end), jossa X on numero vastaa substraattikohdetta puskurissa. 0 viittaa merkkijonoihin, jotka sopivat koko kuvioon ja muodostetaan glob-malleille sekä regexp-malleille. Jos esimerkiksi prosessi tuottaa "abcdefgh \ n" -tuotteen, tulos:

odottaa "cd"

on ikään kuin seuraavat toteumat olisi toteutettu:

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

ja "efgh \ n" on jäljellä lähtöpuskurissa. Jos prosessi tuotti tuotoksen "abbbcabkkkka \ n", tulos:

odottaa -indeksit -re "b (b *). * (k +)"

on ikään kuin seuraavat toteumat olisi toteutettu:

set expect_out (0, aloita) 1 set expect_out (0, loppu) 10 set expect_out (0, merkkijono) bbbcabkkkk set expect_out (1, aloita) 2 set expect_out (1, loppu) 3 set expect_out (1, merkkijono) bb set expect_out (2, aloita) 10 set expect_out (2, loppu) 10 set expect_out (2, merkkijono) k set expect_out (puskuri) abbbcabkkkk

ja "a \ n" on jäljellä lähtöpuskurissa. Kuvio "*" (ja -re ". *") Tasoittaa tulostuspuskuria lukematta prosessin tuottoa.

Tavallisesti vastaava lähtö hylätään Expectin sisäisistä puskureista. Tämä voidaan estää esittämällä mallia, jossa on -notransfer lippu. Tämä lippu on erityisen hyödyllinen kokeilemisessa (ja sitä voidaan lyhentää "-not" helpottamaan kokeilemista).

Matching-lähdöstä (tai eof tai full_buffer) liittyvä kutu id on tallennettu expect_out (spawn_id) .

-Timeout- lippu aiheuttaa nykyisen odotuskomennon käyttämään seuraavaa arvoa aikakatkaisuna aikakatkaisu-muuttujan arvon sijasta.

Oletusarvon mukaan kuvioihin on sovitettu nykyisen prosessin lähdöstä, mutta -i lippu ilmoittaa, että nimetty spawn_id-listan tuotos on sovitettu vastaaviin kuvioihin (seuraavaan -i asti ). Spawn_id-luettelon pitäisi olla joko välilyönnillä erotettu spawn_ids-luettelo tai muuttuja, joka viittaa tällaiseen spawn_ids-luetteloon.

Esimerkiksi seuraava esimerkki odottaa nykyisestä prosessista "liitetty" tai "varattu", "epäonnistunut" tai "virheellinen salasana" $ proc2: n nimellä nimetystä spawn_idistä.

odottaa {-i $ proc2 kiireinen {asettaa varattuin \ n; exp_continue} -re "epäonnistui | virheellinen salasana" keskeytys aikakatkaisu keskeytetty kytketty}

Globaalin muuttujan arvoa any_spawn_id voidaan käyttää vastaamaan malleja mille tahansa spawn_idsille, jotka on nimetty kaikkien muiden -i- lippujen kanssa nykyisessä odotettavissa olevassa komennossa. Se, että -i- lippu, jolla ei ole siihen liittyvää mallia (eli jota seuraa välittömästi toinen -i ), saa minkä tahansa muun mallin saataville samassa odotuskomennossa, johon liittyy any_spawn_id.

-i- lippu voi myös nimetä globaalin muuttujan, jolloin muuttuja luetaan listalle kutuviestejä. Muuttuja kertoo aina, kun se muuttuu. Tämä antaa keinon muuttaa I / O-lähdettä komennon suorittamisen aikana. Sillä tavalla annettuja spawn-tunnuksia kutsutaan "epäsuoriksi" kutujäljiksi.

Toimet, kuten tauko ja jatkuvuus, aiheuttavat valvontarakenteita (esim. Proc ) käyttäytymistä tavalliseen tapaan. Komennolla exp_continue odottaa itsensä jatkaa suorittamista sen sijaan, että palaa normaalisti.

Tämä on hyödyllistä välttääkseen selkeät silmukat tai toistuvat odotetut lausunnot. Seuraava esimerkki on osa fragmenttia rlogin automatisoimiseksi. Exp_continue välttää, että kirjoitat toisen odotetun lauseen (etsimään kehotetta uudelleen), jos rlogin kysyy salasanaa.

odottaa {salasana: {stty -echo send_user "salasana ($ käyttäjälle) $ host:" expect_user -re "(. *) \ n" send_user "\ n" lähetä "$ expect_out (1, merkkijono) \ r" echo {send_user \ "yhteys isäntään epäonnistui: $ expect_out (puskuri)" exit} - poistuminen} echo exp_continue} virheellinen {send_user "virheellinen salasana tai tili \ n" exit} timeout {send_user " re $ prompt}

Esimerkiksi seuraava fragmentti voi auttaa oppaassa vuorovaikutusta, joka on jo täysin automatisoitu. Tällöin päätelaite asetetaan raakamuotoiseksi. Jos käyttäjä painaa "+", muuttujaa kasvatetaan. Jos painetaan "p", prosessiin lähetetään useita palautusvaihtoehtoja, ehkäpä itkemään sitä jollakin tavalla, ja "i" antaa käyttäjälle mahdollisuuden toimia vuorovaikutuksessa prosessin kanssa, tehokkaasti varastaen ohjattavan komentosarjan. Kussakin tapauksessa exp_continue sallii nykyisen odottaa jatkaa kuvion sovittamista suorituksen jälkeen.

stty raw -echo expect_after {-i $ user_spawn_id "p" {lähetä "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {vuorovaikutuksessa; exp_continue} "lopeta" poistuminen}

Oletusarvon mukaan exp_continue nollaa aikakatkaisun ajastimen. Ajastinta ei käynnisty uudelleen, jos exp_continue kutsutaan -continue_timer -liittymällä .

expect_after [expect_args]
toimii samalla tavoin kuin odottaa, paitsi että jos molempien odottavat ja expect_after -mallit sopivat yhteen, käytetään odottamallia . Katso lisätietoja odotuskomentosta .

expect_background [expect_args]
ottaa samat argumentit kuin odottaa , mutta se palaa välittömästi. Mallit testataan aina, kun uusi syöttö saapuu. Mallin aikakatkaisu ja oletusarvo ovat merkityksettömiä odottaa takaisin ja ne hylätään hiljaa. Muussa tapauksessa expect_background -komento käyttää expect_before ja expect_after kuviot kuten odottaa .

Kun odotushälytystoimia arvioidaan, saman kutukoodin taustakäsittely estetään. Taustatekniikka on estetty, kun toiminto on valmis. Vaikka taustakäsittely on estetty, on mahdollista tehdä (etualalla) odotus samasta kutualueesta.

Odotusta ei voi suorittaa odotettaessa, että odotushäiriö on estetty. expect_background tietylle kutu-id: lle poistetaan ilmoittamalla uusi odotusalue, jolla on sama kutukohde. Ilmoittavien odotushuoneiden, joilla ei ole mallia, poistetaan tietyn kutevan tunnuksen taustalla olevien mallien yhteensopivuudesta.

odottaa ennen [expect_args]
ottaa samat argumentit kuin odottaa , mutta se palaa välittömästi. Viimeisimpien odotusten odotukset ennen samaa kutehakemistoa lisätään implisiittisesti seuraaviin odotettavissa oleviin komentoihin. Jos kuvio täsmää, sitä käsitellään ikään kuin se olisi määritelty odotuskomennossa itse ja siihen liittyvä elin suoritetaan odotuskomennon yhteydessä. Jos molempien odottavat ja odotetut mallit voivat olla yhteensopivia, käytetään odotettua ennen mallia.

Jos mikään kuvio ei ole määritetty, kutukohtaa ei ole valittu mihinkään kuvioon.

Ellei yliviivaa -i- lippua, odota , ennenkuin mallit ottivat vastakkain spawn-id: n kanssa määritettynä ajankohtana, jonka odotus ennen komentoa suoritettiin (ei silloin, kun sen malli on sovitettu).

-info-lippu saa odottaa ennen palata nykyiset määritykset, millä kuvioilla se sopii. Oletusarvoisesti se raportoi nykyisestä kutualueesta. Valinnaisen kutee-tunnuksen määrittely voidaan antaa kyseisen kutevan tunnuksen tietoja varten. Esimerkiksi

expect_before -info -i $ proc

Enintään korkeintaan voidaan antaa yksi kutuviestin tunnus. Lippu-välillinen tukahduttaa suorat kutuviivat, jotka tulevat vain epäsuorista spesifikaatioista.

Kutable-tunnuksen määrittelyn sijasta lippu "-all" saa "-info" raportoimaan kaikista kutuviesteistä.

-info-lipun tuotos voidaan käyttää uudestaan ​​argumentiksi odottaa ennen.

expect_tty [expect_args]
on kuin odottaa, mutta se lukee merkkejä / dev / tty (ts. näppäimen painallukset käyttäjältä). Oletusarvoisesti lukeminen suoritetaan keitetyössä. Niinpä riveillä on lopetettava palautus, jotta he odottavat näkevänsä heidät. Tätä voidaan muuttaa sttyn kautta (ks. Alla oleva stty- komento).

expect_user [expect_args]
on kuin odottaa, mutta se lukee merkkejä stdin (ts. näppäimen painallukset käyttäjältä). Oletusarvoisesti lukeminen suoritetaan keitetyössä. Niinpä riveillä on lopetettava palautus, jotta he odottavat näkevänsä heidät. Tätä voidaan muuttaa sttyn kautta (ks. Alla oleva stty- komento).

haarukka
luo uuden prosessin . Uusi prosessi on tarkka kopio nykyisestä odottaa prosessia . Menestyksen jälkeen haarukka palauttaa 0: n uuteen (lapsi) prosessiin ja palauttaa lapsiprosessin prosessin tunnuksen emoprosessiin. Jos epäonnistuu (poikkeuksetta resurssien puutteen, esim. Swap-tilan, muistin vuoksi), haarukka palauttaa -1: n vanhemman prosessiin , eikä lapsiprosessia luotu.

Suljetut prosessit poistuvat poistokomennon kautta aivan kuten alkuperäisessä prosessissa . Haarukoidut prosessit sallitaan kirjoittaa lokitiedostoihin. Jos et poista virheenkorjausta tai kirjaudu useimpiin prosesseihin, tulos voi olla hämmentävä.

Useat lukijat ja kirjoittajat voivat sekoittaa joitain pty-toteutuksia, jopa hetkellisesti. Siten se on turvallisin haarukkapula ennen kudontaprosesseja.

vuorovaikutuksessa [string1 body1] ... [stringn [bodyn]]
antaa nykyisen prosessin hallinnan käyttäjälle, niin että näppäinpainallukset lähetetään nykyiseen prosessiin ja nykyisen prosessin stdout ja stderr palautetaan.

String-kehon paria voidaan määrittää argumentteina, jolloin keho suoritetaan, kun vastaava merkkijono syötetään. (Oletusarvoisesti merkkijonoa ei lähetetä nykyiseen prosessiin .) Tulkki komento oletetaan, jos lopullinen elin puuttuu.

Jos koko vuorovaikutteisen lauseen argumentit vaativat useamman kuin yhden rivin, kaikki argumentit voidaan "sulauttaa" yhteen, jotta vältetään kunkin rivin lopettaminen vastakkaisella kielellä. Tässä tapauksessa tavanomaiset Tcl-substituutit tapahtuvat rintaliiveistä huolimatta.

Esimerkiksi seuraava komento toimii toimimaan vuorovaikutuksessa seuraavien merkkijono-elementtien parien kanssa: Kun ^ Z painetaan, Odotetaan olevan keskeytetty. ( -reset- lippu palauttaa päätemoodit .) Kun ^ A painetaan, käyttäjä näkee "kirjoitit ohjauksen A" ja prosessi lähetetään ^ A. Kun $ on painettu, käyttäjä näkee päivämäärän. Kun ^ C painetaan, Expect poistuu. Jos syötetään "foo", käyttäjä näkee "palkin". Kun ~~ painetaan, odotettavissa oleva tulkki toimii interaktiivisesti.

aseta CTRLZ \ 032 vuorovaikutteinen {-reset $ CTRLZ {exec -tappi -STOP [pid]} \ 001 {send_user "kirjoitit valvonta-A \ n"; lähetä "\ 001"} $ {send_user "Päivämäärä on [kelloformaatti [kello sekunnissa]]."} \ 003 exit foo {send_user "bar"} ~~}

Kielet-runkopareissa jouset rinnastetaan siinä järjestyksessä kuin ne on lueteltu argumentteina. Osittaisia ​​vihjeitä ei lähetetä nykyiseen prosessiin ennen kuin loppu tulee. Jos merkkejä syötetään siten, ettei ottelu enää ole mahdollista, vain merkkijono osa lähetetään prosessiin, joka ei voi aloittaa uutta ottelua. Niinpä merkkijonoja, jotka ovat osittaisten ottelujen alivärejä, voivat vastata myöhemmin, jos alkuperäiset stringsit, jotka yrittivät vastata, lopulta epäonnistuvat.

Oletusarvon mukaan merkkijonon täsmäyttäminen on täsmälleen vailla luonnollisia kortteja . (Sitä vastoin odotuskomento käyttää oletusarvoisesti glob-style -kuvioita .) -ex- lippua voidaan käyttää suojelemaan kuvioita, jotka muuten toimisivat vuorovaikutuslippujen kanssa . Kaikki "-" -alkuisesta kuvioista tulisi suojata tällä tavoin. (Kaikki merkkijonot, jotka alkavat "-", varataan tuleville vaihtoehdoille.)

-re- lippu pakottaa merkkijonon tulkittamaan regexp-tyyppisen kuvion. Tällöin vastaavien aliverkkojen tallentaminen muuttujaan interact_out vastaavalla tavalla kuin odottaa, tallentaa sen tuotoksen muuttujalle expect_out . -indeksin lippua tuetaan samalla tavalla.

Kuvio eof esittelee toiminnon, joka suoritetaan tiedoston loppuessa. Erillinen eof- kuvio voi myös seurata -output- lippua, jolloin se sopii yhteen, jos eof havaitaan kirjoitettaessa lähtöä. Oletusarvoinen eof- toiminto on "paluu", joten vuorovaikutus palaa yksinkertaisesti EOF: n kautta.

Kuvion aikakatkaisu tuo esiin aikakatkaisun (sekunteina) ja toimet, jotka suoritetaan sen jälkeen, kun merkkejä ei ole luettu tietyn ajan kuluttua. Aikakuvamalli koskee viimeisintä määritettyä prosessia . Ei ole oletusviiveaikaa. Aikakatkaisun erityisominaisuutena "timeout" (odotuskomennon käyttämä) ei vaikuta tähän aikakatkaisuun.

Esimerkiksi seuraavaa lausetta voitaisiin käyttää autologoutiin käyttäjiä, jotka eivät ole kirjoittaneet mitään tunnin ajan, mutta joilla on yhä usein järjestelmäviestejä:

vuorovaikutteinen -input $ user_spawn_id aikakatkaisu 3600 paluu -output \ $ spawn_id

Jos kuvio on avainsana null ja nullit sallitaan ( remove_nulls -komennolla), vastaava elin suoritetaan, jos yksittäinen ASCII 0 on sovitettu. Ei ole mahdollista vastata 0 tavua glob- tai regexp-mallien kautta.

Lomakkeen etukäteen lippua -iwrite -mallilla muuttujan interact_out (spawn_id) asetetaan spawn_id: ksi, joka sopi kuvioon (tai eof).

Toimet, kuten tauko ja jatkuvuus, aiheuttavat valvontarakenteita (esim. Proc ) käyttäytymistä tavalliseen tapaan. Palauttamisasiat kuitenkin palaavat vuorovaikutteisesti takaisin soittajalleen, kun taas inter_return aiheuttaa vuorovaikutuksen aiheuttaen paluun sen soittajalle. Esimerkiksi, jos "proc foo" kutsutaan vuorovaikutteiseksi, joka sitten suoritti toiminnon inter_return , proc foo palaa. (Tämä tarkoittaa sitä, että jos vuorovaikutteinen puhelu tulkitaan vuorovaikutteisesti kirjoittamalla palautus , vuorovaikutus jatkuu, kun taas inter_return aiheuttaa vuorovaikutuksen palata soittajalle.)

Yhteyden aikana käytetään raakamoodia, jotta kaikki merkit voidaan siirtää nykyiseen prosessiin . Jos nykyinen prosessi ei löydä työn ohjaussignaaleja, se pysähtyy, jos se lähettää pysäytyssignaalin (oletusarvoisesti ^ Z). Voit käynnistää sen uudelleen lähettämällä jatkuvan signaalin (kuten "kill -CONT"). Jos haluat todella lähettää SIGSTOP: n tällaiseen prosessiin (^ Z), harkitse ensin kutemista csh ensin ja käynnistä sitten ohjelma. Toisaalta, jos haluat lähettää SIGSTOP: n odottaa itseään, soita ensimmäisen puhelun tulkkiin (ehkä ponnahdusmerkillä) ja paina sitten ^ Z.

String-rungon paria voidaan käyttää lyhenteenä, jotta vältytään tultaessa tulkkiin ja suorittamaan komentojen vuorovaikutteisesti. Edellistä päätelaitetta käytetään, kun jono-kehon parin runko on suoritettu.

Nopeutta varten toiminnot suoritetaan raakamoodissa oletuksena. -reset- lippu palauttaa päätelaitteen sen tilaan, johon se oli ennen vuorovaikutusta (poikkeuksetta, kypsennetty tila). Huomaa, että tilan ollessa kytkettynä kirjoitetut merkit saattavat kadota (eräiden järjestelmien pääteajurien valitettava ominaisuus). Ainoa syy käyttää -reset on, jos toiminto riippuu käynnissä keitetyssä tilassa.

-echo- lippu lähettää merkkejä, jotka vastaavat seuraavia kuvioita takaisin prosessiin, joka luo ne kun jokainen merkki on luettu. Tämä voi olla hyödyllinen, kun käyttäjän on saatava palautetta osittain kirjoitetuista kuvioista.

Jos kuviota toistetaan, mutta lopulta se ei onnistu, merkit lähetetään kerättyyn prosessiin . Jos kutennettu prosessi sitten heijastaa niitä, käyttäjä näkee merkit kahdesti. -echo on todennäköisesti vain sopiva tilanteissa, joissa käyttäjä ei todennäköisesti pysty täydentämään mallia. Esimerkiksi seuraava osio on rftp, rekursiivinen ftp-skripti, jossa käyttäjää kehotetaan syöttämään ~ g, ~ p tai ~ l saadakseen, laittamaan tai luetteloimaan nykyistä rekisteriä. Nämä ovat niin kaukana tavanomaisista ftp-komennoista, että käyttäjä ei todennäköisesti kirjoita ~ seuraa mitään muuta, paitsi virheellisesti, jolloin he luultavasti vain jättävät tuloksen huomiotta.

vuorovaikutteinen {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

-nobuffer- lippu lähettää merkkejä, jotka vastaavat seuraavia kuvioita tulostusprosessiin merkkien luettaessa.

Tämä on hyödyllistä, kun haluat, että ohjelma palaa takaisin kuvioon. Seuraavassa voidaan esimerkiksi seurata, missä henkilö soittaa (Hayes-tyyppinen modeemi). Joka kerta kun "atd" näkyy, komentosarja kirjaa loput rivistä.

proc lognumber {} {interact -nobuffer -re "(. *) palauttaa $ log" [kellonmuoto [kello sekuntia]]: soitettu $ interact_out (1, merkkijono) "} vuorovaikutus -nobuffer" atd "lognumber

Vuorovaikutuksen aikana log_userin aiempi käyttö jätetään huomiotta. Erityisesti vuorovaikutus pakottaa sen lähdön kirjautumaan (lähetetään vakiotulokseen), koska oletetaan, että käyttäjä ei halua toimia sokeasti.

-o- lippu aiheuttaa minkä tahansa seuraavan avain-runkoparin soveltamisen nykyisen prosessin lähdöön . Tämä voi olla hyödyllistä esimerkiksi silloin, kun käsitellään isänniä, jotka lähettävät ei-toivottuja merkkejä telnet-istunnon aikana.

Oletusarvoisesti vuorovaikutus odottaa käyttäjän kirjoittavan stdin ja odottaa itse odotusarvoa. -u- lippu ("käyttäjä") tekee vuorovaikutukselta etsiä käyttäjää prosessina, jonka nimi on sen argumentti (joka on kutuutunut id).

Tämä sallii kaksi liityntäprosessia yhdistää toisiinsa ilman selkeää silmukkaa. Vianmäärityksen tukemiseksi odottaa diagnostiikan aina stderr (tai stdout tiettyjen kirjautumis- ja virheenkorjaustietojen). Samasta syystä tulkki komento lukee vuorovaikutteisesti stdin.

Esimerkiksi seuraava fragmentti luo kirjautumisprosessin. Sitten se soittaa käyttäjälle (ei esitetty) ja liittää ne yhteen. Tietenkin jokainen prosessi voi korvata kirjautumiseen. Esimerkiksi kuori antaisi käyttäjälle mahdollisuuden työskennellä antamatta tiliä ja salasanaa.

spawn login set login $ spawn_id spawn kärki modeemi # soita takaisin käyttäjäksi # liitä käyttäjä sisäänkirjautumiseen interact -u $ login

Jos haluat lähettää tuotetta useisiin prosesseihin, laita luettelo kustakin kutuutumislomakkeesta, johon on merkitty ylimääräinen lippu. Lähtökuvioiden tunnistetiedon tulo voidaan määrittää kynnyslista-luettelolla, johon on merkitty syöttölippu . (Sekä -näytöllä että -lähtöllä voi olla listoja samassa muodossa kuin -i- lippu odotuskomennossa, paitsi että any_spawn_id ei ole mielekästä vuorovaikutuksessa .) Kaikki seuraavat lippuja ja merkkijonoja (tai kuvioita) koskevat tätä syötettä, kunnes toinen - syötetty lippu ilmestyy. Jos ei- syöttöä ilmestyy, -lähtö tarkoittaa "-syöttöä $ user_spawn_id -output". (Vastaavasti mallineilla, joilla ei ole syöttöä .) Jos yksi syöte on määritetty, se ohittaa $ user_spawn_id. Jos toinen syöttö on määritetty, se ohittaa $ spawn_id. Lisä- syöttölippuja voidaan määrittää.

Kaksi implisiittistä syöttöprosessia oletuksena on, että niiden tuotokset määritetään $ spawn_id ja $ user_spawn_id (käänteisesti). Jos sisääntulolippu ilmestyy ilman ylimääräistä lippua, kyseisen prosessin merkkejä hylätään.

-i- lippu tuo korvaavan nykyisen spawn_id: n, kun muita syöttö- tai -lähtölippuja ei käytetä. -i-lippu merkitsee -o-merkintää.

On mahdollista muuttaa prosessit, joita vuorovaikutuksessa käytetään epäsuorien kutujen tunnusten avulla. (Epäsuorat kutuviivat on kuvattu odotuskomennon osassa.) Epäsuorat kutualuetunnukset voidaan määrittää -i, -u, -input- tai -vientilipuilla.

tulkki [args]
aiheuttaa käyttäjälle vuorovaikutteisesti kehotuksen odottaa ja Tcl-komentoja. Kunkin komennon tulos tulostetaan.

Toimet, kuten tauko ja jatkuvuus, aiheuttavat valvontarakenteita (esim. Proc ) käyttäytymistä tavalliseen tapaan. Tulo palauttaa kuitenkin tulkin takaisin soittajalleen, kun taas inter_return aiheuttaa tulkin aiheuttavan paluun soittajan. Jos esimerkiksi "proc foo" kutsuttu tulkki, joka sitten toteutti toiminnon inter_return , proc foo palaa. Jokainen muu komento saa tulkin jatkamaan uusien komentojen pyytämistä.

Oletuksena kehote sisältää kaksi kokonaislukua. Ensimmäinen kokonaisluku kuvaa arviointipinon syvyyttä (eli kuinka monta kertaa Tcl_Eval on kutsuttu). Toinen kokonaisluku on Tcl-historiantunniste. Kysely voidaan asettaa määrittämällä menettely, jonka nimi on "prompt1", jonka paluuarvo tulee seuraavaa kehotetta. Jos lausekkeessa on avoimia hintatarjouksia, parens, braces tai kannakkeita, toissijainen kehote (oletuksena "+>") annetaan uuden rivin kanssa. Toissijainen kehote voidaan asettaa määrittelemällä menettely "prompt2".

Tulkin aikana käytetään keitettyä tilaa, vaikka sen soittaja käytti raakamoodia.

Jos stdin on suljettu, tulkki palaa, ellei -eof- lippua käytetä, jolloin myöhempi argumentti vedotaan.

log_file [args] [[-a] -tiedosto]
Jos filename toimitetaan, log_file tallentaa tiedoston istuntoselostuksen (alkavan siinä vaiheessa). log_file lopettaa tallentamisen, jos argumenttia ei anneta. Kaikki aikaisemmat lokitiedostot suljetaan.

Tiedostonimen sijaan Tcl-tiedoston tunniste voidaan antaa käyttämällä -open tai -leaveopen- lippuja. Tämä on samanlainen kuin spawn- komento. (Katso lisätietoja kohdasta äläkä .)

-a- lippujen voimat, jotka on kirjoitettu lokiin, jonka log_user- komento tukahdutti.

Oletusarvon mukaan log_file -komento liitetään vanhoihin tiedostoihin sen sijaan, että ne katkaisivat ne, jotta se olisi helppo ottaa pois päältä ja useita kertoja samassa istunnossa. Voit katkaista tiedostot käyttämällä -noappend- lippua.

-info- lipun aiheuttaa log_file palauttaa kuvaus viimeisimmistä ei-info-argumentteista.

log_user -info | 0 | 1
Oletusarvoisesti lähetys / odota dialogi kirjataan stdoutiin (ja lokitiedosto, jos se on auki). Stdout-kirjaus poistetaan komennolla "log_user 0" ja palautetaan "log_user 1" kautta. Lokitiedostoon kirjaaminen ei ole muuttunut.

-info- lipun saa log_user palauttaa kuvaus viimeisimmistä ei-info-argumentteista.

match_max [-d] [-i spawn_id] [koko]
määrittelee puskurin koon (tavuina), jota käytetään sisäisesti odotettavissa . Koko- argumenttia ei ole, nykyinen koko palautetaan.

-d-merkinnällä asetetaan oletuskoko. (Alkuperäinen oletusarvo on 2000.) -i-merkinnällä koko määritetään nimetylle kutualueelle, muussa tapauksessa se on asetettu nykyiselle prosessille .

päällekkäinen [- # spawn_id] [- # spawn_id] [...] ohjelma [args]
suorittaa "program args" sen hetkisen Expect- ohjelman sijasta, joka päättyy. Paljas yhdysviiva-argumentti pakottaa komennon nimen eteen, ikään kuin se olisi kirjautumiskuori. Kaikki spawn_ids suljetaan lukuun ottamatta argumentteja kutsuttuja. Nämä kartoitetaan nimetyille tiedostunnisteille.

Spawn_idit on kartoitettu tiedostojen tunnisteiksi uuden ohjelman perimiseksi. Esimerkiksi seuraava rivi ajaa shakkia ja sallii sen olevan ohjattavissa nykyisellä prosessilla - esim. Shakin päälliköltä.

peitto -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id shakki

Tämä on tehokkaampaa kuin "vuorovaikutteinen -u", mutta se uhraa kykyä ohjelmoidusta vuorovaikutuksesta, koska Odota- prosessi ei enää ole hallinnassa.

Huomaa, että mitään säätöpäätettä ei ole. Näin ollen, jos irrotat tai räätälöität vakiotulon, ohjelmat, jotka tekevät työnhallintaa (kuoret, kirjautumiset jne.), Eivät toimi oikein.

pariteetti [-d] [-i spawn_id] [arvo]
määrittelee, onko pariteetin säilytettävä tai hävitettävä kutomatun prosessin tuotosta. Jos arvo on nolla, pariteetti riisuu, muuten sitä ei poisteta. Kun arvoa ei ole, nykyinen arvo palautetaan.

-d-merkinnällä asetetaan oletusarvoinen pariteettiarvo. (Alkuperäinen oletusarvo on 1, eli pariteettia ei ole poistettu.) -i-merkinnällä pariteettiarvo asetetaan nimetylle kutualueelle, muussa tapauksessa se on asetettu nykyiselle prosessille .

remove_nulls [-d] [-i spawn_id] [arvo]
määritetään, säilytetäänkö nullat nollaa vai poistetaankö kutuutettujen prosessien tuotosta ennen kuvion sovittamista tai tallentamista muuttujan expect_out tai interact_out . Jos arvo on 1, nollat ​​poistetaan. Jos arvo on 0, nollia ei poisteta. Kun arvoa ei ole, nykyinen arvo palautetaan.

-d-merkin avulla oletusarvo on asetettu. (Alkuperäinen oletusarvo on 1, eli nollat ​​poistetaan.) -i-merkinnällä arvo määritetään nimetylle kutualueelle, muussa tapauksessa se on määritetty nykyiselle prosessille .

Ovatko nullit poistettu, Odota tallentaa nolla tavua lokiin ja stdoutiin.

lähetä [-flags] merkkijono
Lähettää merkkijonoa nykyiseen prosessiin . Esimerkiksi komento

lähetä "hello world"

lähettää helloworldin merkit nykyiseen prosessiin . (Tcl sisältää printf -like-komennon (kutsutun muodon ), joka voi rakentaa mielivaltaisesti monimutkaisia ​​merkkijonoja.)

Hahmot lähetetään välittömästi, vaikka ohjelmat, joissa on rivi-puskuroitu syöte, eivät lue merkkejä, ennen kuin palautusmerkki lähetetään. Palautusmerkki on merkitty "\ r".

Lippu pakottaa seuraavaa argumenttia tulkitsemaan merkkijonoksi eikä lipuksi. Mikä tahansa merkkijono voi edeltää "-" onko se todellakin lippua. Tämä tarjoaa luotettavan mekanismin muokattavien merkkijonojen määrittelemiseksi ilman, että ne laukaisevat ne, jotka vahingossa näyttävät lippuja. (Kaikki merkkijonot, jotka alkavat "-", varataan tuleville vaihtoehdoille.)

-i lippu ilmoittaa, että merkkijonon lähetetään nimettyyn spawn_id. Jos spawn_id on user_spawn_id ja päätelaite on raakamoodissa , merkkijonon uudet rivit käännetään paluu-newline-sekvensseille niin, että ne näyttävät olevan terminaalin ollessa valmiustilassa. -raw- lippu poistaa tämän käännöksen käytöstä.

-null flag lähettää nollimerkkejä (0 tavua). Oletusarvoisesti lähetetään yksi nolla. Kokonaisluku voi seurata -null, joka ilmaisee, kuinka monta nollaa lähetetään.

Break-lippu luo tauon ehtona. Tällöin on järkevää vain, jos kutuviittaus viittaa tty-laitteeseen, joka avataan "spawn -open" kautta. Jos olet kehittänyt prosessin , kuten kärjen, käytä kärkikokousta tauon luomiseen.

-s- lippujen voimat lähetetään lähetettäväksi "hitaasti", jolloin vältetään yhteinen tilanne, jossa tietokone ulkoistaa tulospuskurin, joka on suunniteltu ihmiselle, joka ei koskaan ulottaisi samaa puskuria . Tätä lähtöä hallitsee muuttujan "send_slow" arvo, joka ottaa kaksiosainen luettelo. Ensimmäinen elementti on kokonaisluku, joka kuvaa atomien lähettämien tavujen määrää. Toinen elementti on todellinen luku, joka kuvaa sekuntien lukumäärää, jonka mukaan atomi- lähetykset on erotettava toisistaan. Esimerkiksi "set send_slow {10 .001}" pakottaa "send -s" lähettää merkkijonoja 1 millisekunnin välein jokaisen lähetetyn 10 merkin väliin.

-h- lippujen voimat lähetetään lähetettäväksi (jonkin verran) kuin ihmisen kirjoittaminen. Merkkien välillä esiintyy ihmisen kaltaisia ​​viiveitä. (Algoritmi perustuu Weibull-jakeluun, jossa on modifikaatiot tähän sovellukseen sopiviksi.) Tätä lähtöä ohjataan muuttujan "send_human" arvon avulla, joka kestää viisi elementtiluokkaa. Ensimmäiset kaksi elementtiä ovat merkkien keskimääräinen saapumisaika sekunteina. Ensimmäistä käytetään oletusarvoisesti. Toista käytetään sanan päätepisteissä, simuloimaan hienovaraisia ​​taukoja, jotka satunnaisesti esiintyvät tällaisissa siirtymissä. Kolmas parametri on muuttujan mittaus, jossa .1 on varsin muuttuvaa, 1 on kohtuullisen muuttuva ja 10 on täysin muuttumaton. Ääripäät ovat 0 - ääretön. Viimeiset kaksi parametria ovat vastaavasti vähimmäis- ja maksimitalletusajan. Minimi ja maksimi käytetään viimeisenä ja "leike" viimeinen aika. Perimmäinen keskiarvo voi olla melko erilainen kuin annettu keskiarvo, jos minimi- ja maksimaalinen leike riittävät arvoihin.

Esimerkiksi seuraava komento emuloi nopeaa ja yhtenäistä konekirjoitinta:

set send_human {.1 .3 1 .05 2} lähetä -h "Olen nälkäinen.

kun taas seuraavat voivat olla sopivampia hangoverin jälkeen:

set send_human {.4 .4 .2 .5 100} lähetä -h "Goodd-puolueen lash night!"

Huomaa, että virheitä ei ole simuloitu, mutta voit itse määrittää virheenkorjaustilanteet upottamalla virheitä ja korjauksia lähetyssarjassa.

Lippujen lähettäminen nollimerkkien, lähetysten lähettämiseksi, hidaslähtöisyyden pakottamiseksi ja ihmisen tyylien tuottamiseksi ovat toisistaan ​​poissulkevia. Käytetään vain aiemmin määritettyä. Lisäksi merkkijonoja ei voi määrittää merkkijonoilla nollamerkkien tai taukojen lähettämiseksi.

On hyvä edetä ennen ensimmäistä lähettämistä prosessiin odottaa . odottaa odottavan prosessin alkamista, kun taas lähetys ei onnistu. Erityisesti, jos ensimmäinen lähetys on valmis ennen kuin prosessi alkaa käynnistyä, vaarannat tietosi jääneen huomiotta. Tilanteissa, joissa vuorovaikutteiset ohjelmat eivät tarjoa alustavaa kehotetta, voit lähettää viestin viivästymiseen seuraavasti:

# Jotta hakkerit eivät saa vihjeitä siitä, miten murtautua, # tämä järjestelmä ei pyydä ulkoista salasanaa. # Odota 5 sekuntia, jotta exec täyttää spawn telnet very.secure.gov nukkumaan 5 lähettää salasanaa

exp_send on alias lähetettäväksi. Jos käytät Expectkia tai jotain muuta odotettua versiota Tk-ympäristössä, Tk määrittelee lähetyksen täysin eri tarkoitukseen. exp_send on tarkoitettu ympäristön yhteensopivuuden varmistamiseksi. Samanlaisia ​​aliaksia annetaan muille odotettavissa oleville muille lähetyskomentoille.

send_error [-flags] merkkijono
on kuin lähetä , paitsi että lähetys lähetetään stderrille nykyisen prosessin sijasta.

send_log [-] merkkijono
on kuin lähettää , paitsi että merkkijono lähetetään vain lokitiedostoon (katso log_file .) Argumentit ohitetaan, jos lokitiedostoa ei ole avattu.

send_tty [-flags] merkkijono
on kuin lähettää , paitsi että lähetys lähetetään / dev / tty: lle pikemminkin kuin nykyiseen prosessiin .

send_user [-flags] merkkijono
on kuin lähetä , paitsi että lähetys lähetetään stdoutiin eikä nykyiseen prosessiin .

nukkua sekunnissa
aiheuttaa komentosarjan nukkumisen tietyn sekunnin ajan. Sekunnit voivat olla desimaaliluku. Keskeytykset (ja Tk-tapahtumat, jos käytät Expectkiä) käsitellään odotettaessa nukkumaan.

spawn [args] -ohjelma [args]
luo uuden prosessin "program args". Sen stdin, stdout ja stderr ovat kytkettynä odottaa, jotta ne voidaan lukea ja kirjoittaa muiden odottaa komentoja. Yhteys katkeaa läheltä tai jos prosessi itse sulkee minkä tahansa tiedostunnisteen.

Kun prosessointi aloitetaan kutuamalla , muuttuja spawn_id asetetaan kyseiseen prosessiin viittaavaan kuvaajaan. Spawn_idin kuvaama prosessi pidetään "nykyisenä prosessina ". spawn_id voidaan lukea tai kirjoittaa, ja se antaa toimeksiannon .

user_spawn_id on globaali muuttuja, joka sisältää kuvaajan, joka viittaa käyttäjään. Esimerkiksi, kun spawn_id on asetettu tähän arvoon, odottaa käyttäytymistä kuten expect_user .

. I error_spawn_id on globaali muuttuja, joka sisältää kuvaajan, joka viittaa standardivirheeseen. Esimerkiksi kun spawn_id on asetettu tähän arvoon, lähetys toimii kuten send_error .

tty_spawn_id on globaali muuttuja, joka sisältää kuvaajan, joka viittaa / dev / tty: hen. Jos / dev / tty ei ole olemassa (kuten cron, at tai batch script), tty_spawn_id ei ole määritetty. Tätä voidaan testata seuraavasti:

jos {[info vars tty_spawn_id]} {# / dev / tty on olemassa} else {# / dev / tty ei ole olemassa # luultavasti cron-, batch- tai script-ohjelmassa}

spawn palauttaa UNIX- prosessin tunnuksen. Jos prosessia ei synny, 0 palautetaan. Muuttuja spawn_out (orja, nimi) on asetettu pty-orjalaitteen nimeksi.

Oletusarvoisesti spawn- merkki vastaa komennon nimeä ja argumentteja. -noecho- lippu pysähtyy tekemästä tätä.

-konsepti- lippu saa konsolilähdön uudelleenohjautumaan uuteen prosessiin . Tätä ei tueta kaikissa järjestelmissä.

Sisäisesti, spawn käyttää pty: tä, alustettu samalla tavalla kuin käyttäjän tty. Tämä alustetaan edelleen niin, että kaikki asetukset ovat "terveitä" (stty (1) mukaan). Jos muuttuja stty_init on määritetty, se tulkitaan stty-argumenttien tyyliin lisäsuunnitteluksi. Esimerkiksi "asettaa stty_init raaka" aiheuttaa uuden sukupolven prosessin päätelaitteiden aloittamisen raakamoodissa. -nottycopy ohittaa alustuksen käyttäjän tty: n perusteella. -nottyinit ohittaa "järkevän" alustuksen.

Normaalisti kutu kestää vain vähän aikaa. Jos havaitset kutevan huomattavan määrän aikaa, se todennäköisesti joutuu kohtaamaan niitä, jotka ovat kietoutuneet. Useita testejä ajetaan PTY: ssä, jotta vältyttäisiin epävakailta prosesseilta. (Nämä kestää 10 sekuntia kiiltyä ptyä kohden.) Odotus -d- vaihtoehdolla näkyy, jos Odotetaan, että monet ptys joutuvat odd-tilaan. Jos et voi tappaa niitä prosesseja, joihin nämä ptys liittyvät, ainoa turvautuminen voi olla käynnistää uudelleen.

Jos ohjelmaa ei voida käynnistää onnistuneesti, koska exec (2) epäonnistuu (esim. Kun ohjelmaa ei ole olemassa), seuraavan vuorovaikutuksen tai odotetun komennon palauttaa virheilmoitus ikään kuin ohjelma olisi käynnissä ja tuotettu virheilmoituksen lähdönä. Tämä käyttäytyminen on luonnollinen seuraus kutunsa toteuttamisesta. Sisäisesti, kutevat haarukat, minkä jälkeen syntynyt prosessi ei voi kommunikoida alkuperäisen Expect- prosessin kanssa, paitsi viestinnällä spawn_idin kautta.

-open- lippu aiheuttaa sen, että seuraava argumentti tulkitaan Tcl-tiedostunnisteena (eli palautetaan avoimella ). Kutevan tunnuksen voi sitten käyttää ikään kuin se olisi syntynyt prosessi . (Tiedostunnistetta ei enää pitäisi käyttää.) Näin voit käsitellä raakalaitteita, tiedostoja ja putkia uutetuiksi prosesseiksi ilman pty: tä. 0 palautetaan osoittamaan, ettei siihen liity mitään prosessia . Kun yhteys muodostettuun prosessiin on suljettu, niin on Tcl-tiedoston tunniste. -leaveopen- lippu on samanlainen kuin -open, paitsi että -leaveopen aiheuttaa tiedostunnisteen jäävän avoimeksi sen jälkeen, kun kutujakso on suljettu.

Tyhjä lippu aiheuttaa sen, että pty avataan, mutta prosessia ei synny. 0 palautetaan osoittamaan, ettei siihen liity mitään prosessia . Spawn_id asetetaan tavalliseen tapaan.

Muuttuja spawn_out (orja, fd) on asetettu pty-orjaa vastaava tiedostunniste. Se voidaan sulkea "läheltä suljettuna".

-ignoren lippu nimeää signaalin, jota ei voida jättää huomioimatta syntyneessä prosessissa . Muussa tapauksessa signaalit saavat oletuskäyttäytymisen. Signaaleja kutsutaan nimellä trap- komennon, paitsi että jokainen signaali vaatii erillisen lipun.

hallintotaso
aiheuttaa seuraavien lausuntojen tulostamisen ennen niiden suorittamista. (Tcl: n jäljityskäsky jäljittää muuttujat.) -taso osoittaa, kuinka kaukana puhelupinoon jäljitetään. Esimerkiksi seuraava komento toimii odottaa, kun se etsii ensimmäiset neljä puheluasteikkoa, mutta ei alle sitä.

odottaa -c "strace 4" script.exp

-info- lipun avulla strace palauttaa kuvauksen tuoreimmista ei-info-argumentteista.

stty args
muutetaan päätelaitteita samalla tavalla kuin ulkoisella stty-komennolla.

Oletusarvoisesti ohjauspäätettä käytetään. Muita terminaaleja voidaan käyttää lisäämällä "Tilaustilaukset palauttaa se komennon tuloksena. Jos tilaan ei vaadita ja ohjauspäätettä käytetään, raaka- ja kaikuominaisuuksien aikaisempi tila palautetaan muodossa, joka voidaan myöhemmin jota komento käyttää.

Esimerkiksi raaka-aineet tai -ruoat tuovat päätelaitteen raaka-tilaan. Argumentit -raw tai keitetyt laittaa päätelaitteen keitettyyn tilaan. Argumentit echo ja -echo asettavat päätelaitteen echo- ja noecho-tilaan.

Seuraavassa esimerkissä kuvataan, kuinka kaiku palautetaan tilapäisesti pois käytöstä. Tätä voidaan käyttää muutoin automaattisissa skripteissä, jotta salasanat eivät sisälly niihin. (Katso lisää keskustelua tästä alle EXPECT HINTS alla.)

stty -echo send_user "Salasana:" expect_user -re "(. *) \ n" määritä salasana $ expect_out (1, merkkijono) stty echo

järjestelmä args
antaa argumentille sh (1) tulona, ​​aivan kuten jos se oli kirjoitettu terminaalin komennukseksi. Odota odottaa, kunnes kuori päättyy. Palautustilaa sh: stä käsitellään samalla tavoin kuin exec käsittelee sen paluuta.

Toisin kuin exec, joka ohjaa stdin ja stdout scriptille, järjestelmä ei suorita uudelleenohjausta (muu kuin itse merkkijono). Näin ollen on mahdollista käyttää ohjelmia, joiden on puhuttava suoraan / dev / tty: lle. Samasta syystä järjestelmän tuloksia ei kirjata lokiin.

aikaleima [args]
palauttaa aikaleiman. Jos argumentteja ei ole, sekunnin määrä palaa aikakautena.

-format- lippu tuo merkkijono, joka palautetaan, mutta korvaukset tehdään POSIX-sääntöjen mukaan strftime-muodossa. Esimerkiksi% a on korvattu lyhennetyllä arkipäivällä (ts. Sat). Muut ovat:

% lyhyt viikonpäivän nimi% Täydellinen arkipäivä nimi% b lyhennetty kuukausi nimi% B koko kuukauden nimi% c päivämäärä-aika kuin: kk Lokakuu 6 11:45:56 1993% d kuukauden kuukausi (01-31% H tunti (00 - 59)% pm tai pm% S sekunti (00-61)% I tunti (01-12)% j päivä (001-366)% m kuukausi (01-12) % u päivä (1-7, maanantai on ensimmäisen viikonpäivä)% U viikko (00-53, ensimmäinen sunnuntai ensimmäisen viikonpäivä)% V viikko (01-53, ISO 8601 tyyli)% w päivä (0- %) X viikolla (00-53, ensimmäinen maanantai on ensimmäisen viikonpäivä)% x päivämäärän aika kuin: lokakuu 6 1993% x aika kuin: 23:59:59% y vuosi (00-99) % Y vuosi vuodesta: 1993% Z aikavyöhyke (tai ei mitään, jos ei ole määritettävissä) %% aivopuoliskon merkki

Muut% -ominaisuudet ovat määrittelemättömiä. Muut merkit siirretään koskemattomana. Vain C-kanava on tuettu.

Sekvenssin lippu esittelee useita sekunteja sen jälkeen, kun aikakausi käytetään lähteenä, josta se muotoillaan. Muussa tapauksessa käytetään nykyistä aikaa.

-gmt- lippu pakottaa aikaleiman tuotos käyttää GMT- aikavyöhykettä. Ilman lippua ei käytetä paikallista aikavyöhykettä.

trap [[komento] signaalit]
aiheuttaa annettavan komennon suoritettavaksi tulevien signaalien tulevaisuudessa. Komento toteutetaan maailmanlaajuisesti. Jos komento puuttuu, signaalitoiminto palautetaan. Jos komento on merkkijono SIG_IGN, signaalit ohitetaan. Jos komento on merkkijono SIG_DFL, signaalit tulevat järjestelmän oletusasetuksiin. signaalit ovat joko yksittäisiä signaaleja tai signaaliluetteloita. Signaalit voidaan määrittää numeerisesti tai symbolisesti signaalin (3) mukaisesti. SIG-etuliite voidaan jättää pois.

Ilman argumentteja (tai argumenttia -numero) ansa palauttaa parhaillaan suoritettavan ansa käskyn signaalin numeron.

The -code- lippu käyttää komennon palautuskoodia sen sijaan, mitä koodia Tcl olisi palaamassa, kun komento alunperin alkoi käynnistyä.

-interp- lippu tekee komennon arvioimalla tulkki aktiivisena sillä hetkellä, kun komento käynnistyi sen sijaan, kuin se oli ansaan ilmoitettu.

-name-merkkipaalun ansiosta anso- komento palauttaa parhaillaan suoritettavan anso-komennon signaalin nimen.

-max- lippu saa ansa käskyn palauttamaan suurimman mahdollisen signaalin numeron.

Esimerkiksi komento "trap {send_user" Ouch! "} SIGINT" tulostaa "Ouch!" aina kun käyttäjä painaa ^ C.

Oletuksena SIGINT (joka voidaan generoida yleensä painamalla ^ C) ja SIGTERM aiheuttaa odottamaan poistua. Tämä johtuu seuraavasta ansaan, joka on luotu oletusarvoisesti, kun Odottaa alkaa.

trap exit {SIGINT SIGTERM}

Jos käytät -D-lippua käynnistääksesi virheenkorjauslaitteen, SIGINT määritetään uudelleen interaktiivisen virheenkorjaajan käynnistämiseksi. Tämä johtuu seuraavasta ansaan:

trap {exp_debug 1} SIGINT

Debuggeri-ansa voidaan muuttaa asettamalla ympäristömuuttuja EXPECT_DEBUG_INIT uudelle ansokomennolle.

Voit tietenkin ohittaa molemmat näistä vain lisäämällä komentojonoihin komentosarjoja. Erityisesti, jos sinulla on oma "trap exit SIGINT", tämä ohittaa virheenkorjaushaun. Tämä on hyödyllistä, jos haluat estää käyttäjiä pääsemästä debuggeriin lainkaan.

Jos haluat määrittää omat ansaasi SIGINT: ssä, mutta silti ansaan debuggeriin, kun se on käynnissä, käytä:

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

Vaihtoehtoisesti voit hakea virheenkorjausohjelmaa käyttämällä jotain muuta signaalia.

ansa ei anna sinun ohittaa toimintaa SIGALRM: lle, koska sitä käytetään sisäisesti odottaa . Disconnect-komento asettaa SIGALRM: n SIG_IGN (ignore). Voit palauttaa sen, kun poistat sen käytöstä myöhemmissä spawn-komennoissa.

Katso lisätietoja signaalista (3).

odota [args]
viivästyksiä, kunnes kutistettu prosessi (tai nykyinen prosessi, jos mitään ei ole nimetty) päättyy.

odottaa yleensä palauttaa luettelon neljästä kokonaislukuvasta. Ensimmäinen kokonaisluku on prosessi , jota odotettiin. Toinen kokonaisluku on vastaava kutukohde. Kolmas kokonaisluku on -1, jos tapahtui käyttöjärjestelmän virhe tai 0 muuten. Jos kolmas kokonaisluku oli 0, neljäs kokonaisluku on tilannekohtainen palautusprosessi . Jos kolmas kokonaisluku oli -1, neljäs kokonaisluku on käyttöjärjestelmän asettama errno-arvo. Globaali muuttuja errorCode on myös asetettu.

Odota odottaa palautusarvon lopussa lisäelementtejä. Valinnainen viides elementti tunnistaa tietoluokan. Tällä hetkellä ainoa mahdollinen arvo tästä elementistä on LAPSETTU, jolloin seuraavaksi kaksi arvoa ovat C-tyyppinen signaalin nimi ja lyhyt tekstin kuvaus.

-i lippu ilmoittaa prosessin odottavan vastaavan nimettyä spawn_id (EI prosessi id). SIGCHLD-käsittelijän sisäpuolella on mahdollista odottaa minkä tahansa kutevan prosessin käyttämällä kutuviivaa -1.

The -nowait- lippu aiheuttaa odotuksen palata välittömästi osoittamaan onnistuneen odotuksen. Kun prosessi poistuu (myöhemmin), se häviää automaattisesti ilman nimenomaista odotusta.

Odota- komentoa voidaan myös käyttää odottamaan haarukoitua prosessia käyttäen argumentteja "-i -1". Toisin kuin sen käyttö kutuilla prosesseilla, tämä komento voidaan suorittaa milloin tahansa. Ei ole mitään valvontaa siitä, mikä prosessi on korjattu. Paluuarvo voidaan kuitenkin tarkistaa prosessidunnukselle .

KIRJASTOISTA

Odottaa tietää automaattisesti kaksi sisäänrakennettua kirjastoa odottaa skriptejä. Nämä määritellään muuttujien exp_library ja exp_exec_library nimissä olevilla hakemistoilla. Molempien on tarkoitus sisältää apuohjelmia, joita muut komentosarjat voivat käyttää.

exp_library sisältää arkkitehtuurista riippumattomia tiedostoja. exp_exec_library sisältää arkkitehtuurista riippuvia tiedostoja. Järjestelmän mukaan molemmat hakemistot voivat olla täysin tyhjiä. Tiedoston $ exp_exec_library / cat-puffers -tiedoston olemassaolo kuvaa, onko sinun / bin / cat puskuri oletuksena.

Pretty-TULOSTUS

Vgrind-määritelmä on saatavana kauniille tulostuksille Odottaa skriptejä. Olettaen, että Expect- jakelun mukana toimitettu vgrind-määritys on asennettu oikein, voit käyttää sitä seuraavasti:

vgrind -lexpect-tiedosto

Esimerkit

Monien ei ole selvää, miten laittaa kaikki yhteen, jota man- sivu kuvaa. Kehotan sinua lukemaan ja kokeilemaan esimerkkejä Expect- jakelun esimerkkikansioista. Jotkut niistä ovat todellisia ohjelmia. Toiset ovat yksinkertaisesti havainnollisia tietyistä tekniikoista, ja tietenkin pari on vain nopeita hakkereita. INSTALL-tiedostossa on nopea yleiskuva näistä ohjelmista.

Odottavat paperit (ks. KATSO MYÖS) ovat myös hyödyllisiä. Vaikka jotkut paperit käyttävät ennakoinnin aiempia versioita vastaavaa syntaksia, mukana olevat perustelut ovat edelleen voimassa ja menevät paljon yksityiskohtaisemmin kuin tämän man sivun.

VAROITUKSET

Laajennukset voivat törmätä Expectin komentojen nimet. Esimerkiksi lähetys määritellään Tk: llä täysin erilaiseen tarkoitukseen. Tästä syystä suurin osa odotettavissa olevista komennoista on saatavana myös nimellä "exp_XXXX". Komentoja ja muuttujia, jotka alkavat "exp", "inter", "spawn" ja "timeout", eivät ole aliaksia. Käytä laajennettujen komentojen nimeä, jos tarvitset tätä yhteensopivuutta ympäristöjen välillä.

Odottaa ottaa melko liberaalinen näkemys scoping. Erityisesti Expect- ohjelmaan liittyvät komennot käsittelevät muuttujat etsitään ensin paikallisesta laajuudesta ja jos niitä ei löydetä, globaalissa soveltamisalueessa. Tämä esimerkiksi estää tarpeen "globaalin aikakatkaisun" määrittämiseen jokaisessa kirjoittamisessa, jota käytät odottaa . Toisaalta kirjoitetut muuttujat ovat aina paikallisessa laajuudessa (ellei "maailmanlaajuista" komentoa ole annettu). Yleisin ongelma on se, kun kutuke toteutetaan menettelyssä. Menettelyn ulkopuolella, spawn_id ei ole enää olemassa, joten kerätty prosessi ei ole enää saatavilla pelkästään scopingin vuoksi. Lisää "global spawn_id" tällaiseen menettelyyn.

Jos et pysty ottamaan käyttöön monisappaamiskykyä (ts. Järjestelmäsi ei tue valintaperusteita (BSD *. *), Pikakyselyä (SVR> 2) tai jotain vastaavaa), Expect voi hallita vain yhtä prosessia kerrallaan. Tällöin älä yritä asettaa spawn_id-arvoa , eikä sinun tarvitse suorittaa prosesseja execin avulla , kun uusi kutsu on käynnissä. Lisäksi et voi odottaa samanaikaisesti useista prosesseista (mukaan lukien käyttäjä yhdellä).

Terminaaliparametreilla voi olla suuri vaikutus skripteihin. Esimerkiksi, jos kirjoitus on kirjoitettu kaikuun etsimiseen, se ei toimi, jos kaiku on pois päältä. Tästä syystä Expect odottaa voimakkaita terminaaliparametreja oletusarvoisesti. Valitettavasti tämä voi tehdä asioista epämiellyttävän muille ohjelmille. Esimerkiksi emacs-kuori haluaa muuttaa "tavanomaisia" kartoituksia: uudet rivit kartoitetaan uudelle riville rivinvaihto-rivien sijaan ja kaiku on poistettu käytöstä. Tämän ansiosta emacs voi käyttää muokkaamaan syöttölinjaa. Valitettavasti Expect ei voi arvata tätä.

Voit pyytää, että Odota ei ohita pääasetusparametrien oletusasetusta, mutta sinun on silloin oltava erittäin varovainen kirjoitettaessa komentosarjoja tällaisissa ympäristöissä. Jos kyseessä on emacs, vältä asioita, kuten kaiku ja loppupään kuvaukset.

Komennot, jotka hyväksyivät argumentit, jotka on hyväksytty yhdeksi listaksi ( odotetut variantit ja vuorovaikutus ), käyttävät heuristista päättää, onko luettelo todella yksi argumentti tai monta. Heuristinen voi epäonnistua vain siinä tapauksessa, että lista itse asiassa edustaa yhtä argumenttia, jolla on useampia upotettuja \ n n ja niiden välillä ei ole välilyönteisiä merkkejä. Tämä näyttää riittävän epätodennäköiseltä, mutta argumenttia "-nobrace" voidaan käyttää pakottamaan yksi argumentti käsiteltäväksi yhtenä argumenttina. Tätä voitaisiin ajatella käytettävän koneella tuotetun Expect-koodin kanssa. Vastaavasti -haaste pakottaa yhden argumentin käsitellä useina kuvioina / toiminnoina.

BUGIT

Se oli todella houkutteleva nimetä "sukupuoli" -ohjelma (joko "Smart EXEC" tai "Send-Expect"), mutta hyvä järkeä (tai ehkä vain puritanismi) vallitsi.

Joissakin järjestelmissä, kun kuori on kynnetty, se valittaa siitä, että se ei pääse käsiksi tty: hen, vaan joka tapauksessa. Tämä tarkoittaa, että järjestelmälläsi on mekanismi, jolla päästään hallintaan tty, jota odottaa ei tiedä. Selvitä, mitä se on, ja lähetä nämä tiedot takaisin minulle.

Ultrix 4.1 (ainakin uusimmat versiot täällä) pitää yli 1000000: n aikakatkaisuja vastaamaan 0: ta.

Digital UNIX 4.0A (ja luultavasti muut versiot) kieltäytyy antamasta ptysia, jos määrität SIGCHLD-käsittelijän. Katso lisätietosivulta lisätietoja.

IRIX 6.0 ei käsittele pty-oikeuksia oikein, joten jos odottaa yrittää jakaa jonkun muun aiemmin käytetyn pty, se epäonnistuu. Päivitä IRIX 6.1: een.

Telnet (tarkistettu vain SunOS 4.1.2: ssa) riippuu jos TERM-asetusta ei ole asetettu. Tämä on ongelma cron-, cgi- ja cgi-skripteissä, jotka eivät määritä termiä. Siksi sinun on asetettava se nimenomaisesti - mihin tyyppi on yleensä merkityksetön. Se on vain asetettava jotain! Seuraavat todennäköisesti riittää useimmissa tapauksissa.

asettaa env (TERM) vt100

Vihje (tarkistettu vain BSDI BSD / OS 3.1 i386: ssa) riippuu, jos SHELL ja HOME eivät ole asetettu. Tämä on ongelma cron- , cgi- ja cgi- skripteissä, jotka eivät määritä näitä ympäristömuuttujia. Siksi sinun on asetettava ne nimenomaisesti - millainen on yleensä merkityksetön. Se on vain asetettava jotain! Seuraavat todennäköisesti riittää useimmissa tapauksissa.

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

Jotkin ptys-toteutukset on suunniteltu siten, että ydin hylkää lukemattoman tulostuksen 10-15 sekunnin kuluttua (todellinen luku riippuu toteutuksesta), kun prosessi on sulkenut tiedoston kuvaajan. Odotetaan näin ohjelmia, kuten

sukupolven päivämäärä nukkua 20 odottaa

tulee epäonnistumaan. Tämän välttämiseksi vedota ei-interaktiivisiin ohjelmiin execin kanssa eikä kutu . Vaikka tällaiset tilanteet ovat mahdollisia, käytännössä en ole koskaan kohdannut tilannetta, jossa todellisen interaktiivisen ohjelman lopputulos menetettäisiin tämän käyttäytymisen vuoksi.

Toisaalta Cray UNICOS hylkää kaikki lukemattomat tulokset välittömästi sen jälkeen, kun prosessi on sulkenut tiedoston kuvaajan. Olen ilmoittanut tämän Crayille ja he työskentelevät korjata.

Joskus kysynnän ja vastauksen välillä tarvitaan viive, kuten silloin, kun tty-rajapinta muuttaa UART-asetuksia tai vastaavat baudinopeudet etsimällä aloitus- / lopetusbittejä. Yleensä kaikki tämä on vaatia nukkumaan sekunnin tai kahta. Joustavampi tekniikka on tutkia uudelleen, kunnes laitteisto on valmis vastaanottamaan syötettä. Seuraavassa esimerkissä käytetään molempia strategioita:

lähetä "nopeus 9600"; nukkua 1 odottaa {timeout {lähetä "\ r"; exp_continue} $ prompt}

trap-koodi ei toimi millä tahansa komennolla, joka istuu Tcl: n tapahtumasilmukassa, kuten unta. Ongelma on se, että silmukan tapauksessa Tcl hylkää palautuskoodit asynk-tapahtumankäsittelijöiltä. Kiertotavara on asetettava lippu trap-koodiin. Tarkista lippu heti komennon jälkeen (eli nukkua).

Expect_background -komento jättää huomiotta - argumentteja, eikä sillä ole aikakatkaisujen käsitettä yleensä.

& # 34; EXPECT HINTS & # 34;

On olemassa muutamia asioita odottaa, että voi olla ei-intuitiivinen. Tämä osio yrittää käsitellä joitakin näistä asioista muutamalla ehdotuksella.

Yleinen odottaa ongelma on, miten tunnistaa kuoren kyselyt. Koska nämä ovat räätälöityjä eri tavalla eri ihmisiltä ja erilaisilta kuoreilta, rlogin portaaton automatisointi voi olla vaikeaa tietämättä nopeutta. Kohtuullinen yleissopimus on, että käyttäjät tallentavat säännöllisen lausekkeen, joka kuvaa niiden nopeaa (etenkin sen loppua) ympäristömuuttujassa EXPECT_PROMPT. Voidaan käyttää seuraavia koodeja. Jos EXPECT_PROMPT ei ole olemassa, koodilla on edelleen hyvät mahdollisuudet toimia oikein.

set prompt "(% | # | \\ $) $"; # oletushälytyksen kysely {aseta kehote $ env (EXPECT_PROMPT)} expect -re $ prompt

Kehotan sinua kirjoittamaan odottavia kuvioita, jotka sisältävät loppuun mitä odotat. Tämä välttää mahdollisuuden vastata kysymykseen ennen kuin koko asia näkyy. Lisäksi, vaikka saatat pystyä vastaamaan kysymyksiin ennen kuin näet ne kokonaan, jos vastaat varhaisessa vaiheessa, vastauksesi saattaa näkyä vastauksena kysymyksen keskelle. Toisin sanoen tuloksena oleva vuoropuhelu on oikea, mutta näyttää sekaisin.

Useimmissa kehoteissa on lopussa välilyönti. Esimerkiksi ftp-kehote on 'f', 't', 'p', '>' ja. Tämän kehotteen vastaamiseksi sinun on otettava huomioon jokainen näistä merkkeistä. On yleinen virhe olla sisällyttämättä aihioa. Laita tyhjiö nimenomaisesti.

Jos käytät lomakkeen X * mallia, * vastaa kaikki X: n päättymisestä saadut tulokset viimeiseen vastaanotettuun asiaan. Tämä kuulostaa intuitiiviselta, mutta voi olla hieman sekava, koska ilmaus "viimeinen asia vastaanotettu" voi vaihdella tietokoneen nopeuden ja I / O-prosessin mukaan sekä ydin että laiteohjain mukaan.

Erityisesti ihmisillä on taipumus nähdä ohjelmatulosteita, jotka saapuvat valtaville paloille (atomisesti), kun todellisuudessa useimmat ohjelmat tuottavat yhtä linjaa kerrallaan. Olettaen, että edellisen kappaleen kuvio * voi vain vastata nykyisen rivin loppua, vaikka näyttääkin olevan enemmän, koska ottelun aikaan, joka oli kaikki vastaanotettu tulos.

odottaa, ettei ole mitään keinoa tietää, että tuleva tuotos on tulossa, ellei sinun mallisi nimenomaan tue sitä.

Jopa riippuen linjapohjaisesta puskuroinnista on viisasta. Ei vain ohjelmat harvoin tekevät lupauksia siitä, millaisia ​​puskurointia ne tekevät, mutta järjestelmän ruoansulatuskanavan voi rikkoa tuotantolinjojen ylös niin, että rivit rikkoa näennäisesti satunnainen paikoissa. Näin ollen, jos voit ilmaista vihjeen viimeiset merkit hahmojen kirjoittamisen aikana, on järkevää tehdä niin.

Jos odotat kuviota ohjelman viimeisestä lähdöstä ja ohjelma lähettää jotain muuta, et voi havaita sitä aikakatkaisun avainsanalla. Syynä on se, ettei odoteta aikakatkaisua - sen sijaan se saa eof- indikaation. Käytä sitä sen sijaan. Vielä parempi, käytä molempia. Jos tätä riviä ei koskaan muuteta, sinun ei tarvitse muokata riviä itse.

Uudet rivit muunnetaan yleensä vaunuistuimiksi, rivinvaihtosekvenssit, kun terminaalin ohjain antaa ne. Joten, jos haluat mallin, joka vastaa eksplisiittisesti kahta riviä, esimerkiksi printf ("foo \ nbar"), käytä mallia "foo \ r \ nbar".

Samanlainen käännös tapahtuu lukemalla käyttäjältä expect_userin kautta. Tässä tapauksessa, kun painat paluuta, se käännetään uudelle riville. Jos odottaa tämän jälkeen ohjelmaa ohjelmaan, joka asettaa päätelaitteen raakamuotoon (kuten telnet), on ongelma, koska ohjelma odottaa todellista tuottoa. (Jotkin ohjelmat antavat anteeksi, koska ne automaattisesti kääntävät rivinsa takaisin, mutta useimmat eivät.) Valitettavasti ei ole mitään keinoa saada selville, että ohjelma asetti päätteensä raakamuotoiseksi.

Sen sijaan, että korvataan uudet rivit manuaalisesti palaamalla, ratkaisu on käyttää komentoa "stty raw", joka lopettaa käännöksen. Huomaa kuitenkin, että tämä tarkoittaa, että et enää saa valmiita rivinmuokkaustoimintoja.

vuorovaikutuksessa implicitly asettaa päätelaitteen raakamuotoon, joten tämä ongelma ei esiinny.

Usein kannattaa tallentaa salasanoja (tai muita yksityisiä tietoja) odottaa komentosarjoja. Tätä ei suositella, koska kaikki, jotka on tallennettu tietokoneeseen, ovat alttiita kaikille. Siten komentosarjan salasanojen välittäminen interaktiivisesti on älykkäämpi idea kuin upottaa ne kirjaimellisesti. Kuitenkin joskus tällainen upottaminen on ainoa mahdollisuus.

Valitettavasti UNIX-tiedostojärjestelmällä ei ole suoraa tapaa luoda komentosarjoja, jotka ovat suoritettavia mutta joita ei voida lukea. Järjestelmät, jotka tukevat setgid-komentojonoja, voivat epäsuorasti simuloida tätä seuraavasti:

Luo odottaa käsikirjoitusta (joka sisältää salaiset tiedot) tavalliseen tapaan. Tee sen käyttöoikeudet 750 (-rwxr-x ---), ja sen omistavat luotettu ryhmä eli ryhmä, joka saa lukea sen. Tarvittaessa luo uusi ryhmä tähän tarkoitukseen. Seuraavaksi luo / bin / sh -komentosarja, jolla on saman ryhmän omistamat käyttöoikeudet 2751 (-rwxr-s - x).

Tulos on käsikirjoitus, jonka kuka tahansa voi suorittaa (ja lukea). Kun sitä kutsutaan, se suorittaa Expect- komentosarjan.

& # 34; KATSO MYÖS & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: Tcl-pohjainen työkalu vuorovaikutteisten ohjelmien automatisointiin" , Don Libes, s. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"odottaa: Kuuntelemalla niitä hallitsemattomia vuorovaikutteisuutta" Don Libes, Kesä 1990 USENIX-konferenssi, Anaheim, Kalifornia, kesäkuu 11-15, 1990.
.I "Käyttämällä odottaa Automaa System Administration tehtävät" by Don Libes, Proceedings 1990 USENIX Suuret Asennus Systems Administration Conference, Colorado Springs, Colorado, 17-19 lokakuu 1990,.
.I "Tcl: Embeddable Command Language", John Ousterhout, Taloustieteiden julkaisuja 1990 USENIX-konferenssi, Washington, DC, 22-26.1.1990. "Odotan: Scripts Interactive Programs Controlling", Don Libes, Computing Systems , Voi. 4, n: o 2, Kalifornian yliopiston lehdistöjulkaisut, marraskuu 1991. "Doncesses", Don Libes, Kesä 1992: USENIX-konferenssi, s. 135-144, San Antonio, TX, 12.-15.6.1992. "Kibitz - yhdistää useita interaktiivisia ohjelmia yhdessä", Don Libes, Software - Practice & Experience, John Wiley & Sons, West Sussex, Englanti, Voi.

23, nro 5, toukokuu, 1993..I "Debugger for Tcl Applications", Don Libes, Proceedings of 1993 Tcl / Tk Workshop, Berkeley, CA, kesäkuu 10-11, 1993.

TEKIJÄ

Don Libes, National Standards and Technology Institute

KIITOKSET

Kiitos John Ousterhout for Tcl ja Scott Paisley inspiraatiosta. Kiitos Rob Savoye for Expectin automaattisen määrityskoodin.

HISTORY-tiedosto dokumentoi suurelta osin odotetun kehityksen. Se tekee mielenkiintoisen lukemisen ja saattaa antaa sinulle lisää tietoa tästä ohjelmasta. Kiitokset siinä mainituista ihmisistä, jotka lähettävät minulle virheenkorjauksia ja antoivat muuta apua.

Yhdysvaltojen hallitus on osittain varautunut ennakoiden suunnittelusta ja toteuttamisesta, ja se on siksi julkinen. Kirjoittaja ja NIST haluavat kuitenkin luottoa, jos tätä ohjelmaa ja dokumentaatiota tai niiden osia käytetään.