Príkaz Linux / Unix očakávať

Očakávať, že je program, ktorý hovorí s inými interaktívnymi programami podľa skriptu. Podľa skriptu očakáva, že očakáva od programu a aká správna odpoveď by mala byť. Tlmočený jazyk poskytuje rozvetvovacie a vysokoúrovňové riadiace štruktúry na usmerňovanie dialógu. Okrem toho môže používateľ prevziať kontrolu a priamo reagovať, keď sa to požaduje, potom vrátiť kontrolu do skriptu.

Expectk je zmes Expect a Tk. Chová sa rovnako ako želanie spoločnosti Expect a Tk. Očakávame, že je možné použiť aj priamo v C alebo C ++ bez Tcl.

Názov "Očakávať" pochádza z myšlienky vysielania / očakávania sekvencií propagovaných programami uucp, kermit a iných modemov. Avšak na rozdiel od uucp, Expect je generalizovaný tak, aby mohol byť spustený ako príkaz na úrovni užívateľa s akýmkoľvek programom a úlohou. Očakávame, že sa môže rozprávať s viacerými programami súčasne.

Čo môžete očakávať

Napríklad tu sú niektoré veci, ktoré očakáva príkaz:

Existuje celý rad dôvodov, prečo shell nemôže vykonávať tieto úlohy. Všetko je možné s programom Expect.

Všeobecne platí, že program Expect je užitočný pre spustenie ľubovoľného programu, ktorý vyžaduje interakciu medzi programom a používateľom. Všetko, čo je potrebné, je to, že interakciu možno charakterizovať programovo. Očakávame, že môže používateľovi poskytnúť spätnú kontrolu bez zastavenia kontrolovaného programu. Podobne môže používateľ kedykoľvek vrátiť kontrolu do skriptu.

používanie

Očakáva sa, že číta cmcsil pre zoznam príkazov na vykonanie. Očakávať, že implicitne môže byť vyvolaná na systémoch, ktoré podporujú #! zápisom označením skriptu ako spustiteľného a vytvorením prvého riadka v skripte:

#! / usr / local / bin / očakávať -f

Samozrejme, cesta musí presne opísať, kde očakáva život. / usr / local / bin je len príkladom.

Príznak -c predvádza príkaz, ktorý sa má vykonať skôr, než sa v skripte nachádza. Príkaz by mal byť uvedený, aby sa zabránilo rozbitiu shellom. Táto možnosť sa môže použiť niekoľkokrát. Viaceré príkazy môžu byť vykonané s jedným -c oddelením ich bodkočiarkami. Príkazy sa vykonávajú v poradí, v akom sa zobrazujú. Pri použití programu Expectk je táto voľba zadaná ako -command.

Príznak -d umožňuje určitý diagnostický výstup, ktorý predovšetkým vykazuje vnútornú aktivitu príkazov, ako sú očakávania a interakcie. Tento príznak má rovnaký účinok ako "exp_internal 1" na začiatku skriptu Expect a navyše sa vytlačí verzia Expect.

Príznak -D umožňuje interaktívny debugger. Celá hodnota by mala nasledovať. Debugger prevezme kontrolu pred ďalšou procedúrou Tcl, ak je hodnota nenulová, alebo ak je stlačené tlačidlo ^ C alebo sa narazí na bod zlomu alebo sa v skripte zobrazí iný vhodný príkaz debugger. Pri používaní programu Expectk je táto možnosť špecifikovaná ako - ladenie.

Príznak -f je súbor, z ktorého sa majú čítať príkazy. Samotná vlajka je voliteľná, pretože je užitočná iba pri použití #! zápis, takže ďalšie príkazy môžu byť dodané na príkazovom riadku. Pri použití programu Expectk je táto voľba zadaná ako súbor.

V predvolenom nastavení sa príkazový súbor prečíta do pamäte a vykoná sa v celom rozsahu. Príležitostne je vhodné čítať súbory naraz. Ak chcete vynútiť, aby sa ľubovoľné súbory spracovávali týmto spôsobom, použite príznak -b. Pri použití programu Expectk je táto voľba zadaná ako -buffer.

Ak je reťazec "-" dodaný ako názov súboru, namiesto toho sa načíta štandardný vstup. Použite "./-" na čítanie zo súboru skutočne nazvaného "-".

Znak príznaku -i očakáva interakčné výzvy na zadanie príkazov namiesto ich čítania zo súboru. Výzva sa ukončí pomocou príkazu exit alebo EOF. Príznak -i sa predpokladá, ak sa nepoužije ani príkazový súbor ani -c. Pri použití programu Expectk je táto možnosť špecifikovaná ako -interakčná.

- možno použiť na vymedzenie konca možností. To je užitočné, ak chcete skriptovi skopírovať argument vo forme voľby bez toho, aby bol interpretovaný programom Expect. To môže byť užitočne umiestnené v #! line, aby sa zabránilo interpretácii Expect. Napríklad nasledujúci text ponechá pôvodné argumenty vrátane názvu skriptu v premennej argv .

#! / usr / local / bin / očakávať -

Všimnite si, že obvyklé getopt (3) a execve (2) konvencie musia byť dodržané pri pridávaní argumentov k #! linka.

Súbor $ exp_library / expect.rc sa automaticky získava, ak je k dispozícii, ak sa nepoužíva príznak -N. (Pri použití programu Expectk je táto voľba zadaná ako -NORC.) Bezprostredne po tomto sa súbor ~ / .expect.rc získava automaticky, pokiaľ sa nepoužíva príznak -n. Ak je definovaná premenná prostredia DOTDIR, považuje sa to za adresár a odtiaľ sa číta .expect.rc. Pri použití programu Expectk je táto voľba zadaná ako -norc. Tento zdroj sa vyskytuje až po vykonaní akýchkoľvek príznakov -c.

-v spôsobí očakávania, že vytlačí číslo verzie a skončí. Príslušná vlajka v programe Expectk, ktorá používa dlhé názvy vlajok, je -version.

Voliteľné args sú zostavené do zoznamu a uložené v premennej s názvom argv a. argc sa inicializuje na dĺžku argv.

Argv0 je definovaný ako názov skriptu alebo binárneho súboru, ak nie je použitý žiadny skript. Napríklad nasledujúci vypisuje názov skriptu a prvé tri argumenty:

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

príkazy

Očakávame, že používa nástroj Command Language. Tcl poskytuje riadiaci tok (ak sa prelomí), hodnotenie výrazov a niekoľko ďalších funkcií, ako je rekurzia a definícia procedúry. Príkazy, ktoré sa tu používajú, ale nie sú definované (nastaviť, ak, exec) sú príkazy Tcl. Očakáva sa, že budú podporované ďalšie príkazy. Pokiaľ nie je uvedené inak, príkazy vrátia prázdny reťazec.

Príkazy sú uvedené v abecednom poradí, aby mohli byť rýchlo umiestnené. Avšak noví používatelia môžu ľahšie začať tým, že čítajú opisy spúšťania, odosielania, očakávania a interakcie v tomto poradí.

zavrieť [-slave] [-onexec 0 | 1] [-i spawn_id]

ukončí spojenie s aktuálnym procesom . Väčšina interaktívnych programov bude odhaľovať EOF na ich stdin a výstup; teda takmer zvyčajne stačí zabiť proces . Príznak -i deklaruje proces uzatvorenia zodpovedajúci pomenovanému spawn_id.

Obe očakávania a interakcie zistia, kedy ukončí súčasný proces a implicitne skončí, ale ak zabijete proces povedzme "exec kill $ pid", musíte explicitne zavolať .

Značka -onexec určuje, či je id plodu uzatvorené v akomkoľvek novom spustenom procese alebo ak je proces prekrytý. Ak necháte otvorené číslo idúceho trávenia, použite hodnotu 0. Nenulová celočíselná hodnota núti uzol uzavrieť v akýchkoľvek nových procesoch.

Príznak typu -slave uzatvára podriadenú identifikačnú identitu. Keď je spojenie zatvorené, podriadené zariadenie sa automaticky zatvorí aj vtedy, keď je otvorené.

Bez ohľadu na to, či je spojenie implicitne alebo explicitne zatvorené, mali by ste zavolať počkať, aby ste vyčistili príslušný slot pre procesné jadro. Zavrieť príkaz nezačne čakať, pretože neexistuje žiadna záruka, že zatvorenie procesného spojenia spôsobí jeho ukončenie.

ladenie [[-now] 0 | 1]

kontroluje debugger Tcl, ktorý umožňuje prechádzať výkazmi a nastaviť body prerušenia.

Bez argumentov sa vráti 1, ak ladiaci program nie je spustený, inak sa vráti 0.

S argumentom 1 je spustený debugger. S argumentom 0 je ladiaci program zastavený. Ak predbehne argument 1 -now, ladiaci program sa okamžite spustí. V opačnom prípade sa ladiaci program spustí s ďalším príkazom Tcl.

Príkaz ladenia nezmení žiadne pasce. Porovnajte to so začiatkom Predstavte si s príznakom -D.

Príkaz odpojenia odpojí zdieľaný proces z terminálu . Na pozadí pokračuje. Proces má svoju vlastnú procesnú skupinu. Štandardný vstup / výstup je presmerovaný na / dev / null .

Nasledujúci fragment používa odpojenie a pokračuje v spúšťaní skriptu na pozadí.

ak {{fork]! = 0} odpojte ukončenie. , ,

Nasledujúci skript číta heslo a potom spustí program každú hodinu, ktorá vyžaduje heslo pri každom spustení. Skript dodáva heslo tak, že ho musíte iba raz napísať.

send_user "heslo? \" expect_user -re "(. *) \ n" pre {} 1 {} {if {[fork]! = 0} {sleep 3600; 1, reťazec) \ r ". , , VÝCHOD }

Výhodou používania odpojenia cez funkciu asynchrónneho procesu (&) je to, že program Expect môže uložiť parametre terminálu pred odpojením a neskôr ich použiť na nové pty. Pri &, Expect nemá možnosť čítať parametre terminálu, pretože terminál je už odpojený v čase, keď program Expect získa kontrolu.

exit [-opts] [stav]

Príčiny očakávajú, že k tomu opustíte alebo sa inak pripravíte.

Príznak -onexit spôsobí, že nasledujúci argument sa použije ako popisovač výstupu. Bez argumentu sa vráti aktuálny popisovač výstupu.

Príznak -noexit spôsobí, že očakávate, že sa pripravíte na ukončenie, ale prestanete skutočne vrátiť kontrolu do operačného systému. Používateľom definovaný popisovač výstupu je spustený rovnako ako vlastné interné obslužné programy spoločnosti Expect. Žiadne ďalšie príkazy očakávania by sa nemali vykonať. To je užitočné, ak používate Expect s inými rozšíreniami Tcl. Aktuálny tlmočník (a hlavné okno v prostredí Tk) ostáva tak, aby ostatné rozšírenia Tcl mohli vyčistiť. Ak sa znova zavolá opustenie programu Expect (ak sa to môže stať), obsluha sa nezopakuje.

Po ukončení sú všetky pripojenia k plodným procesom zatvorené. Uzávierka bude odhalená ako EOF spôsobenými procesmi. výstup neuskutočňuje žiadne iné kroky, ako je normálna procedúra _exit (2). Preto môžu naštartované procesy, ktoré nekontrolujú EOF. (Rôzne podmienky sú dôležité pre určenie napríklad toho, aké signály budú odoslané procesy odoslané, ale tieto sú závislé od systému, zvyčajne sa zdokumentujú pod výstupom (3).) Spracované procesy, ktoré budú naďalej bežať, budú zdedené initom.

stav (alebo 0, ak nie je špecifikovaný) sa vráti ako výstupný stav programu Expect . ukončenie je implicitne vykonané, ak sa dosiahne koniec skriptu.

exp_continue [-continue_timer]
Príkaz exp_continue umožňuje očakávať , že bude pokračovať v spúšťaní, a nie vracať, ako by to bolo normálne. V predvolenom nastavení exp_continue obnoví časovač časového limitu. Príznak -continue_timer zabraňuje reštartu časovača. (Pozri viac informácií.)

exp_internal [-f súbor] hodnota
spôsobuje ďalšie príkazy na odoslanie diagnostických informácií interných na hodnotu Očakávať na hodnotu stderr, ak je hodnota nenulová. Tento výstup je deaktivovaný, ak je hodnota 0. Diagnostické informácie zahŕňajú každý prijatý znak a každý pokus, aby sa zhodoval s aktuálnym výstupom proti vzorkám.

Ak je dodaný voliteľný súbor , do tohto súboru sa zapíše všetok normálny a debugovací výstup (bez ohľadu na hodnotu hodnoty ). Akýkoľvek predchádzajúci diagnostický výstupný súbor je zatvorený.

Príznak -info spôsobuje, že exp_internal vráti opis najnovších nedoručených argumentov.

exp_open [args] [-i spawn_id]
vracia identifikátor súboru Tcl, ktorý zodpovedá pôvodnému identifikátoru. Identifikátor súboru sa potom môže použiť, akoby ho otvoril príkaz otvorený Tcl. (ID tresky by sa už nemalo používať.) Čakanie by sa nemalo vykonať.

Príznak -leaveopen opúšťa prístupové číslo id otvorené pre prístup prostredníctvom príkazov očakávania . Čakanie musí byť vykonané na idúcej ploche.

exp_pid [-i spawn_id]
vracia ID procesu zodpovedajúce aktuálne plodu procesu. Ak sa použije príznak -i , vrátené pid zodpovedá číslu daného ID tŕstia.

exp_send
je alias pre odoslanie .

exp_send_error
je alias pre send_error .

exp_send_log
je alias pre send_log .

exp_send_tty
je alias pre send_tty .

exp_send_user
je alias pre send_user .

exp_version [[-exit] verzia]
je užitočná na to, aby bol skript kompatibilný s aktuálnou verziou programu Expect.

Bez argumentov sa vráti aktuálna verzia programu Expect . Táto verzia môže byť potom zakódovaná vo vašom skripte. Ak skutočne viete, že nepoužívate funkcie nedávnych verzií, môžete zadať skoršiu verziu.

Verzie sa skladajú z troch čísel oddelených bodkami. Prvé je hlavné číslo. Skripty napísané pre verzie programu Expect s iným dôležitým číslom takmer určite nebudú fungovať. exp_version vráti chybu, ak sa hlavné čísla nezhodujú.

Druhým je menšie číslo. Skripty napísané pre verziu s väčším menším číslom ako aktuálna verzia môžu závisieť od novej funkcie a nemusia sa spúšťať. exp_version vráti chybu, ak sa zhodujú hlavné čísla, ale menšie číslo skriptu je väčšie ako bežné číslo.

Tretia je číslo, ktoré nezohráva žiadnu úlohu pri porovnaní verzií. Je však narastá, keď sa softvérová distribúcia Expect zmenila akýmkoľvek spôsobom, napríklad dodatočnou dokumentáciou alebo optimalizáciou. Pri každej novej menšej verzii sa vynuluje na 0.

Pomocou príznaku -exit očakáva výpoveď chybu a ukončí sa, ak je verzia neaktuálna.

očakávať [[-opts] pat1 body1] ... [-opts] patn [bodyn]
čaká, kým sa niektorý zo vzorov nezhoduje s výstupom procesu, ktorý sa plodil, uplynul špecifikovaný časový interval alebo sa zobrazí koniec súboru. Ak je konečné telo prázdne, môže sa vynechať.

Vzory z posledného príkazu expect_before sú implicitne použité pred akýmikoľvek inými vzormi. Vzory z posledného príkazu expect_after sú implicitne použité po všetkých ostatných vzorkách.

Ak argumenty pre celé očakávané vyhlásenie vyžadujú viac ako jeden riadok, všetky argumenty môžu byť "zarovnané" do jedného, ​​aby sa zabránilo ukončeniu každého riadku spätným lomítkom. V tomto jednom prípade sa zvyčajné substitúcie Tcl vyskytnú napriek zátvorkám.

Ak je vzorom kľúčové slovo eof , príslušné telo sa vykoná na konci súboru. Ak je vzorom časový limit kľúčového slova, príslušné telo sa vykoná po uplynutí časového limitu. Ak sa nepoužije žiadne kľúčové slovo časového limitu, po uplynutí časového limitu sa vykoná implicitná nulová akcia. Predvolené časové obmedzenie je 10 sekúnd, ale môže byť nastavené, napríklad na 30, príkazom "set timeout 30". Nekonečný časový limit môže byť označený hodnotou -1. Ak je vzorom predvolené kľúčové slovo, príslušné telo sa vykoná buď po uplynutí časového limitu alebo od konca súboru.

Ak sa vzorka zhoduje, vykoná sa príslušné telo. očakáva návrat výsledku tela (alebo prázdny reťazec, ak sa nezhoduje so vzorom). V prípade, že sa viac vzorov zhoduje, ten, ktorý sa objaví ako prvý, sa používa na výber trupu.

Pri každom príchode nového výstupu sa porovnáva s každým vzorom v poradí, v akom sú uvedené. Preto môžete otestovať neprítomnosť zápasu tým, že sa poslednému vzoru vytvorí niečo, čo by sa zaručilo, že sa objaví, napríklad výzva. V situáciách, v ktorých nie je výzva, musíte použiť časový limit (rovnako ako v prípade manuálnej interakcie).

Vzory sú špecifikované tromi spôsobmi. Štandardne sú vzory špecifikované ako pri príkaze reťazca reťazca Tcl. (Takéto vzory sú tiež podobné normálnym výrazom C-shell, ktoré sa zvyčajne označujú ako "globálne" vzory). Príznak -gl môže byť použitý na ochranu vzorov, ktoré by inak mohli očakávať, že očakávajú príznaky. Každý vzor začínajúci znakom "-" by mal byť chránený týmto spôsobom. (Všetky reťazce začínajúce "-" sú vyhradené pre budúce možnosti.)

Napríklad nasledujúci fragment hľadá úspešné prihlásenie. (Všimnite si, že zrušenie je predpokladané ako postup definovaný inde v skripte.)

očakávať {busy {puts busy \ n; exp_continue} sa nepodarilo zrušiť "neplatné heslo" abort timeout abort connected}

Citácie sú potrebné na štvrtom vzore, pretože obsahuje medzeru, ktorá by inak oddelila vzor od akcie. Vzory s rovnakou akciou (napríklad tretí a štvrtý) vyžadujú znova zobrazenie akcií. To sa dá vyhnúť používaním regexpových štýlov (pozri nižšie). Viac informácií o vytváraní vzorov v štýle globálneho svetla nájdete v príručke Tcl.

Štýly typu Regexp sledujú syntax definovaný pomocou príkazu regexp Tcl (krátka pre "regulárny výraz"). regexp vzory sú zavedené s príznakom -re . Predchádzajúci príklad možno prepísať pomocou regexp ako:

očakávať {busy {puts busy \ n; exp_continue} -re "neúspešne | neplatné heslo" abort timeout abort connected}

Obidva typy vzorov sú "nezasadené". To znamená, že vzory nemusia zodpovedať celému reťazcu, ale môžu začať a ukončovať zápas kdekoľvek v reťazci (pokiaľ sa všetko zhoduje). Použite ^, aby ste zodpovedali začiatku reťazca a $ sa zhodujú s koncom. Všimnite si, že ak nečakávate na koniec reťazca, vaše odpovede môžu ľahko skončiť uprostred reťazca, ako sa odrážajú od procesu plodu. Zatiaľ čo stále produkujú správne výsledky, výstup môže vyzerať neprirodzene. Preto používanie $ je odporúčané, ak môžete presne popísať znaky na konci reťazca.

Všimnite si, že v mnohých editorech, ^ a $ zodpovedajú začiatku a koniec riadkov. Avšak, pretože očakávate, že nie je line orientovaný, tieto znaky sa zhodujú so začiatkom a koncom údajov (na rozdiel od riadkov), ktoré sú v očakávanom vyrovnávacom buffere. (Pozri tiež poznámku nižšie o "systémovej trávení.")

Príznak -ex spôsobuje, že vzor sa má zhodovať s "presným" reťazcom. Nevytvára sa žiadna interpretácia *, ^, atď. (Aj napriek tomu sa musia dodržať obvyklé konvencie Tcl). Presné vzory sú vždy neopracované.

Príznak -nocase spôsobuje, že veľké znaky výstupu sa porovnávajú, akoby boli malé písmená. Vzor nie je ovplyvnený.

Pri čítaní výstupu môže viac ako 2000 bajtov vynútiť predchádzajúce bajty, aby boli "zabudnuté". Toto môže byť zmenené pomocou funkcie match_max . (Všimnite si, že nadmerne veľké hodnoty môžu spomaliť vzorkovanie.) Ak je patológ plný_buffer , vykoná sa príslušné telo, ak boli prijaté bajty match_max a žiadne iné vzory sa nezhodovali. Bez ohľadu na to, či sa používa kľúčové slovo full_buffer , zabudnuté znaky sú zapísané do položky expect_out (buffer).

Ak je patológie kľúčovým slovom null a sú povolené nuly (prostredníctvom príkazu remove_nulls ), zodpovedajúce telo sa vykoná, ak sa zhoduje s jedným ASCII 0. Nie je možné priradiť 0 bajtov cez globálne alebo regexp vzory.

Po priradení vzoru (alebo eof alebo full_buffer) sa v premennej expect_out (vyrovnávacej pamäti) uloží akýkoľvek zodpovedajúci a predtým bezkonkurenčný výstup. Do premenných expect_out (1, string) sa prostredníctvom očakávania_out (9, reťazec) uloží až 9 regexpových podreťazcov . Ak je pred vzorom použitá príznaková značka, indexy začiatočnej a koncovej (vo forme vhodnej pre medzery ) 10 reťazcov sú uložené v premenných expect_out (X, start) a expect_out (X, end), kde X je , zodpovedá pozícii podreťazcov v vyrovnávacej pamäti. 0 označuje reťazce, ktoré zodpovedajú celému vzoru a sú generované pre globálne vzory, ako aj vzory regexp. Ak napríklad proces priniesol výstup "abcdefgh \ n", výsledok:

očakávať "cd"

je ako keby nasledovné vyhlásenia vykonali:

nastaviť expect_out (0, reťazec) cd nastaviť expect_out (buffer) abcd

a "efgh \ n" zostáva vo vyrovnávacej pamäti výstupu. Ak proces vytvorí výstup "abbbcabkkkka \ n", výsledok:

očakávať -indices -re "b (b *). * (k +)"

je ako keby nasledovné vyhlásenia vykonali:

nastaviť očakávania_vyt (1, koniec) 1 set expect_out (0, koniec) 1 set expect_out (0, koniec) 10 set expect_out (0, string) bbbcabkkkk set expect_out (2, štart) 10 nastaviť expect_out (2, koniec) 10 set expect_out (2, string) k nastaviť očakávania (buffer) abbbcabkkkk

a "a \ n" zostáva vo vyrovnávacej pamäti výstupu. Vzor "*" (a -re ". *") Preplaví výstupnú vyrovnávaciu pamäť bez toho, aby čítal viac výstupov z procesu.

Za normálnych okolností je porovnaný výstup vyradený z interných vyrovnávacích pamätí programu Expect. Toto sa dá zabrániť predpoveďou vzoru s príznakom -notransfer . Tento príznak je obzvlášť užitočný pri experimentovaní (a môže byť skrátený "-not" pre pohodlie počas experimentovania).

Identifikátor plodu priradený k zodpovedajúcemu výstupu (alebo eof alebo full_buffer) je uložený v očakávanom (spawn_id) .

Príznak -timeout spôsobí, že príkaz očakávať, že použije nasledujúcu hodnotu ako časový limit namiesto použitia hodnoty premennej časového limitu.

Štandardne sú vzory porovnané s výstupom z aktuálneho procesu, ale príznak -i vyhlasuje, že výstup z pomenovaného zoznamu spawn_id sa porovná s nasledujúcimi vzormi (až do nasledujúceho -i ). Zoznam služby spawn_id by mal byť buď listom spawn_ids alebo premennou odkazujúcou na takýto zoznam položiek spawn_ids.

Napríklad nasledujúci príklad čaká na "pripojenie" z aktuálneho procesu, alebo "zaneprázdnený", "neúspešný" alebo "neplatné heslo" zo servera spawn_id pomenovaného $ proc2.

očakávať, že {-i $ proc2 obsadený {puts busy \ n; exp_continue} -re "neúspešne | neplatné heslo" abort timeout abort connected}

Hodnota globálnej premennej any_spawn_id môže byť použitá na porovnanie vzorov s akýmkoľvek spawn_ids, ktoré sú pomenované so všetkými ostatnými príznakmi -i v príkaze aktuálneho očakávania . Funkcia spawn_id z príznaku -i bez združeného vzoru (tj bezprostredne nasledujúcim iným -i ) je k dispozícii všetkým ostatným vzorom v rovnakom očakávanom príkaze asociovanom s any_spawn_id.

Príznak -i môže tiež pomenovať globálnu premennú, v takom prípade sa premenná číta pre zoznam identifikátorov spawn. Premenná sa znova prečíta, kedykoľvek sa zmení. Toto poskytuje spôsob zmeny zdroja I / O počas vykonávania príkazu. Kultúrne ids pochádzajúce z tohto režimu sa nazývajú "nepriame" identifikačné znaky.

Akcie, ako je prerušenie a pokračovanie, spôsobujú, že štruktúry riadenia (tj pre proces ) sa správajú obvyklým spôsobom. Príkaz exp_continue umožňuje očakávať , že bude pokračovať v spúšťaní, a nie vracať, ako by to bolo normálne.

To je užitočné pre vylúčenie explicitných slučiek alebo opakovaných očakávaných vyhlásení. Nasledujúci príklad je súčasťou fragmentu na automatizáciu rloginu. Exp_continue sa vyhýba tomu, aby musel napísať druhý príkaz očakávať (opätovné vyhľadanie výzvy), ak rlogin vyzve na zadanie hesla.

očakávame {password: {stty -echo send_user "pre $ user) na $ host:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out echo exp_continue} nesprávne {send_user "neplatné heslo alebo účet \ n" ukončenie} časový limit {send_user "pripojenie k hostiteľovi $ timed out \ n" exit} eof {send_user \ prompt $ prompt}

Napríklad nasledujúci fragment môže pomôcť používateľovi viesť interakciu, ktorá je už úplne automatizovaná. V tomto prípade sa terminál prepne do režimu "raw". Ak používateľ stlačí "+", zvýši sa premenná. Ak stlačíte tlačidlo "p", do procesu sa odošlú niekoľko návratov, možno nejakým spôsobom, a "i" umožňuje používateľovi komunikovať s procesom a účinne odcudziť kontrolu nad skriptom. V každom prípade exp_continue umožňuje aktuálnemu očakávanému pokračovaniu porovnávania vzorov po vykonaní aktuálnej akcie.

stty raw -exo očakávame_after {-i $ user_spawn_id "p" {odoslať "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "ukončiť" ukončenie}

V predvolenom nastavení exp_continue obnoví časovač časového limitu. Časovač sa neštartuje , ak sa volá exp_continue s príznakom -continue_timer .

očakávať po [očakávania]
pracuje identicky s očakávaním pred tým, že vzhľadom na to, že vzory od očakávaného aj očakávaného poľa sa môžu zhodovať, použije sa očakávaný vzor. Viac informácií nájdete v príkaze expect_before .

expect_background [expect_args]
má rovnaké argumenty ako očakávať , ale okamžite sa vráti. Vzory sa testujú vždy, keď príde nový vstup. Časový limit vzoru a predvolené nastavenie nemajú zmysel očakávať_podzemie a sú ticho zlikvidované. V opačnom prípade príkaz expect_background používa vzory očakávania pred očakávaním a očakávania ako rovnaké očakávania .

Keď sa vyhodnocujú akcie očakávania na pozadí, spracovanie pozadia pre tú istú ID tresky je zablokované. Spracovanie pozadia sa odblokuje po dokončení akcie. Keď je spracovanie na pozadí zablokované, je možné vykonať (popredné) očakávanie toho istého ID tŕstia.

Nie je možné vykonať očakávania, kým sa odblokuje funkcia očakávania_oblasti . expect_background pre konkrétne ID tráviaceho priestoru sa vymaže tým, že sa vyhlasuje nový očakávaný_oblasť s rovnakým ID tresky. Pri deklarovaní očakávania_obranky bez vzoru sa nedá odstrániť daný identifikátor plodín z možnosti prispôsobiť vzory na pozadí.

očakávať pred [očakávania]
má rovnaké argumenty ako očakávať , ale okamžite sa vráti. Vzorové dvojice od najnovších očakávaní pred tým istým ID tresky sa implicitne pridávajú k akýmkoľvek nasledujúcim príkazom očakávania . Ak sa vzorec zhoduje, považuje sa to za aký bol zadaný v očakávanom príkaze samotnom a pridružené telo sa vykoná v kontexte príkazu očakávania . Ak vzory oboch očakávame pred očakávaním a očakávame , že sa použiť, očakáva sa predpokladaný vzorec.

Ak nie je špecifikovaný žiaden vzor, ​​identifikátor tresky sa nekontroluje pre žiadne vzory.

Ak nie je prepísaný príznakom -i , očakávame, že sa vzory porovnajú s idúcim indexom definovaným v čase, keď bol vykonaný príkaz expect_before (nie vtedy, keď je jeho vzorec zhodný).

Príznak -info spôsobuje očakávania pred návratom aktuálnych špecifikácií, ktoré vzory sa budú zhodovať. V predvolenom nastavení sa hlásia o aktuálnom idúte. Na informáciu o idúte idúceho znaku sa môže uviesť nepovinná špecifikácia id. Napríklad

očakávať pred -info -i $ proc

Môžeme uviesť maximálne jednu špecifikáciu id. Vlajka -indirect potláča priame idúce splodiny, ktoré pochádzajú len z nepriamych špecifikácií.

Namiesto špecifikácie idúceho symbolu, príznak "-all" spôsobí "-info" hlásenie všetkých idúcich prvkov.

Výstup príznaku -info sa môže opätovne použiť ako argument, ktorý očakávate predtým.

expect_tty [expect_args]
je to ako očakávať, ale číta znaky z / dev / tty (tj údery od užívateľa). Štandardne sa čítanie uskutočňuje v režime varenia. Takže linky musia skončiť s návratom, aby ste ich očakávali . To sa môže zmeniť pomocou stty (pozri príkaz stty nižšie).

expect_user [expect_args]
je ako očakávať, ale číta znaky zo stdin (tj údery od užívateľa). Štandardne sa čítanie uskutočňuje v režime varenia. Takže linky musia skončiť s návratom, aby ste ich očakávali . To sa môže zmeniť pomocou stty (pozri príkaz stty nižšie).

vidlička
vytvára nový proces . Nový proces je presnou kópiou súčasného procesu očakávania . Na základe úspechu, vidlica vráti 0 do nového (podriadeného) procesu a vráti ID procesu podradeného procesu do rodičovského procesu . Pri zlyhaní (z dôvodu nedostatku zdrojov, napr. Swapového priestoru, pamäte), vidlica vráti -1 do rodičovského procesu a nie je vytvorený žiadny podriadený proces .

Vypínané procesy opúšťajú prostredníctvom príkazu exit , rovnako ako pôvodný proces . Na záznamové súbory sa môžu zapisovať napaľované procesy. Ak nevypnete ladenie alebo prihlásenie vo väčšine procesov, výsledok môže byť mätúci.

Niektoré pty implementácie môžu byť zmätené viacerými čitateľmi a spisovateľmi, a to aj na chvíľu. Preto je najbezpečnejšia vidlica pred procesmi rozmnožovania.

interagovať [string1 body1] ... [stringn [bodyn]]
dáva kontrolu nad aktuálnym procesom pre používateľa, takže sú stlačené klávesy do aktuálneho procesu a vrátia sa stdout a stderr aktuálneho procesu .

Páry reťazcov a telies môžu byť špecifikované ako argumenty, v takom prípade sa telo vykoná pri zadaní príslušného reťazca. (Štandardne reťazec nie je odoslaný do aktuálneho procesu .) Príkaz interpreta sa predpokladá, ak chýba posledné telo.

Ak argumenty pre celé vyhlásenie o interakcii vyžadujú viac ako jeden riadok, všetky argumenty môžu byť "zarovnané" do jedného, ​​aby sa zabránilo ukončeniu každého riadku spätným lomítkom. V tomto jednom prípade sa zvyčajné substitúcie Tcl vyskytnú napriek zátvorkám.

Napríklad nasledujúci príkaz spustí interakciu s nasledujúcimi pármi definovanými reťazcami: Keď sa stlačí ^ Z, funkcia Expect je pozastavená. (Príznak -reset obnovuje režimy terminálu.) Keď je stlačené tlačidlo ^ A, používateľ vidí, že ste zadali ovládací prvok A a proces je odoslaný ^ A. Keď stlačíte $, používateľ uvidí dátum. Keď stlačíte tlačidlo ^ C, očakávate ukončenie. Ak sa zadá "foo", používateľ vidí "bar". Keď je stlačený ~~, interpretátor Expect beží interaktívne.

nastaviť CTRLZ \ 032 interakciu {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "ste zadali ovládací prvok-A \ n"; odoslať "\ 001"} $ {send_user "Dátum je [formát hodín [hodiny sekundy]]"} \ 003 exit foo {send_user "bar"} ~~}

V pároch reťazec-body sa reťazce zhodujú v poradí, v akom sú uvedené ako argumenty. Struny, ktoré čiastočne zodpovedajú, nie sú odoslané do súčasného procesu pred očakávaním zvyšku. Ak sú zadané znaky tak, aby sa už nedalo dosiahnuť zhoda, iba časť reťazca bude odoslaná do procesu, ktorý nedokáže začať iný zápas. Takže reťazce, ktoré sú podradené čiastkové zhody, sa môžu neskôr zhodovať, ak sa pôvodné reťazce, ktoré sa pokúšali o zápas, nakoniec zlyhajú.

V predvolenom nastavení je zhoda reťazca presná, bez toho, aby existovali žiadne divoké karty . (Na rozdiel od toho príkaz očakávať používa predvolené vzory v globálnom štýle.) Príznak -ex môže byť použitý na ochranu vzorov, ktoré by inak mohli zodpovedať vzájomne pôsobiacim zázname. Každý vzor začínajúci znakom "-" by mal byť chránený týmto spôsobom. (Všetky reťazce začínajúce "-" sú vyhradené pre budúce možnosti.)

Značka -re núti reťazec interpretovať ako vzor regexp. V tomto prípade sú zodpovedajúce podčiarkniny uložené v premennej interact_out podobne ako spôsob, akým sa očakáva ukladanie výstupu v premennej expect_out . Podobne je podporovaná príznaková značka .

Vzor eof predstavuje akciu, ktorá sa vykoná na konci súboru. Samostatný eof vzor môže tiež nasledovať príznak -output, v ktorom prípade sa zhoduje, ak je eof detekovaný počas zápisu výstupu. Predvolená eof akcia je "návrat", takže interakcia sa jednoducho vráti na akýkoľvek EOF.

Časový limit vzoru predstavuje časový limit (v sekundách) a akciu, ktorá sa vykoná po tom, čo sa pre daný čas neprečítali žiadne znaky. Vzor časového limitu platí pre naposledy špecifikovaný proces . Neexistuje predvolený časový limit. Špeciálna premenná "timeout" (používaná príkazom očakávania ) nemá vplyv na tento časový limit.

Napríklad, nasledujúce vyhlásenie by sa mohlo použiť na autológovanie používateľov, ktorí nešifovali nič za hodinu, ale stále dostávajú časté systémové správy:

interact -input $ user_spawn_id timeout 3600 návrat-výstup \ $ spawn_id

Ak je vzorom kľúčové slovo null a sú povolené nuly (prostredníctvom príkazu remove_nulls ), zodpovedajúce telo sa vykoná, ak je zhodná jedna ASCII 0. Nie je možné priradiť 0 bajtov cez globálne alebo regexp vzory.

Pripravovanie vzoru s príznakom -wririte spôsobí, že premenná interact_out (spawn_id) sa nastaví na hodnotu spawn_id, ktorá zodpovedá vzoru (alebo eof).

Akcie, ako je prerušenie a pokračovanie, spôsobujú, že štruktúry riadenia (tj pre proces ) sa správajú obvyklým spôsobom. Príčiny návratu však navzájom ovplyvňujú návrat k svojmu volajúcemu, zatiaľ čo inter_return spôsobuje interakciu, ktorá spôsobuje návratnosť volajúceho. Napríklad, ak "proc foo" volal interakciu, ktorá potom vykonala akciu inter_return , proc foo by sa vrátil. (To znamená, že ak interaktívne volanie interpret interaktívne písanie späť spôsobí interakciu pokračovať, zatiaľ čo inter_return spôsobí, že interaktívne sa vráti na jeho volajúceho.)

Počas interakcie sa používa nespracovaný režim, takže všetky znaky môžu byť prenesené do aktuálneho procesu . Ak súčasný proces nezachytí signály riadenia úlohy, zastaví sa, ak bude vyslaný signál zastavenia (predvolene ^ Z). Ak ho chcete reštartovať, pošlite signál pokračovania (napríklad "kill-CONT"). Ak naozaj chcete odoslať SIGSTOP do takého procesu (podľa ^ Z), najskôr zvážte trieštenie csh a potom spustite program. Na druhej strane, ak chcete odoslať SIGSTOP, aby ste očakávali, najprv zavolajte tlmočníka (možno pomocou znaku úniku) a stlačte ^ Z.

Párové reťazce môžu byť použité ako skratka, aby sa zabránilo nutnosti vstúpiť do tlmočníka a vykonať príkazy interaktívne. Predchádzajúci režim terminálu sa používa pri vykonávaní tela páru struny a tela.

Pre rýchlosť sa v predvolenom nastavení vykonávajú akcie v nespracovanom režime. Príznak -reset obnoví terminál do režimu, ktorý mal pred vykonaním interakcie (vždy varený režim). Upozorňujeme, že znaky zadané pri prepínaní režimu sa môžu stratiť (nešťastná funkcia ovládača terminálu v niektorých systémoch). Jediný dôvod na použitie resetu je, ak vaša akcia závisí od spustenia v režime varenia.

Príznak -echo odošle znaky, ktoré zodpovedajú nasledujúcemu vzoru späť do procesu, ktorý ich vygeneroval pri čítaní každého znaku. To môže byť užitočné, keď používateľ potrebuje zobraziť spätnú väzbu z čiastočne napísaných vzorov.

Ak sa vzor opakuje, ale nakoniec sa nezhoduje, znaky sa odošlú do procesu plodu. Ak sa proces rozmnožovania odráža, užívateľ uvidí znaky dvakrát. -echo je pravdepodobne vhodný len v situáciách, keď je pravdepodobné, že používateľ nebude dokončiť vzor. Napríklad nasledujúci výňatok pochádza z rftp, rekurzívny-ftp skript, kde je používateľ vyzvaný na zadanie ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; Sú to tak ďaleko od bežných príkazov ftp, že používateľ pravdepodobne nepríde ~, po ktorom nasleduje čokoľvek iné, s výnimkou chyby, v takom prípade pravdepodobne ignorujú výsledok.

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

Príznak -nobuffer odosiela znaky, ktoré zodpovedajú nasledujúcemu vzoru v procese výstupu, keď sa čítajú znaky.

Toto je užitočné, ak chcete, aby program zopakoval vzor. Napríklad je možné sledovať, kde sa osoba volá (Hayesov modem). Zakaždým, keď sa zobrazí "atd", skript zaznamená zvyšok riadku.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" návrat kladie $ log "[formát hodín [hodiny sekund]]: volaný $ interact_out (1, string)" interact -nobuffer "atd"

Počas interakcie sa predchádzajúce používanie log_user ignoruje. Konkrétne interakcia spôsobí, že jeho výstup bude zaznamenaný (odoslaný na štandardný výstup), pretože sa predpokladá, že používateľ nechce slepko komunikovať.

Príznak -o spôsobí, že sa na výstup aktuálneho procesu použijú nasledujúce páry kľúč-body. To môže byť užitočné napríklad pri rokovaní s hostiteľmi, ktorí odosielajú neželané znaky počas relácie telnet.

Štandardne interakt očakáva, že používateľ bude písať stdin a čítať stdout samotného procesu Expect . Príznak -u (pre "užívateľa") umožňuje vzájomné hľadanie používateľa ako proces, ktorý sa nazýva jeho argumentom (ktorý musí byť splnený id).

To umožňuje, aby dva nesúvisiace procesy boli spojené bez použitia explicitnej slučky. Ak chcete pomôcť pri ladení, očakávajte, že diagnostika vždy prejde na stderr (alebo stdout pre určité informácie o protokolovaní a ladení). Z rovnakého dôvodu bude príkaz tlmočníka interaktívne čítať zo stdin.

Napríklad nasledujúci fragment vytvorí prihlasovací proces . Potom vytočí užívateľa (nie je znázornený) a nakoniec spojí obidva dohromady. Samozrejme, každý proces môže byť nahradený prihlásením. Napríklad shell by umožnil používateľovi pracovať bez dodania účtu a hesla.

spawn prihlásiť nastaviť prihlásenie $ spawn_id spawn tip modem # dial out užívateľovi # pripojiť užívateľa na prihlásenie interact -u $ login

Ak chcete odoslať výstup do viacerých procesov, zoznam každého zoznamu idúcich prvkov predbehol príznak -output . Vstup pre skupinu výstupných identifikátorov trávy môže byť určený zoznamom identifikátorov tresky, ktorý je predbežný príznakom vstupu. (Both -input a -output môžu obsahovať zoznamy v rovnakej podobe ako príznak -i v očakávanom príkaze, okrem toho, že any_spawn_id nemá zmysluplné interakcie .) Všetky nasledujúce príznaky a reťazce (alebo vzory) sa vzťahujú na tento vstup až do ďalšieho - zobrazí sa príznak vstupu. Ak sa nezobrazí žiadny vstup, -výstup znamená "-input $ user_spawn_id -output". (Podobne aj pri vzorkách, ktoré nemajú zadávanie .) Ak je zadaný jeden -pozadie , prepíše $ user_spawn_id. Ak je zadaný druhý vstup , prepíše $ spawn_id. Je možné špecifikovať prídavné vstupné príznaky.

Dva implicitné vstupné procesy majú štandardné nastavenie výstupov ako $ spawn_id a $ user_spawn_id (opačne). Ak sa zobrazí príznak vstupu s príznakom bez výstupu , znaky z tohto procesu sa vyhodia.

Príznak -i zavádza náhradu za aktuálnu hodnotu spawn_id, keď sa nepoužívajú žiadne iné príznaky -input alebo -output. Príznak A -i znamená príznak -o.

Je možné meniť procesy, s ktorými sa pracuje, použitím nepriamych identifikátorov trávy. (Nepriame identifikátory tŕstia sú popísané v sekcii príkazu očakávania.) Nepriame identifikátory trávenia môžu byť špecifikované pomocou príznakov -i, -u, -input alebo -output.

tlmočník [args]
spôsobí, že používateľ bude interaktívne vyzvaný na príkazy Expect a Tcl. Výsledok každého príkazu sa vytlačí.

Akcie, ako je prerušenie a pokračovanie, spôsobujú, že štruktúry riadenia (tj pre proces ) sa správajú obvyklým spôsobom. Avšak návrat spôsobí, že tlmočník sa vráti do svojho volajúceho, zatiaľ čo inter_return spôsobí, že tlmočník spôsobí vrátenie volajúceho. Ak sa napríklad "proc foo" nazýva interpret, ktorý potom vykonal akciu inter_return , vráti sa proc foo . Akýkoľvek iný príkaz spôsobí, že tlmočník bude pokračovať v podávaní nových príkazov.

V predvolenom nastavení výzva obsahuje dve celé čísla. Prvé celé číslo opisuje hĺbku hodnotiacej zostavy (tj koľkokrát sa volá Tcl_Eval). Druhé celé číslo je identifikátor histórie Tcl. Príkaz môžete nastaviť definovaním postupu s názvom "prompt1", ktorého návratová hodnota sa stane ďalšou výzvu. Ak má príkaz otvorené úvodzovky, zátvorky, zátvorky alebo zátvorky, sekundárny riadok (štandardne "+>") sa vydáva na novom riadku. Vedľajšiu výzvu možno nastaviť definovaním postupu s názvom "prompt2".

Počas tlmočníka sa používa režim varenia, aj keď jeho volajúci používal nespracovaný režim.

Ak je stdin uzatvorený, tlmočník sa vráti, pokiaľ nie je použitý príznak -eof , v tomto prípade sa vyvolá následný argument.

log_file [args] [[-a] súbor]
Ak je poskytnutý názov súboru, súbor log_file zaznamená prepis relácie (začínajúci v danom bode) v súbore. log_file zastaví nahrávanie, ak nebol zadaný žiadny argument. Predchádzajúci súbor denníka je zatvorený.

Namiesto názvu súboru môže byť identifikátor súboru Tcl poskytnutý pomocou príznakov -open alebo -leaveopen . Toto je podobné príkazu spawn . (Viac informácií nájdete v časti Splniť .)

Príznaky -a vlajky majú byť zaznamenané, ktoré boli potlačené príkazom log_user .

Predvolene príkaz log_file pripojí k starším súborom, skôr než ich skráti, pretože je vhodné, aby sa v jednom relácii mohli odhlásiť a zapisovať viacnásobne. Ak chcete skrátiť súbory, použite príznak -noappend .

Príznak -info spôsobí, že log_file vráti opis najnovších nedoručených argumentov.

log_user -info | 0 | 1
Predvolene je protokol odoslaný / očakávaný zaznamenaný do stdout (a logfile, ak je otvorený). Logovanie na stdout je zakázané príkazom "log_user 0" a opätovne zapnuté "log_user 1". Zaznamenávanie do denníka je nezmenené.

Príznak -info spôsobuje, že log_user vráti opis najnovších nedoručených argumentov.

match_max [-d] [-i spawn_id] [veľkosť]
definuje veľkosť vyrovnávacej pamäte (v bajtoch), ktorá sa používa interným spôsobom. Bez argumentu veľkosti sa vráti aktuálna veľkosť.

S príznakom -d je nastavená predvolená veľkosť. (Východisková hodnota je 2000.) S príznakom -i je veľkosť nastavená pre pomenovaný identifikátor tresky, inak je nastavený pre aktuálny proces .

overlay [- # spawn_id] [- # spawn_id] [...] program [args]
spustí program " args" namiesto aktuálneho programu Expect , ktorý ukončí. Rozpoznaný argument pomáha spojiť pomlčku pred názvom príkazu, ako keby to bol prihlasovací shell. Všetky súbory spawn_ids sú zatvorené okrem tých, ktoré sú pomenované ako argumenty. Tieto sú namapované na identifikované identifikátory súborov.

Spawn_ids sú mapované na identifikátory súborov pre nový program, ktorý má dediť. Napríklad nasledujúci riadok beží na šachách a umožňuje ich ovládanie súčasným procesom - povedzme šachový majster.

prekrytie -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id šach

Je to efektívnejšie ako "interagovať -u", ale obetuje schopnosť robiť naprogramovanú interakciu, pretože proces Expect už nie je pod kontrolou.

Upozorňujeme, že nie je k dispozícii žiaden ovládací terminál. Ak teda odpojíte alebo znovu prepočíte štandardný vstup, programy, ktoré vykonávajú kontrolu úloh (shell, prihlásenie atď.), Nebudú správne fungovať.

parita [-d] [-i spawn_id] [hodnota]
definuje, či by sa parita mala zachovať alebo odstrániť z výstupu procesov, ktoré sa rozvinuli. Ak je hodnota nula, parita sa odstráni, inak nie je odstránená. Bez argumentu hodnoty sa vráti aktuálna hodnota.

Pomocou príznaku -d je nastavená predvolená hodnota parity. (Východisková hodnota je 1, tj parita sa neodstraňuje.) S príznakom -i je hodnota parity nastavená pre pomenovaný parameter spawn id, inak je nastavená pre aktuálny proces .

remove_nulls [-d] [-i spawn_id] [hodnota]
definuje, či sú nulls zachované alebo odstránené z výstupu plodených procesov predtým, ako sa porovnávajú alebo uložia v premennej expect_out alebo interact_out . Ak je hodnota 1, odstránia sa nuly. Ak je hodnota 0, nulové hodnoty sa neodstránia. Bez argumentu hodnoty sa vráti aktuálna hodnota.

S príznakom -d je nastavená predvolená hodnota. (Východisková hodnota je 1, tj odstránia sa nuly.) Pomocou príznaku -i je hodnota nastavená pre pomenovaný identifikátor spúšťania, inak je nastavený pre aktuálny proces .

Bez ohľadu na to, či sú nuly odstránené, očakávame, že zaznamenajú nulové bajty do protokolu a stdout.

odoslať reťazec [-flags]
Odošle reťazec aktuálnemu procesu . Napríklad príkaz

poslať "hello world \ r"

posiela znaky, helloworld do aktuálneho procesu . (Tcl obsahuje príkaz typu printf (nazývaný formát ), ktorý môže vytvoriť ľubovoľne komplexné reťazce.)

Znaky sa odosielajú okamžite, hoci programy s riadkovým vstupom nečítajú znaky, kým sa nezobrazí znak návratu. Vrátený znak je označený ako "\ r".

Vlajka - núti nasledujúci argument interpretovať ako reťazec, nie ako príznak. Ktorémukoľvek reťazcu môže predchádzať znak "-", či už skutočne vyzerá ako príznak. To poskytuje spoľahlivý mechanizmus na špecifikáciu variabilných reťazcov bez toho, aby boli zapadnutí tým, ktorí náhodou vyzerajú ako vlajky. (Všetky reťazce začínajúce "-" sú vyhradené pre budúce možnosti.)

Príznak -i vyhlasuje, že reťazec bude odoslaný na názov spawn_id. Ak spawn_id je user_spawn_id a terminál je v nespracovanom režime, nové riadky v reťazci sú preložené do sekvencií návratu-newline tak, aby sa zdali, akoby bol terminál v režime varenia. Príznak -raw zakazuje tento preklad.

Príznak -null posiela nulové znaky (0 bajtov). V predvolenom nastavení sa vysiela jedna nula. Celé číslo môže nasledovať - null označiť, koľko nulls poslať.

Značka -break generuje stav zlomu. To má zmysel iba vtedy, ak sa id spawn označuje tty zariadením otvoreným cez "spawn-open". Ak ste vytvorili proces, ako je tip, mali by ste použiť konvenciu tipov na vytvorenie prestávky.

Príznaky s- vlajkových síl sa posielajú "pomaly", čím sa zabráni bežnej situácii, keď počítač vytypuje vstupnú vyrovnávaciu pamäť, ktorá bola navrhnutá pre človeka, ktorý by nikdy neprekročil rovnaký buffer . Tento výstup je riadený hodnotou premennej "send_slow", ktorá obsahuje zoznam dvoch prvkov. Prvým prvkom je celé číslo, ktoré opisuje počet bajtov, ktoré majú byť odoslané na atómovej úrovni. Druhým prvkom je skutočné číslo, ktoré opisuje počet sekúnd, v ktorých musí byť atómové odosielanie oddelené. Napríklad, "set send_slow {10 .001}" by núti "send -s" posielať reťazce s 1 milisekundou medzi každých 10 odoslaných znakov.

Príznaky -h vlajky majú byť odoslané (trochu) ako ľudské písanie. Medzi znakmi sa objavujú oneskorenia podobné človeku. (Algoritmus je založený na distribúcii Weibullu s úpravami, ktoré vyhovujú tejto konkrétnej aplikácii.) Tento výstup je riadený hodnotou premennej "send_human", ktorá obsahuje zoznam piatich prvkov. Prvými dvoma prvkami sú priemerné medzipriestorové časy znakov v sekundách. Prvý sa používa štandardne. Druhý sa používa pri koncovkách slov, aby simuloval jemné prestávky, ktoré sa pri takýchto prechodoch príležitostne vyskytujú. Tretí parameter je mierou variability, kde .1 je pomerne variabilná, 1 je primerane premenlivá a 10 je celkom nezmenená. Extrémy sú 0 až nekonečne. Poslednými dvoma parametrami sú minimálny a maximálny čas medzipriestoru. Minimálna a maximálna hodnota sa používa naposledy a "klip" v poslednom čase. Konečný priemer môže byť úplne odlišný od daného priemeru, ak je minimálny a maximálny klip dosť hodnôt.

Napríklad nasledujúci príkaz emuluje rýchle a konzistentné písací stroj:

nastaviť send_human {.1 .3 1 .05 2} poslať -h "Mám hlad, urobme obed."

zatiaľ čo nasledovné môžu byť vhodnejšie po kocovine:

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

Všimnite si, že chyby nie sú simulované, aj keď si môžete nastaviť situácie s opravou chýb sami tým, že vložíte chyby a opravy do argumentu odoslania.

Vlajky na odosielanie nulových znakov, na odosielanie prestávok, na vynútenie pomalého výstupu a na výstup v ľudskom štýle sa navzájom vylučujú. Použije sa len ten, ktorý bol zadaný ako posledný. Okrem toho nie je možné špecifikovať žiadny reťazec s vlajkami na odosielanie nulových znakov alebo prestávok.

Je dobré predchádzať prvému odoslaniu do procesu očakávaním . očakáva, že čaká na spustenie procesu , zatiaľ čo odoslanie nemôže. Najmä ak prvý odoslanie dokončí pred spustením procesu , riskujete, že vaše dáta budú ignorované. V situáciách, v ktorých interaktívne programy neobsahujú žiadnu počiatočnú výzvu, môžete pred odoslaním poslať oneskorenie ako v:

# Aby nedošlo k tomu, že hackeri poskytnú rady o tom, ako sa prelomiť, # tento systém nevyzve externé heslo. # Počkajte 5 sekúnd pre exec dokončiť spawn telnet very.secure.gov spať 5 poslať heslo \ r

exp_send je alias pre odoslanie. Ak používate program Expectk alebo iný variant programu Expect v prostredí Tk, odoslanie je definované Tk na úplne iný účel. exp_send poskytuje kompatibilitu medzi prostredím. Podobné aliasy sa poskytujú pre ostatné príkazy odoslania spoločnosti Expect.

send_error [-flags] reťazec
je ako odoslanie , okrem toho, že výstup je odoslaný na stderr skôr ako súčasný proces .

send_log [-] reťazec
je ako odoslanie , okrem toho, že reťazec je odoslaný iba do súboru denníka (pozri log_file .) Argumenty sú ignorované, ak nie je otvorený žiadny protokolový súbor.

reťazec send_tty [-flags]
je ako poslať , okrem toho, že výstup je odoslaný na / dev / tty namiesto aktuálneho procesu .

send_user [-flags] reťazec
je ako poslať , okrem toho, že výstup je poslaný na stdout skôr ako súčasný proces .

spať sekundy
spôsobí skript spánku pre daný počet sekúnd. Sekundy môžu byť desiatkové číslo. Prerušenia (a udalosti Tk, ak používate aplikáciu Expectk) sa spracúvajú počas doby, keď očakávame, že spí.

spawn [args] program [args]
vytvára nový proces s programom "args". Jeho stdin, stdout a stderr sú prepojené s očakávaním, aby ich mohli čítať a písať ďalšie príkazy Expect . Spojenie je porušené zatvorením alebo ak samotný proces uzatvára niektorý z identifikátorov súboru.

Keď je proces spustený spawn , premenná spawn_id je nastavená na deskriptor odkazujúci na tento proces . Proces opísaný spawn_id sa považuje za "súčasný proces ". spawn_id môže byť čítané alebo písané, čo v skutočnosti poskytuje kontrolu pracovných miest.

user_spawn_id je globálna premenná obsahujúca deskriptor, ktorý odkazuje na používateľa. Napríklad, keď je hodnota spawn_id nastavená na túto hodnotu, očakáva sa, že sa bude správať ako očakávania_user .

.I error_spawn_id je globálna premenná obsahujúca deskriptor, ktorý odkazuje na štandardnú chybu. Ak je napríklad hodnota spawn_id nastavená na túto hodnotu, odoslanie sa správa ako send_error .

tty_spawn_id je globálna premenná obsahujúca deskriptor, ktorý odkazuje na / dev / tty. Ak / dev / tty neexistuje (napríklad v cron, v alebo v dávkovom skripte), potom tty_spawn_id nie je definovaný. Toto môže byť testované ako:

ak {{vars tty_spawn_id]} {# / dev / tty existuje} iný {# / dev / tty neexistuje # pravdepodobne v cron, dávka alebo skript}

spawn vráti identifikáciu procesu UNIX. Ak sa nevytvorí žiadny proces , vráti sa 0. Premenná spawn_out (slave, name) je nastavená na názov zariadenia pty slave.

V predvolenom nastavení odzrkadľuje názov príkazu a argumenty. Prípad -noecho stopy sa rozplýva .

Príznak -console spôsobuje presmerovanie výstupu konzoly na proces, ktorý sa rozmnožil. Toto nie je podporované vo všetkých systémoch.

V internom štádiu používa pty, inicializuje rovnakým spôsobom ako tty používateľa. Toto sa ďalej inicializuje tak, aby všetky nastavenia boli "sane" (podľa stty (1)). Ak je premenná stty_init definovaná, interpretuje sa v štýle stty argumentov ako ďalšia konfigurácia. Napríklad, "nastaviť stty_init raw" spôsobí, že ďalšie terminály procesov sa vytvoria v nespracovanom režime. -nototykopy preskočí inicializáciu na základe tty používateľa. -nottyinit preskočí inicializáciu "sane".

Za normálnych okolností trvá spawn trvať len málo času na vykonanie. Ak si všimnete, že spawn trvá značné množstvo času, pravdepodobne sa stretnete s ptys, ktoré sú zaklinené. Na pty sa spúšťa niekoľko testov, aby sa zabránilo spleteniu s nepríjemnými procesmi. (Tieto trvajú 10 sekúnd na zachytené pty.) Spustenie očakávania s voľbou -d ukáže, či Expect narazí na veľa ptys v nepárnych stavoch. Ak nemôžete zabiť procesy, ku ktorým sú pripojené tieto pty, môže sa stať, že reštartujete.

Ak program nie je úspešný, pretože exec (2) zlyhá (napr. Ak program neexistuje), chybové hlásenie sa vráti ďalším príkazom interact alebo očakávať, ako keby program bežal a vytvoril chybovú správu ako výstup. Toto správanie je prirodzeným dôsledkom realizácie tresky . Vnútorne sa rozrábajú vidličky, po ktorých vzniknutý proces nemá spôsob, ako komunikovať s pôvodným procesom očakávania, okrem komunikácie cez spawn_id.

Príznak -open spôsobí, že nasledujúci argument sa interpretuje ako identifikátor súboru Tcl (tj vrátený otvoreným .) Identifikátor tresky sa potom môže použiť, ako keby to bol zažitý proces . (Identifikátor súboru by sa už nemal používať.) Toto vám umožňuje spracovávať surové zariadenia, súbory a potrubia ako procesy, ktoré sa plodia bez použitia pty. 0 sa vráti na označenie, že neexistuje žiadny súvisiaci proces . Keď je spojenie so spusteným procesom zatvorené, tak je aj identifikátor súboru Tcl. Príznak -leaveopen je podobný ako -open okrem toho, že -leaveopen spôsobí, že identifikátor súboru zostane otvorený aj po zatvorení idúceho znaku .

Vlajka -typ spôsobí otvorenie pty, ale nedôjde k žiadnemu procesu . 0 sa vráti na označenie, že neexistuje žiadny súvisiaci proces . Spawn_id sa nastavuje ako obvykle.

Premenná spawn_out (slave, fd) je nastavená na identifikátor súboru zodpovedajúci pty slave. Môže byť zatvorená pomocou funkcie "close-slave".

Príznak -ignore označuje signál, ktorý sa má ignorovať v procese plodenia . V opačnom prípade signály získajú predvolené správanie. Signály sú pomenované ako v príkaze trap , okrem toho, že každý signál vyžaduje samostatný príznak.

úroveň stracy
spôsobuje, že budú pred vydaním tlačených vyhlásení vytlačené. (Príkaz sledovania Tcl určuje premenné.) Úroveň udáva, ako ďaleko v zásobníku volaní je možné sledovať. Napríklad nasledujúci príkaz beží pri čakaní na prvé 4 úrovne hovorov, ale nie pod ním.

očakávať -c "strace 4" script.exp

Príznak -info spôsobí, že sa strace vráti k opisu najnovších neinformačných argumentov.

stty args
mení režimy terminálu podobne ako externý príkaz stty.

Štandardne je prístupný riadiaci terminál. Ostatné terminály možno pristupovať pripojením "Žiadosti o stav vrátiť ako výsledok príkazu.Ak nie je požadovaný žiadny stav a ovládací terminál je prístupný, predchádzajúci stav surových a echo atribúty sú vrátené vo forme, ktorá môže byť neskôr použitý príkazom.

Napríklad argumenty raw alebo cooked dávajú terminál do raw režimu. Argumenty - raňajky alebo varené dali terminál do vareného režimu. Argumenty echo a -echo umiestnili terminál do režimu echo a noecho.

Nasledujúci príklad ukazuje, ako dočasne vypnúť ozvenu. To by sa mohlo použiť v inak-automatických skriptoch, aby sa zabránilo vloženiu hesiel do nich. (Viac diskusií nájdete v časti PODĽA OČEKÁVANIA KONTROLY nižšie.)

stty -echo send_user "Heslo:" expect_user -re "(. *) \ n" nastaviť heslo $ expect_out (1, string) stty echo

system args
dáva args sh (1) ako vstup, rovnako ako keby bol zadaný ako príkaz z terminálu. Očakávajte čakanie, kým sa škrupina nedokončí. Stav vrátenia od sh sa spracováva rovnakým spôsobom, akým exec spracováva svoj stav návratu.

Na rozdiel od exec, ktorý presmeruje stdin a stdout na skript, systém nevykonáva žiadnu presmerovanie (inú než je tá, ktorá je označená samotným reťazcom). Preto je možné použiť programy, ktoré musia komunikovať priamo s / dev / tty. Z rovnakého dôvodu sa výsledky systému nezaznamenávajú v protokole.

časové označenie [args]
vráti časovú pečiatku. Bez argumentov, počet sekúnd od vrátenia epochy.

Príznak -format predstavuje reťazec, ktorý je vrátený, ale s náhradami vykonanými podľa pravidiel POSIX pre strftime. Napríklad% a je nahradený skráteným názvom v týždni (tj Sat). Iní sú:

% a skrátený názov dňa v týždni% Celý názov dňa v týždni% b skrátený názov mesiaca% B celý názov mesiaca% c dátum ako v: St Oct 6 11:45:56 1993% d dňa v mesiaci (01-31% H hodina (00-23)% I hodiny (01-12)% j deň (001-366)% m mesiac (01-12)% M min (00-59)% p am or pm% S second (00-61) % u deň (1-7, pondelok je prvý deň v týždni)% U týždeň (00-53, prvá nedeľa je prvý deň v týždni jedna)% V týždeň (01-53, štýl ISO 8601)% w deň 6)% W týždeň (00-53, prvý pondelok je prvý deň v týždni jeden)% x dátum-čas ako v: st október 1993% X čas ako v: 23:59:59% y rok (00-99) % Y rok ako v: 1993% Z časové pásmo (alebo nič, ak nie je možné určiť) %% holý percentuálny znak

Ostatné% špecifikácie sú nedefinované. Ostatné znaky budú prechádzať nedotknutými. Podporované sú iba miestne nastavenia.

Značka -sekundy predstavuje niekoľko sekúnd od doby, kedy má byť použitá ako zdroj, z ktorého sa má formátovať. V opačnom prípade sa používa aktuálny čas.

Značka -gmt vynúti výstup časovej pečiatky na použitie časovej zóny GMT . Bez vlajky sa používa miestna časová zóna.

trap [[príkaz] signály]
spôsobí, že daný príkaz bude vykonaný pri budúcom prijatí ktoréhokoľvek z daných signálov. Príkaz sa vykoná v globálnom rozsahu. Ak príkaz chýba, vráti sa signál. Ak je príkaz reťazec SIG_IGN, signály sa ignorujú. Ak je príkazom reťazec SIG_DFL, signály sú výsledkom systémového nastavenia. Signály sú buď jediným signálom alebo zoznamom signálov. Signály môžu byť zadané číselne alebo symbolicky podľa signálu (3). Prefix "SIG" môže byť vynechaný.

Bez argumentov (alebo argumentu -number), pasca vráti číslo signálu aktuálne vykonávaného príkazu trap.

Príznak -kód používa návratový kód príkazu namiesto akéhokoľvek kódu Tcl, ktorý sa chystal vrátiť, keď sa pôvodne spustil príkaz.

Príznak -interp spôsobí, že príkaz sa vyhodnotí pomocou tlmočníka aktívneho v čase spustenia príkazu namiesto toho, keď bol deklarovaný lapač.

Príznak -name spôsobí, že príkaz trap vráti názov signálu aktuálne vykonávaného príkazu trap.

Príznak -max spôsobí, že príkaz trap vráti najväčšie číslo signálu, ktoré možno nastaviť.

Napríklad príkaz "trap {send_user" Ouch! "} SIGINT" vytlačí "Ouch!" pri každom stlačení tlačidla ^ C.

V predvolenom nastavení SIGINT (ktorý možno zvyčajne generovať stlačením tlačidla ^ C) a SIGTERM spôsobí ukončenie programu Expect. Je to spôsobené nasledujúcou pascou vytvorenou predvolene po spustení aplikácie Expect.

výstup z pasce {SIGINT SIGTERM}

Ak použijete príznak -D na spustenie ladiaceho programu, SIGINT je predefinovaný na spustenie interaktívneho ladiaceho programu. Je to spôsobené nasledujúcou pascou:

trap {exp_debug 1} SIGINT

Lapač ladiaci program je možné zmeniť nastavením premennej prostredia EXPECT_DEBUG_INIT na nový príkaz trap.

Môžete, samozrejme, obísť oba tieto len pridaním trap príkazy do vášho skriptu. Najmä ak máte vlastnú "zásuvku ukončenia SIGINT", toto prepíše lapač odlaďovač. To je užitočné, ak chcete zabrániť používateľom, aby sa dostali k debugérovi vôbec.

Ak chcete definovať svoju vlastnú trap na SIGINT, ale stále sa chystáte na ladiaci program, keď je spustený, použite:

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

Prípadne môžete do ladiaceho zariadenia zachytiť aj iný signál.

pasca vás nenechá prepísať akciu pre SIGALRM, pretože sa používa interne na očakávanie. Príkaz odpojiť nastaví SIGALRM na SIG_IGN (ignorovať). Môžete to opätovne povoliť tak dlho, ako ho vypnete počas nasledujúcich príkazov.

Pozri signál (3) pre viac informácií.

počkať [args]
oneskorenia až do ukončenia procese (alebo súčasného procesu, ak nie je pomenovaný).

čakať normálne vráti zoznam štyroch celých čísiel. Prvým celým číslom je pid procesu, ktorý bol čakal. Druhé celé číslo je zodpovedajúce ID tŕstia. Tretie celé číslo je -1, ak došlo k chybe operačného systému, alebo inak. Ak bolo tretie celé číslo 0, štvrté celé číslo je stav vrátený procesom, ktorý sa rozmnožil. Ak bolo tretie celé číslo -1, štvrté celé číslo je hodnota errno nastavená operačným systémom. Je tiež nastavená globálna premenná errorCode.

Ďalšie prvky sa môžu objaviť na konci návratovej hodnoty od čakania . Voliteľný piaty prvok identifikuje triedu informácií. V súčasnosti je jedinou možnou hodnotou pre tento prvok CHILDKILLED, pričom v nasledujúcich dvoch hodnotách je názov signálu typu C a krátky textový opis.

Príznak -i deklaruje proces čakania zodpovedajúci pomenovanému spawn_id (nie ID procesu ). Vo vnútri manipulátora SIGCHLD je možné čakať na akýkoľvek proces, ktorý sa rozmnožil, pomocou idúceho bodu id -1.

Príznak -nowait spôsobí, že čakanie sa okamžite vráti s uvedením úspešného čakania. Keď proces opustí (neskôr), automaticky zmizne bez potreby explicitného čakania.

Príkaz čakania môže byť tiež použitý čakať na rozkrokový proces pomocou argumentov "-i -1". Na rozdiel od jeho použitia pri spaľovaných procesoch môže byť tento príkaz vykonaný kedykoľvek. Neexistuje žiadna kontrola, ktorý proces sa využíva. Vrátenú hodnotu je však možné skontrolovať pre ID procesu .

KNIŽNICE

Očakáva sa, že automaticky vie o dvoch zabudovaných knižniciach pre Skúšky očakávania. Tieto sú definované adresármi uvedenými v premenných exp_library a exp_exec_library. Obe majú obsahovať užitočné súbory, ktoré môžu používať iné skripty.

exp_library obsahuje súbory nezávislé od architektúry. exp_exec_library obsahuje súbory závislé od architektúry. V závislosti od vášho systému môžu byť obe adresáre úplne prázdne. Existencia súboru $ exp_exec_library / cat-buffers opisuje, či máte štandardne nastavené vyrovnávacie pamäte / bin / cat.

Pretty-TLAČ

Definícia vgrind je k dispozícii pre pekne tlačené Skúste očakávať . Za predpokladu, že je definícia vgrind dodaná s distribúciou Expect správne nainštalovaná, môžete ju použiť ako:

vgrind -lexpectér

PRÍKLADY

Nie je veľa zrejmé, ako dať všetko dohromady, ako popisuje manuálová stránka. Odporúčam vám, aby ste si prečítali a vyskúšali príklady v príkladovom adresári distribúcie Expect . Niektoré z nich sú skutočné programy. Iní sú len ilustratívnymi niektorými technikami a samozrejme, pár je len rýchlymi hackami. Súbor INSTALL obsahuje rýchly prehľad týchto programov.

Tiež sú užitočné články očakávania (viď tiež). Zatiaľ čo niektoré články používajú syntax zodpovedajúci predchádzajúcim verziám aplikácie Expect, doprovodné zdôvodnenia sú stále platné a podrobnejšie sa nachádzajú ako táto stránka.

záludnosti

Rozšírenia môžu narušiť názvy príkazov Expect. Napríklad odoslanie je definované Tk na úplne iný účel. Z tohto dôvodu je väčšina príkazov Expect k dispozícii aj ako "exp_XXXX". Príkazy a premenné začínajúce na "exp", "inter", "spawn" a "timeout" nemajú alias. Ak potrebujete túto kompatibilitu medzi prostredím, použite názvy rozšírených príkazov.

Očakáva sa, že má skôr liberálny pohľad na rozsah. Obzvlášť premenné čítané príkazmi špecifickými pre program Expect budú hľadať najprv z lokálneho rozsahu a ak sa nenašli, v globálnom rozsahu. Napríklad to vylučuje potrebu umiestniť "globálny časový limit" do každého postupu, ktorý píšete, ktorý používa očakávať . Na druhej strane, premenné, ktoré sú napísané, sú vždy v lokálnom rozsahu (ak nebol vydaný "globálny" príkaz). Najčastejším problémom, ktorý spôsobuje, je to, keď sa spawn vykoná v postupe. Mimo procedúry už spawn_id už neexistuje, takže proces rozmnožovania už nie je dostupný iba z dôvodu rozsahu. Pridajte do tohto postupu "globálne spawn_id".

Ak nemôžete povoliť funkciu multispawningu (tj váš systém nepodporuje ani výber (BSD *. *), Ankety (SVR> 2), ani niečo ekvivalentné), očakáva sa, že dokáže ovládať len jeden proces naraz. V takom prípade sa nepokúšajte nastaviť spawn_id , ani by ste nemali vykonávať procesy cez exec počas spusteného procesu . Okrem toho nebudete môcť očakávať od viacerých procesov (vrátane užívateľa ako jedného) súčasne.

Parametre terminálu môžu mať veľký vplyv na skripty. Napríklad, ak je skript napísaný, aby hľadal echo, bude sa správať nesprávne, ak bude vypnuté echo. Z tohto dôvodu predvolene očakávame parametre sane sily. Bohužiaľ, to môže robiť veci nepríjemné pre iné programy. Napríklad shell emacs chce zmeniť "obvyklé" mapovania: nové riadky sa zmapujú na nové riadky namiesto vratných liniek typu carriage-return a echo je zakázané. To umožňuje používať emacs na úpravu vstupného riadku. Bohužiaľ, očakávame, že to nemôže hádať.

Môžete požiadať, aby program Expect neprepustil svoje predvolené nastavenie parametrov terminálu, ale musíte pri vytváraní skriptov pre takéto prostredia byť veľmi opatrní. V prípade emakov sa vyhýbajte záležiacim na veciach, ako sú ozveny a mapovanie na konci riadku.

Príkazy, ktoré prijali argumenty zaradené do jedného zoznamu ( očakávané varianty a interagovať ) používajú heuristiku, aby rozhodli, či je zoznam skutočne jeden argument alebo veľa. Heuristika môže zlyhať iba vtedy, keď zoznam skutočne predstavuje jediný argument, ktorý má viacero vložených znakov \ n s medzerami medzi nimi. To sa zdá byť dostatočne nepravdepodobné, ale argument "-nobrace" môže byť použitý na to, aby bol jediný argument vyriešený ako jediný argument. Mohlo by sa to používať s strojovo vygenerovaným kódom Expect. Podobne -brace núti jediný argument, ktorý sa má zaobchádzať ako viacero vzorov / akcií.

CHYBY

Bolo to skutočne lákavé nazvať program "sex" (buď pre "Smart Exec", alebo "Send-Expect"), ale prevládal dobrý rozum (alebo možno len puritánstvo).

Na niektorých systémoch, keď sa spaľuje škrupina, sa sťažuje, že nebude môcť pristupovať k tty, ale aj tak beží. To znamená, že váš systém má mechanizmus na získanie kontrolnej funkcie, o ktorej spoločnosť Expect nevie. Zistite, čo to je, a pošlite mi tieto informácie.

Ultrix 4.1 (minimálne najnovšie verzie v okolí) považuje časové limity nad 1000000 za ekvivalentné hodnote 0.

Digitálne UNIX 4.0A (a pravdepodobne aj iné verzie) odmieta prideliť ptys, ak definujete handler SIGCHLD. Viac informácií nájdete na stránke grantt.

IRIX 6.0 nerobí správne oprávnenia pty, takže ak sa očakáva pokus o pridelenie pty, ktorý predtým používal niekto iný, zlyhá. Inovujte na IRIX 6.1.

Telnet (overený iba pod SunOS 4.1.2) visí, ak nie je nastavený TERM. Toto je problém v cron, cgi a cgi skriptoch, ktoré nedefinujú TERM. Musíte to teda explicitne nastaviť - na aký typ je zvyčajne irelevantný. Musí to byť len niečo! Nasledujúce zrejme postačuje pre väčšinu prípadov.

nastaviť env (TERM) vt100

Tip (overené len podľa BSDI BSD / OS 3.1 i386) visí, ak SHELL a HOME nie sú nastavené. Toto je problém v rámci skriptov cron , cgi a cgi , ktoré nedefinujú tieto premenné prostredia. Musíte ich teda explicitne nastaviť - na aký typ je zvyčajne irelevantné. Musí to byť len niečo! Nasledujúce zrejme postačuje pre väčšinu prípadov.

nastaviť env (SHELL) / bin / sh nastaviť env (HOME) / usr / local / bin

Niektoré implementácie pty sú navrhnuté tak, že jadro vyhodnotí po 10 až 15 sekundách (skutočné číslo závislé na implementácii) akýkoľvek neprečítaný výstup po ukončení procesu deskriptora. Očakávame programy ako napr

spať dátum spánok 20 očakávať

zlyhá. Aby ste tomu zabránili, vyvolajte neinteraktívne programy s exec skôr ako trieť . Zatiaľ čo takéto situácie sú mysliteľné, v praxi som sa nikdy nestretol so situáciou, v ktorej by sa kvôli tomuto správaniu stratil konečný výstup skutočne interaktívneho programu.

Na druhej strane Cray UNICOS ptys vyhodí akýkoľvek neprečítaný výstup hneď po ukončení procesu deskriptora súboru. Ohlásil som to Crayovi a pracujú na oprave.

Niekedy sa vyžaduje oneskorenie medzi promptom a odpoveďou, napríklad keď rozhranie tty mení nastavenia UART alebo zodpovedajúce prenosové rýchlosti pri hľadaní bitov štart / stop. Zvyčajne je to všetko, čo je potrebné spať na sekundu alebo dve. Robustnejšou technikou je opakovanie, kým je hardvér pripravený prijímať vstupy. Nasledujúci príklad používa obe stratégie:

poslať "rýchlosť 9600 \ r"; spať 1 očakávať {timeout {odoslať "\ r"; exp_continue} $ prompt}

Trap-code nebude fungovať s akýmkoľvek príkazom, ktorý sedí v slučke udalosti Tcl, ako napríklad spánok. Problém je, že v slučke udalosti Tcl zruší návratové kódy z obslužných programov udalostí async. Riešením je nastaviť príznak v kóde trap. Potom skontrolujte vlajku ihneď po príkaze (tj spánku).

Príkaz expect_background ignoruje argumenty timetime a nemá žiadny koncept časových limitov vo všeobecnosti.

& # 34; EXPECT HINTS & # 34;

Existuje niekoľko vecí o očakávaní, ktoré môžu byť intuitívne. Táto časť sa pokúša vyriešiť niektoré z týchto vecí niekoľkými návrhmi.

Spoločným očakávaným problémom je, ako rozpoznať príkazy pre shell. Vzhľadom k tomu, že tieto sú prispôsobené rôznym spôsobom rôznymi ľuďmi a rôznymi shellmi, prenosné automatizovanie rloginu môže byť ťažké bez znalosti výzvy. Primeranou konvenciou je, aby používatelia ukladali regulárny výraz popisujúci ich prompt (najmä koniec) v premennej prostredia EXPECT_PROMPT. Môže sa použiť nasledujúci kód: Ak EXPECT_PROMPT neexistuje, kód má stále dobrú šancu správne fungovať.

nastaviť výzvu "(% | # | \\ $) $"; # predvolená výzva chytiť {nastaviť výzvu $ env (EXPECT_PROMPT)} očakávať -re $ prompt

Odporúčam vám, aby ste napísali očakávané vzory, ktoré zahŕňajú koniec toho, čo očakávate. Tým sa zabráni možnosti odpovedať na otázku predtým, ako sa ukáže celá vec. Okrem toho, aj keď možno budete môcť odpovedať na otázky predtým, ako ich úplne uvidíte, ak odpoviete skoro, vaša odpoveď sa môže objaviť v strede otázky. Inými slovami, výsledný dialóg bude správny, ale bude vyzerať mizerne.

Väčšina výziev obsahuje znak na medzery na konci. Napríklad výzva z ftp je 'f', 't', 'p', '>' a. Ak chcete spĺňať túto výzvu, musíte si vytvoriť účet pre každý z týchto znakov. Je bežnou chybou nezaradiť prázdne miesto. Prázdne vložte prázdne miesto.

Ak použijete vzorec formulára X *, bude * zodpovedať všetkému výstupu získanému od konca X až po poslednú prijatú vec. Znie to intuitívne, ale môže to byť trochu mätúce, pretože fráza "posledná vec, ktorú ste dostali", sa môže meniť v závislosti od rýchlosti počítača a spracovania vstupov a výstupov v jadre aj v ovládači zariadenia.

Najmä ľudia majú tendenciu vidieť, že programový výstup prichádza v obrovských kusoch (atómovo), keď v skutočnosti väčšina programov produkuje výstup jeden riadok naraz. Za predpokladu, že je to tak, * v tvare predchádzajúceho odseku sa môže zhodovať len so koncom aktuálneho riadku, aj keď sa zdá, že je viac, pretože v čase zápasu bol celý výstup, ktorý bol prijatý.

očakáva sa, že nemôže vedieť, že príde ďalší výkon, ak sa na ňom osobitne nezaoberá vzor.

Dokonca aj v závislosti od line-orientované vyrovnávacie pamäte je nerozumné. Nielen, že programy len zriedkavo robia sľuby o tom, aký typ vyrovnávacích pamätí robia, ale systémové trávenie môže narušiť výstupné linky tak, že línie sa rozpadnú na zdanlivo náhodných miestach. Ak teda pri písaní vzorov môžete vyjadriť posledných pár znakov výzvy, je to rozumné.

Ak čakáte na vzor v poslednom výstupe programu a program vysiela namiesto toho niečo iné, nebudete to môcť zistiť pomocou kľúčového slova timeout . Dôvodom je, že očakáva sa, že nebude časový limit - namiesto toho dostane eof indikáciu. Použite to namiesto toho. Ešte lepšie, použite oboje. Týmto spôsobom, ak sa táto trasa niekedy premiestni, nebudete musieť upravovať samotnú líniu.

Nové linky sa zvyčajne konvertujú na návrat vozíka, sekvencie posunu riadkov pri výstupe pomocou ovládača terminálu. Preto ak chcete vzor, ​​ktorý explicitne zodpovedá dvom riadkom, od sayf ("foo \ nbar"), použite vzor "foo \ r \ nbar".

Podobný preklad sa vyskytuje pri čítaní od používateľa cez očakávania_user . V tomto prípade, keď stlačíte návrat, bude preložený do nového riadku. Ak to očakávame, prejde to na program, ktorý nastaví jeho terminál do nespracovaného režimu (ako je telnet), bude to problém, pretože program očakáva skutočný výnos. (Niektoré programy skutočne odpúšťajú v tom, že budú automaticky prekladať nové riadky do návratov, ale väčšina z nich nie.) Bohužiaľ, neexistuje žiadny spôsob, ako zistiť, že program dal svoj terminál do nespracovaného režimu.

Namiesto manuálneho nahradenia nových riadkov s návratmi je riešením použiť príkaz "stty raw", ktorý zastaví preklad. Upozorňujeme však, že to znamená, že už nebudete mať varené funkcie na úpravu riadkov.

interaktívne implicitne nastaví váš terminál na nespracovaný režim, takže tento problém potom nevznikne.

Často je užitočné ukladať heslá (alebo iné súkromné ​​informácie) do Skúšok očakávania. Toto sa neodporúča, pretože všetko, čo je uložené v počítači, je náchylné na prístup ktokoľvek. Interaktívne výzva na zadanie hesla zo skriptu je teda inteligentnejšou myšlienkou, ako je doslova vložiť do hesla. Napriek tomu, niekedy je takéto zabudovanie jedinou možnosťou.

Bohužiaľ, súborový systém UNIX nemá priamy spôsob vytvárania skriptov, ktoré sú spustiteľné, ale nečitateľné. Systémy, ktoré podporujú skripty setgid shell, môžu nepriamo simulovať takto:

Vytvorte skript Expect (ktorý obsahuje tajné údaje) ako obvykle. Urobte jej povolenia na 750 (-rwxr-x ---) a vlastnia dôveryhodnú skupinu, tj skupinu, ktorá ju môže čítať. V prípade potreby vytvorte na tento účel novú skupinu. Ďalej vytvorte skript / bin / sh s oprávneniami 2751 (-rwxr-s - x), ktoré vlastní tá istá skupina ako predtým.

Výsledkom je skript, ktorý môže niekto vykonať (a čítať). Po vyvolaní spustí skript Expect .

& # 34; viď tiež & # 34;

Tcl (3), libexpect (3)
"Exploring Expect: Tcl-Based Toolkit pre automatizáciu interaktívnych programov" od Don Libes, str. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"očakávať: liečenie týchto nekontrolovateľných zásahov interaktivity" od Don Libes, Zborník z leto 1990 USENIX konferencie, Anaheim, Kalifornia, 11.-11. júna 1990.
.I "Použitie očakávať automatizáciu systémových úloh správy" od Don Libes, Proceedings of the 1990 USENIX Large Installation Systems Administration Conference, Colorado Springs, Colorado, 17. - 19. októbra 1990.
. I "Tcl: Embeddable Command Language" od Johna Ousterhout, Zborník z roku 1990 USENIX Conference, Washington, DC, január 22-26, 1990. "Očakávam: Skripty pre ovládanie interaktívnych programov" od Don Libes, , Zv. 4, číslo 2, časopisy University Press v Kalifornii, november 1991 .. I "Regresné testovanie a testovanie súladu s interaktívnymi programami" od Don Libes, Zborník konferencie USENIX v lete 1992, str. 135-144, San Antonio, TX, June 12-15, 1992. "Kibitz - Spájanie viacerých interaktívnych programov spolu" od Don Libes, Software - Prax & Skúsenosti, John Wiley & Sons, West Sussex, Anglicko, zv.

23, č. 5, máj 1993. I "Debugger for Tcl Applications", Don Libes, Proceedings of the Tcl / Tk Workshop 1993, Berkeley, CA, 10.-11.

AUTHOR

Don Libes, Národný inštitút pre štandardy a technológie

POĎAKOVANIE

Vďaka Johnu Ousterhoutovi za Tcl a Scott Paisley za inšpiráciu. Vďaka Rob Savoye pre autoconfiguračný kód spoločnosti Expect.

Súbor HISTORY dokumentuje veľkú časť vývoja očakávania . Je to zaujímavé čítanie a môže vám poskytnúť ďalší pohľad na tento softvér. Vďaka spomínaným ľuďom, ktorí mi poslali opravy chýb a poskytli inú pomoc.

Návrh a implementácia programu Expect bola čiastočne zaplatená americkou vládou, a preto je vo verejnej sfére. Avšak autor a NIST by chceli získať kredit, ak sa použije tento program a dokumentácia alebo časť z nich.