Očekávat je program, který mluví s dalšími interaktivními programy podle scénáře. Podle scénáře očekává, že očekává od programu a jaká by měla být správná odpověď. Tlumočený jazyk poskytuje větvení a struktury řízení na vysoké úrovni, které řídí dialog. Navíc uživatel může převzít kontrolu a interagovat přímo, pokud je to požadováno, poté vrátit kontrolu do skriptu.
Expectk je směs Expect a Tk. Chová se stejně jako přání a očekávání Tk. Očekávat lze také použít přímo v C nebo C ++ bez Tcl.
Jméno "očekávat" pochází z myšlenky vysílání / očekávání sekvencí popularizovaných programy uucp, kermit a dalších modemů. Nicméně na rozdíl od uucp, Expect je generalizovaný tak, aby mohl být spuštěn jako uživatelský příkaz s jakýmkoli programem a úkolem. Očekávejte, že můžete hovořit s několika programy najednou.
Co očekáváte
Například zde jsou některé věci, které může očekávat příkaz:
- Přinutí počítač, aby vás zavolal zpět, abyste se mohli přihlásit, aniž byste museli platit za hovor.
- Spusťte hru a pokud se optimální konfigurace nezobrazí, znovu ji znovu a znovu spusťte), dokud to neudělá, a poté vám předá kontrolu.
- Spusťte fsck a v odpověď na vaše dotazy odpovězte "ano" nebo "ne", nebo vám na základě předem stanovených kritérií poskytněte kontrolu.
- Připojte se k jiné síti a automaticky načtěte svou poštu tak, aby se zobrazovala, jako kdyby byla původně odeslána do místního systému.
- Přenášejte proměnné prostředí, aktuální adresář nebo jakýkoli druh informací přes rlogin, telnet, tip, su nebo chgrp
Existuje celá řada důvodů, proč shell nemůže tyto úkoly provádět. Všechny jsou možné s programem Expect.
Obecně platí, že program Expect je užitečný pro spuštění jakéhokoli programu, který vyžaduje interakci mezi programem a uživatelem. Vše, co je nezbytné, je, že interakce může být charakterizována programově. Očekávat, že může uživatelům poskytnout zpětnou kontrolu bez zastavení programu, který je řízen. Podobně může uživatel kdykoli vrátit kontrolu do skriptu.
Používání
Očekávejte, že čte cmdfile pro seznam příkazů, které mají být provedeny. Očekávat, že lze implicitně vyvolat na systémech podporujících #! zápis označením skriptu jako spustitelného a vytvoření prvního řádku ve skriptu:
#! / usr / local / bin / očekávejte -f
Samozřejmě, že cesta musí přesně popsat, kde očekává život. / usr / local / bin je jen příkladem.
Příznak -c předvádí příkaz, který má být proveden předtím, než se ve skriptu nachází. Příkaz by měl být uveden, aby se zabránilo tomu, že by byl shell rozdělen. Tuto možnost lze použít několikrát. Více příkazů může být provedeno s jediným -c oddělením středníkem. Příkazy se provádějí v pořadí, v jakém se zobrazují. Při použití aplikace Expectk je tato možnost zadána jako příkaz.
Příznak -d umožňuje určitý diagnostický výstup, který především hlásí vnitřní činnost příkazů, jako je očekávání a interakce. Tento příznak má stejný efekt jako "exp_internal 1" na začátku skriptu Expect plus je vytištěna verze aplikace Expect.
Příznak -D umožňuje interaktivní ladicí program. Měla by být použita celočíselná hodnota. Debugger převezme kontrolu před příští procedurou Tcl, pokud je hodnota nenulová nebo pokud je stisknuto tlačítko ^ nebo je zasažen bod zlomu nebo se ve skriptu objeví jiný příslušný příkaz debugger. Při použití aplikace Expectk je tato možnost určena jako -Ladit.
Příznak -f předkládá soubor, ze kterého mají číst příkazy. Samotná vlajka je volitelná, protože je užitečná pouze při použití #! zápis, takže na příkazovém řádku mohou být dodány další argumenty. Při použití aplikace Expectk je tato možnost určena jako soubor.
Ve výchozím nastavení je příkazový soubor přečten do paměti a spuštěn jako celek. Občas je žádoucí číst soubory v jednom řádku najednou. Chcete-li vynutit manipulaci s libovolnými soubory, použijte příznak -b. Při použití aplikace Expectk je tato možnost zadána jako -buffer.
Je-li řetězec "-" dodán jako název souboru, namísto něj se přečte standardní vstup. Použijte "./-" pro čtení ze souboru skutečně pojmenovaného "-".
Znak příznaku -i očekává interaktivní výzvu k příkazům namísto jejich čtení ze souboru. Výzva se ukončí příkazem exit nebo EOF. Příznak -i se předpokládá, pokud není použit příkazový soubor ani -c. Pokud používáte přípravek Expectk, je tato volba určena jako -interaktivní.
- lze použít k vymezení konce možností. To je užitečné, pokud chcete předložit skript, který se podobá volbě, do vašeho skriptu, aniž by byl interpretován společností Expect. To lze užitečně umístit do #! line, aby se zabránilo jakémukoli příznaku, který by společnost Expect vyžadovala. Například následující ponecháte původní argumenty včetně názvu skriptu v proměnné argv .
#! / usr / místní / bin / očekávat -
Všimněte si, že obvyklé getopt (3) a execve (2) konvence musí být dodrženy při přidávání argumentů k #! řádek.
Soubor $ exp_library / expect.rc se automaticky získává, pokud je k dispozici, pokud není použit příznak -N. (Při použití aplikace Expectk je tato volba zadána jako -NORC.) Bezprostředně po tomto se soubor ~ / .expect.rc získá automaticky, pokud není použit příznak -n. Je-li definována proměnná prostředí DOTDIR, zpracovává se jako adresář a odtud se čte .expect.rc. Při použití aplikace Expectk je tato možnost zadána jako -norc.Toto získávání dochází až po provedení všech příznaků -c.
-v způsobí možnost Očekávat, že vytiskne číslo verze a ukončí. Odpovídající příznak v aplikaci Expectk, který používá dlouhé názvy flag, je -version.
Volitelné args jsou sestaveny do seznamu a uloženy v proměnné argv a. argc je inicializován na délku argv.
Argv0 je definován jako název skriptu nebo binární, pokud není použit žádný skript. Například následující vytiskne název skriptu a první tři argumenty:
send_user "$ argv0 lang $ argv 0 2 n"
Příkazy
Očekávejte, že používá nástroj Command Language. Tcl poskytuje řídící tok (pokud se prolomí), vyhodnocení výrazu a několik dalších funkcí, jako je rekurze a definice procedury. Příkazy, které se zde používají, ale nejsou definovány (set, if, exec) jsou příkazy Tcl. Očekávejte, že budou podporovány další příkazy. Pokud není uvedeno jinak, příkazy vrátí prázdný řetězec.
Příkazy jsou uvedeny abecedně, aby mohly být rychle umístěny. Nicméně noví uživatelé mohou být v tomto pořadí snadnější začít tím, že přečte popisy tresky, vysílají, očekávají a interagují.
zavřít -slave -onexec 0 | 1 -i spawn_id
zavře připojení k aktuálnímu procesu. Většina interaktivních programů bude detekovat EOF na svém stdin a výstupu; tím pádem zavřít obvykle postačí zabít i proces. Příznak -i deklaruje uzavření procesu odpovídajícího jménu spawn_id.
Jak očekávají, tak interagují, zjistí, jakmile se stávající proces ukončí a implicitně skončí, ale pokud proces zabijete, řekněme "exec kill $ pid", musíte explicitně zavolat zavřít.
Příznak -onexec určuje, zda je ID spodku uzavřeno v jakémkoliv novém spuštěném procesu nebo zda je proces překrýván. Chcete-li ponechat id otevřené, použijte hodnotu 0. Nulová celočíselná hodnota vynucuje tresku uzavřenou v jakýchkoli nových procesech.
Příznak slávy zavře podřízené zařízení, které je přiděleno identifikátoru. Když je spojení zavřeno, podřízený je automaticky zavřen, pokud je stále otevřený.
Nezáleží na tom, zda je spojení implicitně nebo explicitně zavřeno, měli byste zavolat počkat, než zrušíte odpovídající jádro procesu. Příkaz zavření neumožňuje čekat, protože neexistuje žádná záruka, že ukončení procesního připojení způsobí jeho ukončení.
ladění -now 0 | 1
řídí ladicí program Tcl, který vám umožní procházet výkazy a nastavit hraniční body.
Bez argumentů je vrácená hodnota 1 vrácena, pokud ladicí program nefunguje, jinak se vrátí 0.
Při argumentu 1 se spustí ladicí program. Pomocí argumentu 0 je ladicí program zastaven. Pokud argumentu -now předchází argumentu -now, ladicí program se spustí okamžitě. V opačném případě je debugger spuštěn s dalším příkazem Tcl.
Příkaz ladění nezmění žádné chyby. Porovnejte to s počátečním očekáváním s příznakem -D.
Příkaz odpojení odpojí zdířku od terminálu. Pokračuje v běhu na pozadí. Proces je dán vlastní skupinou procesů. Standardní I / O je přesměrován na / dev / null.
Následující fragment používá odpojení pro pokračování spuštěním skriptu na pozadí.
pokud {{fork! = 0} ukončete odpojení. . .
Následující skript načte heslo a potom spustí program každou hodinu, která vyžaduje heslo při každém spuštění. Skript dodává heslo tak, že jej musíte pouze jednou napsat.
{} {} {} {} {if {} fork {!} {0} {send_user "heslo? " expect_user -re " 1, řetězec) r ". . . exit}
Výhodou použití odpojení přes funkci asynchronního procesu (&) je to, že aplikace Expect dokáže před odpojením uložit parametry terminálu a později je použít na nové pty. S &, Expect nemá možnost číst parametry terminálu, protože terminál je již odpojen v době, kdy očekává kontrolu.
exit -opty stav
Příčiny očekávejte opuštění nebo jinak se připravte na to.
The -onexit příznak způsobí použití dalšího argumentu jako obslužného příkazu ukončení. Bez argumentu je vrácen aktuální popisovač výstupu.
The -žádný východ příznak příznaků Očekávat připravit se na opuštění, ale zastavit se tím, že se skutečně vrátí do operačního systému. Je spuštěn uživatelsky definovaný výstupní obslužný program, stejně jako vlastní interní obslužné programy společnosti Expect. Nebyly provedeny další příkazy očekávání. To je užitečné, pokud používáte Expect s dalšími rozšířeními Tcl. Aktuální interpret (a hlavní okno v prostředí Tk) zůstanou tak, aby ostatní Tcl rozšíření mohla vyčistit. Pokud je Expect výstup je volána znovu (může se však stát, že se to může stát).
Po ukončení jsou všechna připojení k plodným procesům uzavřena. Uzavření bude detekováno jako EOF způsobenými procesy. výstup nepřijímá žádná další opatření, která překračují normální proceduru _exit (2). Tak mohou spuštěné procesy, které nekontrolují EOF, mohou pokračovat. (Různé podmínky jsou důležité pro určení například toho, jaké signály budou odeslané procesy odesílány, ale ty jsou závislé na systému, obvykle jsou dokumentovány pod výstupem (3).) Spuštěné procesy, které pokračují v běhu, budou děděny init.
postavení (nebo 0, pokud není zadán) je vráceno jako stav ukončení Očekávat . výstup je implicitně spuštěn, pokud je dosaženo konce skriptu.
exp_continue -continue_timer
Příkaz exp_continue umožňuje očekávat aby pokračovala spíše spíše než návrat, jak by to normálně bylo. Ve výchozím stavu exp_continue resetuje časovač časového limitu. The -continue_timer flag zabraňuje restartování časovače. (Vidět očekávat Pro více informací.)
exp_internal -f soubor hodnota
způsobuje další příkazy k odeslání diagnostických informací uvnitř Očekávat ke stderr if hodnota je nenulová. Tento výstup je vypnutý, pokud hodnota je 0. Diagnostické informace zahrnují každý přijatý znak a každý pokus o přizpůsobení aktuálního výstupu proti vzorům.
Pokud je volitelný soubor je dodán, je do tohoto souboru zapsán veškerý normální a ladicí výstup (bez ohledu na hodnotu hodnota ). Jakýkoli předchozí diagnostický výstupní soubor je uzavřen.
The -info flag způsobí exp_internal vrátit popis nejnovějších neindikovaných argumentů.
exp_open argumenty -i spawn_id
vrátí identifikátor souboru Tcl, který odpovídá původnímu identifikátoru. Identifikátor souboru pak může být použit, jako by byl otevřen Tcl otevřeno příkaz. (Identifikátor tresky se již nesmí používat Počkejte by neměl být spuštěn.
The -leaveopen vlajka opustí přístupové číslo id přístupné prostřednictvím příkazů Expect. A Počkejte musí být provedeno na identifikátoru plodu.
exp_pid -i spawn_id
vrací ID procesu odpovídající aktuálně spuštěnému procesu. Pokud -i použije se příznak, vrácená hodnota pid odpovídá hodnotě daného identifikátoru.
exp_send
je alias pro poslat .
exp_send_error
je alias pro send_error .
exp_send_log
je alias pro send_log .
exp_send_tty
je alias pro send_tty .
exp_send_user
je alias pro send_user .
exp_version -exit verze
je užitečné pro zajištění, že skript je kompatibilní s aktuální verzí aplikace Expect.
Bez argumentů je aktuální verze souboru Očekávat je vrácena. Tato verze pak může být zakódována ve vašem skriptu. Pokud skutečně víte, že nepoužíváte funkce nedávných verzí, můžete určit starší verzi.
Verze se skládají ze tří čísel oddělených tečkami. První je hlavní číslo. Skripty psané pro verze Očekávat s jiným velkým počtem bude téměř jistě nefunguje. exp_version vrátí chybu, pokud hlavní čísla neodpovídají.
Druhým je menší číslo. Skripty napsané pro verzi s větším drobným číslem než aktuální verze mohou záviset na některé nové funkci a nemusí být spuštěny. exp_version vrátí chybu, pokud hlavní čísla odpovídají, ale menší číslo skriptu je větší než běžné číslo Očekávat .
Třetí je číslo, které se nezúčastní porovnání verzí. Nicméně, to je zvýšen, když Očekávat distribuce softwaru se mění jakýmkoli způsobem, například dodatečnou dokumentací nebo optimalizací. Je obnovena na 0 při každé nové drobné verzi.
S -výstup vlajka, Očekávat vytiskne chybu a skončí, pokud je verze zastaralá.
očekáváme -opts pat1 body1 … -opts patn bodyn
čeká, dokud se některý z vzorků neodpovídá výstupu procesu spuštěného, uplynul určitý časový interval nebo je vidět konec souboru. Pokud je poslední tělo prázdné, může být vynecháno.
Vzory z posledních expect_before příkazy jsou implicitně používány před jinými vzory. Vzory z posledních očekávejte příkazy jsou implicitně používány po všech ostatních vzorech.
Pokud argumenty na celé očekávat příkaz vyžadují více než jeden řádek, všechny argumenty mohou být "zarovnány" do jednoho tak, aby se předešlo ukončení každého řádku zpětným lomítkem. V tomto jednom případě dochází k obvyklým substitucím Tcl navzdory závorám.
Pokud je vzorem klíčové slovo eof , příslušné tělo je provedeno na konci souboru. Pokud je vzorem klíčové slovo Časový limit , odpovídající těleso je provedeno po uplynutí časového limitu. Pokud se nepoužije žádné klíčové slovo, použije se po uplynutí časového limitu implicitní nulová akce. Výchozí časový limit je 10 sekund, ale může být nastaven, například na 30, příkazem "set timeout 30". Nekonečný časový limit může být označen hodnotou -1. Pokud je vzorem klíčové slovo výchozí , příslušné tělo se provede buď po uplynutí časového limitu nebo od konce souboru.
Pokud se vzor shoduje, provede se odpovídající tělo. očekávat vrátí výsledek těla (nebo prázdný řetězec, pokud není shodný vzorec). V případě, že se více vzorků shoduje, první se používá k výběru těla.
Pokaždé, když dojde k novému výstupu, porovná se s každým vzorem v pořadí, ve kterém jsou uvedeny. Můžete tedy vyzkoušet, zda nedošlo k shodě, tím, že provedete poslední vzorek, který zaručí, že se zobrazí, například výzva. V situacích, kdy neexistuje výzva, musíte použít Časový limit (stejně jako byste byli, kdybyste se vzájemně ručně).
Vzory jsou určeny třemi způsoby. Ve výchozím nastavení jsou vzory zadány jako u Tcl string match příkaz. (Takové vzory jsou také podobné regulárním výrazům C-shellu, obvykle označovaným jako "globální" vzory). The -gl příznak může být použit k ochraně vzory, které by jinak mohly odpovídat očekávat vlajky z toho dělat. Jakýkoli vzor začínající znakem "-" by měl být chráněn tímto způsobem. (Všechny řetězce začínající "-" jsou vyhrazeny pro budoucí možnosti.)
Například následující fragment hledá úspěšné přihlášení. (Všimněte si, že přerušit je předpokládán postup definovaný jinde ve scénáři.)
očekáváte {busy {puts busy n; exp_continue} se nezdařilo zrušit "neplatné heslo" zrušit časový limit přerušit připojení}
Citace jsou potřebné na čtvrtém vzoru, protože obsahuje prostor, který by jinak oddělil vzorek od akce.Vzory se stejnou akcí (například třetí a čtvrté) vyžadují opětovné uvedení akce do provozu. To lze předejít použitím vzorků ve stylu regexp (viz níže). Další informace o vytváření vzorů ve stylu globů naleznete v příručce Tcl.
Vzory typu Regexp se řídí syntaxem definovaným Tcl regexp (zkratka pro "regulární výraz"). regexp vzory jsou představeny s vlajkou -re . Předchozí příklad lze přepsat pomocí regexp jako:
očekáváte {busy {puts busy n; exp_continue} -re "selhal | neplatné heslo" zrušit časový limit přerušit připojení}
Oba typy vzorků jsou "neopracované". To znamená, že vzory nemusí odpovídat celému řetězci, ale mohou začít a ukončit zápas kdekoli v řetězci (pokud se vše shoduje). Použijte klávesu ^, aby odpovídal začátku řetězce a $ se shoduje s koncem. Všimněte si, že pokud nečekáte na konec řetězce, vaše odpovědi mohou snadno skončit ve středu řetězce, protože jsou odráženy od procesu plodu. Zatímco stále produkuje správné výsledky, výstup může vypadat nepřirozeně. Proto je použití $ doporučeno, pokud můžete přesně popsat znaky na konci řetězce.
Všimněte si, že v mnoha editorech, ^ a $ odpovídají počátku a konce řádků. Avšak vzhledem k tomu, že očekáváte, že není line orientován, tyto znaky odpovídají počátku a konce dat (na rozdíl od řádků) aktuálně v očekávané vyrovnávací paměti. (Viz též poznámka níže na téma "Systém poruchy trávení.")
The -ex příznak způsobí, že vzorek bude označen jako "přesný" řetězec. Neexistuje žádná interpretace *, ^, atd. (I když je třeba stále dodržovat obvyklé konvence Tcl). Přesné vzory jsou vždy neopracovány.
The -noc flag způsobí, že velká písmena výstupu se porovnají, jako by byly malými znaky. Vzor není ovlivněn.
Při čtení výstupu může více než 2000 bajtů přinutí předchozí bajty "zapomenout". To se může změnit s funkcí match_max . (Všimněte si, že nadměrně velké hodnoty mohou zpomalit vzorek.) Pokud patrollist je full_buffer , příslušné tělo se provede, pokud match_max bajty byly přijaty a žádné jiné vzory neodpovídají. Zda nebo ne full_buffer použije se klíčové slovo, zapomenuté znaky jsou zapsány na expect_out (buffer).
Li patrollist je klíčové slovo nula , a nulls jsou povoleny (prostřednictvím remove_nulls příkaz), provede se odpovídající tělo, pokud je splněna jedna ASCII 0. Nelze porovnávat 0 bajtů pomocí globálních nebo regexpových vzorků.
Po přizpůsobení vzoru (nebo eof nebo full_buffer) se v proměnné uloží jakýkoli odpovídající a dříve nesrovnatelný výstup expect_out (vyrovnávací paměť) . V proměnných jsou uloženy až 9 regexpových podřetězových shody expect_out (1, řetězec) přes expect_out (9, řetězec) . Pokud -indiky příznak se používá před vzorem, počáteční a koncové indexy (ve formě vhodné pro lrange ) z 10 řetězců jsou uloženy v proměnných expect_out (X, start) a expect_out (X, konec) kde X je číslice, odpovídá pozici podřetězec v vyrovnávací paměti. 0 označuje řetězce, které odpovídají celému vzoru a jsou generovány pro globální vzory, stejně jako vzory regexp. Například pokud proces produkoval výstup "abcdefgh n", výsledek:
očekávejte "cd"
je jako kdyby byly provedeny následující příkazy:
nastavit expect_out (0, string) cd nastavit expect_out (buffer) abcd
a "efgh n" zůstane ve vyrovnávací paměti výstupu. Pokud proces produkoval výstup "abbbcabkkkka n", výsledek:
očekávejte -indices -re "b (b *). * (k +)"
je jako kdyby byly provedeny následující příkazy:
(1, start) 1 set expect_out (0, start) 1 set expect_out (0, konec) 10 set expect_out (0, konec) 10 set expect_out (0, string) (2, start) 10 nastavit expect_out (2, konec) 10 nastavit expect_out (2, string) k nastavit expect_out (buffer) abbbcabkkkk
a "a n" je ponecháno ve vyrovnávací paměti výstupu. Vzor "*" (a -re ". *") Vyprázdní výstupní vyrovnávací paměť bez čtení dalšího výstupu z procesu.
Obvykle je shodný výstup vyřazen z interních vyrovnávacích pamětí Expect. Toho lze zabránit předponou vzorku s -převod vlajka. Tato vlajka je obzvlášť užitečná při experimentování (a může být zkrácena pro "-not" při experimentování).
Identifikátor tresky spojený se shodným výstupem (nebo eof nebo full_buffer) je uložen v expect_out (spawn_id) .
The -Časový limit příznak příznaku příčinu příkazu použít následující hodnotu jako časový limit namísto použití hodnoty časového limitu proměnné.
Ve výchozím nastavení jsou vzory porovnány s výstupem z aktuálního procesu, nicméně -i flag deklaruje, že výstup ze seznamu s názvem spawn_id je porovnán s následujícími vzory (až do dalšího -i ). Soubor spawn_id by měl být buď oddělený znakem whitespace z adresy spawn_ids, nebo proměnnou odkazující na takový seznam parametrů spawn_ids.
Například následující příklad čeká na "připojen" z aktuálního procesu nebo "zaneprázdněný", "neúspěšný" nebo "neplatné heslo" ze souboru spawn_id pojmenovaný $ proc2.
očekávejte {-i $ proc2 obsazeno {puts busy n; exp_continue} -re "selhal | neplatné heslo" zrušit časový limit přerušit připojení}
Hodnota globální proměnné any_spawn_id mohou být použity pro porovnání vzorků s libovolnými položkami spawn_ids, které jsou pojmenovány se všemi ostatními -i příznaky v proudu očekávat příkaz. Spawn_id od A -i příznak bez přidruženého vzoru (tj. bezprostředně následuje další) -i ) je k dispozici jiným vzorům ve stejném očekávat příkaz sdružený s any_spawn_id.
The -i příznak může také pojmenovat globální proměnnou, v kterémžto případě se proměnná čte pro seznam identifikátorů splavů. Proměnná je přečtená vždy, když se změní. Toto poskytuje způsob změny zdroje I / O během provádění příkazu. Zajišťovací trávy se tímto způsobem nazývají "nepřímými" identitami.
Akce jako například přestávka a pokračovat způsobují řídící struktury (tj. pro , proc ) chovat se obvyklým způsobem. Příkaz exp_continue umožňuje očekávat aby pokračovala spíše spíše než návrat, jak by to normálně bylo.
To je užitečné pro vyloučení explicitních smyček nebo opakovaných očekávaných prohlášení. Následující příklad je součástí fragmentu pro automatizaci rlogin. The exp_continue vyhýbá se psaní sekundy očekávat příkaz (znovu vyhledat výzvu), pokud rlogin vyzve k zadání hesla.
očekávejte {password: {stty -echo send_user "heslo pro $ user) na $ host:" expect_user -re "(. *) n" send_user " n" send "$ expect_out echo exp_continue} nesprávné {send_user "neplatné heslo nebo účet n" ukončení} časový limit {send_user "připojení k $ host timed out n" exit} eof {send_user re $ prompt}
Například následující fragment může pomoci uživatelské příručce interakci, která je již zcela automatizovaná. V takovém případě se terminál uvede do neupraveného režimu. Pokud uživatel stiskne tlačítko "+", zvýší se proměnná. Pokud je stisknuto tlačítko "p", do procesu se odesílá několik výkazů, zřejmě nějakým způsobem, a "i" dovolí uživateli interakci s procesem, čímž se účinně odcizí kontrola ze skriptu. V každém případě exp_continue umožňuje proud očekávat pokračovat ve shodě vzorů po provedení aktuální akce.
stty raw -exo expect_after {-i $ user_spawn_id "p" {odeslat " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interact; exp_continue} "ukončit" ukončení}
Ve výchozím stavu, exp_continue resetuje časovač časového limitu. Časovač není restartován, pokud exp_continue je volána s -continue_timer vlajka.
expect_after expect_args
pracuje identicky s expect_before s výjimkou toho, zda jsou vzory obojího očekávat a očekávejte může odpovídat, očekávat vzor je použit. Viz expect_before pro více informací.
expect_background expect_args
má stejné argumenty jakoočekávat , ale okamžitě se vrátí. Vzory jsou testovány vždy, když přichází nový vstup. VzorČasový limit avýchozí nemají smyslexpect_background a jsou tiše vyřazeny. V opačném případěexpect_background příkaz používáexpect_before aočekávejte vzory jakoočekávat dělá.
Kdyžexpect_background akce jsou vyhodnocovány, zpracování pozadí pro stejnou identifikaci idů je blokováno. Zpracování pozadí je odblokováno po dokončení akce. Zatímco zpracování pozadí je zablokováno, je možné provést (popředí)očekávat na stejném ID trávníku.
Není možné spustitočekávat zatímcoexpect_background je odblokován.expect_background pro konkrétní ID tresky se vymaže vyhlášení nového očekávaného stavu se stejným idem. Vyhlášeníexpect_background bez vzoru odstraní daný ID plodu ze schopnosti přizpůsobit vzory v pozadí.
expect_before expect_args
má stejné argumenty jakoočekávat , ale okamžitě se vrátí. Vzorové-párové akce od posledníhoexpect_before se stejným identifikátorem plodu jsou implicitně přidány do následujících položekočekávat příkazy. Pokud se vzorec shoduje, bude se s ním zacházet, jako by to bylo specifikováno vočekávat příkaz sám, a přidružené tělo je spuštěn v kontextuočekávat příkaz. Pokud vzory obojíhoexpect_before aočekávat může odpovídat,expect_before vzor je použit.
Není-li zadán žádný vzorec, není identifikátor spodního prádla zkontrolován pro žádné vzory.
Pokud není nahrazeno a-i vlajka,expect_before vzory se shodují s identitou plodu definovanou v době, kdyexpect_before příkaz byl spuštěn (ne když je jeho vzorec odpovídá).
Příčinou příznaku -infoexpect_before vrátit aktuální specifikace toho, jaké vzory budou odpovídat. Ve výchozím nastavení se hlásí aktuální id. Pro informaci o identifikačním indexu je možné zadat volitelnou specifikaci id. Například
expect_before -info -i $ proc
Můžeme zadat nejvýše jednu specifikaci ID. Vlajka -indirect potlačí přímé pochody, které pocházejí pouze z nepřímých specifikací.
Namísto specifikace parametru spawn, příznak "-all" způsobí "-info" hlášení o všech identifikátorech.
Výstup příznaku -info může být znovu použit jako argument očekávaný předtím.
expect_tty expect_args
je jakoočekávat ale čte znaky z / dev / tty (tj. úhozy od uživatele). Ve výchozím nastavení se čtení provádí v režimu vaření. Řádky tedy musí skončit návratemočekávat abychom je viděli. To může být změněno prostřednictvímstty (vizstty příkaz níže).
expect_user expect_args
je jakoočekávat ale čte znaky ze stdin (tj. úhozy od uživatele). Ve výchozím nastavení se čtení provádí v režimu vaření. Řádky tedy musí skončit návratemočekávat abychom je viděli.To může být změněno prostřednictvímstty (vizstty příkaz níže).
Vidlička
vytváří nový proces. Nový proces je přesná kopie prouduOčekávat proces. Na úspěch,Vidlička vrátí 0 do nového (podřízeného) procesu a vrátí ID procesu podřízeného procesu do nadřazeného procesu. Při selhání (vždy kvůli nedostatku zdrojů, např. Výměny místa, paměti),Vidlička vrátí -1 do nadřazeného procesu a není vytvořen žádný podřízený proces.
Vypínané procesy vystupují přesvýstup příkaz, stejně jako původní proces. Protokoly se zapisují na vidlicové procesy. Pokud nezakážete ladění nebo přihlašování do většiny procesů, výsledek může být matoucí.
Některé pty implementace mohou být zmateny několika čtenáři a spisovateli, a to i na okamžik. Je tedy nejbezpečnějšíVidlička před procesy rozmnožování.
interagovat string1 body1 … stringn bodyn
dává uživateli kontrolu nad aktuálním procesem tak, že jsou do aktuálního procesu odesílány klávesové zkratky a jsou vráceny stdout a stderr aktuálního procesu.
Páry řetězce a těla mohou být zadány jako argumenty, v tomto případě je tělo spuštěno, když je zadán odpovídající řetězec. (Ve výchozím nastavení řetězec není odeslán do aktuálního procesu.)tlumočník příkaz se předpokládá, pokud chybí poslední těleso.
Pokud argumenty na celéinteragovat příkaz vyžadují více než jeden řádek, všechny argumenty mohou být "zarovnány" do jednoho tak, aby se předešlo ukončení každého řádku zpětným lomítkem. V tomto jednom případě dochází k obvyklým substitucím Tcl navzdory závorám.
Například následující příkaz spustí interakci s následujícími definovanými dvojicemi string-body: Když je stisknuto ^ Z,Očekávat je pozastavena. (The-reset příznak obnoví režimy terminálu.) Když je stisknuto tlačítko ^, uživatel uvidí, že jste zadali ovládací prvek A a proces je odeslán ^ A. Když je stisknuto $, uživatel uvidí datum. Když je stisknuto tlačítko ^ C,Očekávat výstupy. Pokud je zadáno "foo", uživatel vidí "bar". Když je stisknuto ~~,Očekávat tlumočník běží interaktivně.
nastavit CTRLZ 032 interakci {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "jste zadali ovládací prvek n"; odeslat " 001"} $ {send_user "Datum je formát hodin hodiny sekund."} 003 exit foo {send_user "bar"} ~~}
V párech řetězec-tělo jsou řetězce shodovány v pořadí, ve kterém jsou uvedeny jako argumenty. Řetězce, které se částečně shodují, nejsou odeslány do současného procesu v očekávání zbylých příchodů. Pokud jsou zadány znaky tak, aby již nebylo možné shodu, bude pouze část řetězce odeslána do procesu, který nemůže začít s jinou shodou. Proto řetězce, které jsou podřetězce částečných shody, se mohou později shodovat, pokud se původní řetězce, které se pokouší o shodu, nakonec nezdaří.
Ve výchozím nastavení je porovnávání řetězců přesné, aniž by existovaly žádné zástupné karty. (Na rozdíl od tohoočekávat příkaz ve výchozím nastavení používá vzory v globálním stylu.)-ex příznak může být použit k ochraně vzory, které by jinak mohly odpovídatinteragovat vlajky z toho dělat. Jakýkoli vzor začínající znakem "-" by měl být chráněn tímto způsobem. (Všechny řetězce začínající "-" jsou vyhrazeny pro budoucí možnosti.)
The-re příznak vynutí řetězec být interpretován jako regexp-styl stylu. V tomto případě jsou v proměnné uloženy odpovídající podřetězce interact_out podobně jako na cestěočekávat ukládá svůj výstup do proměnnéexpect_out . The-indiky příznak je podobně podporován.
Vzoreof zavádí akci, která je spuštěna na konci souboru. Oddělenýeof vzor může také následovat-výstup v tomto případě se porovnává, pokud je při psaní výstupu detekován eof. Výchozí nastaveníeof akce je "návrat", takžeinteragovat jednoduše se vrátí na nějaký EOF.
VzorČasový limit zavádí časový limit (v sekundách) a akci, která je provedena poté, co nebyly pro daný čas přečteny žádné znaky. TheČasový limit vzorec platí pro naposledy zadaný proces. Neexistuje výchozí časový limit. Speciální proměnná "timeout" (časová prodleva) (používá seočekávat příkaz) nemá vliv na tento časový limit.
Například následující prohlášení by mohlo být použito pro autologování uživatelů, kteří na hodiny nic nezadali, ale stále dostávají časté systémové zprávy:
interact -input $ user_spawn_id timeout 3600 návrat-výstup $ spawn_id
Pokud je vzorem klíčové slovonula , a nulls jsou povoleny (prostřednictvímremove_nulls příkaz), provede se odpovídající tělo, pokud je splněna jedna ASCII 0. Nelze porovnávat 0 bajtů pomocí globálních nebo regexpových vzorků.
Připravte vzorek s vlajkou-píšu způsobí proměnnou interact_out (spawn_id) nastavit na hodnotu spawn_id, která odpovídá vzoru (nebo eof).
Akce jako napříkladpřestávka apokračovat způsobují řídící struktury (tj.pro , proc ) chovat se obvyklým způsobem. nicméněvrátit se příčiny interakce se vrátí k jeho volajícímu, zatímcointer_return příčininteragovat způsobit návrat jeho volajícího. Například pokud volá "proc foo"interagovat který poté akci provedlinter_return , proc foo by se vrátil. (To znamená, že pokudinteragovat volánítlumočník interaktivní psanívrátit se způsobí interakci pokračovat, zatímcointer_return způsobí, že se bude v interakci vrátit k volajícímu.)
Běheminteragovat , režim raw se používá tak, aby všechny znaky mohly být předány aktuálnímu procesu.Pokud aktuální proces nezachytí signály řízení úlohy, zastaví se, pokud bude vyslán signál zastavení (ve výchozím nastavení je ^ Z). Chcete-li jej znovu spustit, odešlete signál pokračování (například "kill-CONT"). Pokud opravdu chcete poslat SIGSTOP do takového procesu (podle ^ Z), zvážit nejprve csh a potom spuštění programu. Na druhou stranu, pokud chcete odeslat SIGSTOPOčekávat sám, první volání tlumočníka (možná pomocí escape charakteru), a pak stiskněte klávesu ^ Z.
Páry řetězec-tělo mohou být použity jako zkratka, aby se zabránilo nutnosti vstoupit do tlumočníka a příkazy provést interaktivně. Předchozí režim terminálu se používá, když se provádí tělo páru struny a těla.
Pro rychlost se ve výchozím nastavení provádějí akce ve výchozím režimu. The-reset příznak resetuje terminál do režimu, který byl předtíminteragovat byl proveden (vždy v režimu vaření). Všimněte si, že znaky zadané při přepínání režimu mohou být ztraceny (nešťastná funkce ovladače terminálu u některých systémů). Jediný důvod k použití-reset je vaše akce závislá na spuštění v režimu vaření.
The-echo vlajka odešle znaky, které odpovídají následujícímu vzoru zpět procesu, který je vygeneroval při čtení každého znaku. To může být užitečné, když uživatel potřebuje vidět zpětnou vazbu z částečně psaných vzorů.
Je-li vzorek opakován, ale nakonec se nezhoduje, jsou znaky odeslány do procesu plodu. Pokud je proces rozštěpený, pak se ozve je, uživatel uvidí znaky dvakrát.-echo je pravděpodobně vhodný pouze v situacích, kdy je pravděpodobné, že uživatel nebude dokončit vzor. Například následující výňatek pochází z rftp, rekurzivního ftp skriptu, kde je uživatel vyzván k zadání ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~; Jsou to tak daleko od běžných příkazů ftp, že uživatel je nepravděpodobné, že píše ~ následované cokoliv jiného, s výjimkou chybně, v takovém případě budou pravděpodobně výsledek pravděpodobně ignorovat.
interagovat {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}
The-nobuffer vlajka odešle znaky, které odpovídají následujícímu vzoru, na výstupní proces, jakmile jsou čteny znaky.
To je užitečné, pokud si přejete nechat program opakovat vzor. Například následující mohou být použity ke sledování, kde osoba volá (modem ve stylu Hayes). Pokaždé, když je vidět "atd", skript zaznamená zbytek řádku.
proc lognumber {} {interact -nobuffer -re "(. *) r" návrat vloží $ log "formát hodin hodiny sekund: volal $ interact_out (1, string)" interact -nobuffer "atd"
Běheminteragovat , předchozí použitílog_user je ignorována. Zejména,interagovat bude muset jeho výstup být zaznamenáván (odeslán na standardní výstup), protože se předpokládá, že uživatel nechce slepě komunikovat.
The-Ó příznak způsobí, že se na výstup aktuálního procesu použijí následující páry klíč-tělo. To může být užitečné například při jednání s hostiteli, kteří odesílají nežádoucí znaky během relace telnet.
Ve výchozím stavu,interagovat očekává, že uživatel bude psát stdin a čtení stdout zOčekávat zpracovat sám. The-u (pro uživatele)interagovat podívejte se na uživatele jako proces nazvaný jeho argumentem (který musí být splněný id).
To umožňuje, aby dva nesouvisející procesy byly spojeny bez použití explicitní smyčky. Chcete-li pomoci při ladění, očekávejte, že diagnostika vždy přejde do stderr (nebo stdout pro určité protokolování a ladění informace). Ze stejného důvodutlumočník příkaz bude interactively číst ze stdin.
Například následující fragment vytvoří přihlašovací proces. Potom vytočí uživatele (není zobrazen) a nakonec je spojuje dohromady. Samozřejmě, jakýkoliv proces může být nahrazen přihlášením. Například shell by umožnil uživateli pracovat bez zadání účtu a hesla.
spawn přihlašovací login set $ spawn_id spawn tip modem # vytáčení zpět k uživateli # připojit uživatele k přihlášení interact -u $ login
Chcete-li odeslat výstup do více procesů, zadejte seznam všech identifikátorů plodů, které předcházejí a-výstup vlajka. Vstup pro skupinu výstupních identifikátorů se může stanovit podle seznamu idů, který předcházel a-vstup vlajka. (Oba-vstup a-výstup může obsahovat seznamy ve stejné formě jako-i příznak vočekávat příkaz, s výjimkou, že any_spawn_id nemá smyslinteragovat .) Na tento vstup se vztahují všechny následující příznaky a řetězce (nebo vzory), dokud se neobjeví jiný příznak -input. Jestli ne-vstup objeví se,-výstup znamená "-input $ user_spawn_id -output". (Podobně se vzory, které nemají-vstup .) Pokud jeden-vstup je zadán, přepíše $ user_spawn_id. Za sekundu-vstup je zadáno, přepíše $ spawn_id. Další-vstup mohou být zadány příznaky.
Dva implikované vstupní procesy mají výchozí hodnotu, že jejich výstupy jsou specifikovány jako $ spawn_id a $ user_spawn_id (v opačném smyslu). Pokud-vstup příznak se zobrazí bez-výstup vlajka, znaky z tohoto procesu jsou vyřazeny.
The-i flag představuje náhradu za aktuální spawn_id, když nikdo jiný-vstup nebo-výstup používají se vlajky. Příznak A -i znamená příznak -o.
Je možné měnit procesy, s nimiž se pracuje, pomocí nepřímých identifikátorů. (Nepřímé identifikace tresoru jsou popsány v části o očekávaném příkazu.) Nepřímé identifikační čísla mohou být zadány pomocí příznaků -i, -u, -input nebo -output.
tlumočník args
způsobí, že uživatel bude interaktivně vyzvánOčekávat a příkazy Tcl. Výsledek každého příkazu je vytištěn.
Akce jako napříkladpřestávka apokračovat způsobují řídící struktury (tj.pro , proc ) chovat se obvyklým způsobem. nicméněvrátit se způsobí, že se tlumočník vrátí k volajícímu, zatímcointer_return příčintlumočník způsobit návrat jeho volajícího. Například pokud volá "proc foo"tlumočník který poté akci provedlinter_return , proc foo by se vrátil. Příkaz způsobí jakýkoli jiný příkaztlumočník pokračovat v vyvolání nových příkazů.
Ve výchozím nastavení obsahuje výzva dvě celá čísla. První celé číslo popisuje hloubku vyhodnocovacího zásobníku (tj. Kolikrát bylo voláno Tcl_Eval). Druhé celé číslo je identifikátor historie Tcl. Příkaz lze nastavit definováním postupu nazvaného "prompt1", jehož návratová hodnota se stane dalším příkazem. Pokud má výkaz otevřené uvozovky, podložky, závorky nebo závorky, zobrazí se sekundární výzva (ve výchozím nastavení "+>") po novém řádku. Druhá výzva může být nastavena definováním postupu nazvaného "prompt2".
Běhemtlumočník , je použit režim vaření, i když jeho volající používal surový režim.
Je-li stdin uzavřen,tlumočník vrátí se, pokud-eof je použit příznak, v tomto případě je vyvolán následující argument.
log_file args -a soubor
Pokud je k dispozici název souboru,log soubor bude zaznamenávat přepis relace (začínající v daném okamžiku) v souboru.log soubor zastaví nahrávání, pokud není zadán žádný argument. Předchozí soubor protokolu je uzavřen.
Namísto názvu souboru může být pomocí identifikátoru souboru Tcl poskytnut identifikátor souboru-otevřeno nebo-leaveopen vlajky. Toto je podobnépotěr příkaz. (Vidětpotěr pro více informací.)
The-A příznaky, které mají být zaznamenány, které byly potlačenylog_user příkaz.
Ve výchozím nastavenílog soubor příkaz připojí na staré soubory spíše než na jejich zkrácení, a to kvůli tomu, aby bylo možné v jednom zasedání vypnout a vypínat vícekrát. Chcete-li soubory zkrátit, použijte-noappend vlajka.
The-info příznak způsobí, že log_file vrátí popis nejnovějších neindikovaných argumentů.
log_user -info | 0 | 1
Ve výchozím nastavení je protokol odesílání / očekávání protokolován na stdout (a protokol při otevření). Přihlášení do stdout je zakázáno příkazem "log_user 0" a znovu zapnuto "log_user 1". Protokolování do protokolu je nezměněno.
The-info flag způsobí, že log_user vrátí popis nejnovějších neindikovaných argumentů.
match_max -d -i spawn_id velikost
definuje velikost vyrovnávací paměti (v bytech) použitou interněočekávat . Ne velikost argument je vrácena aktuální velikost.
S-d flag je nastavena výchozí velikost. (Počáteční výchozí hodnota je 2000.) Pomocí příkazu-i flag, velikost je nastavena pro jménu jména, jinak je nastavena pro aktuální proces.
překrýt - # spawn_id - # spawn_id … program args
provádí "program args "namísto prouduOčekávat program, který končí. Poměrný pomlčkový argument vynucuje pomlčku před názvem příkazu, jako by to byla přihlašovací shell. Všechny znaky spawn_ids jsou uzavřeny kromě těch, které jsou pojmenovány jako argumenty. Ty jsou mapovány na pojmenované identifikátory souborů.
Spawn_ids jsou mapovány na identifikátory souborů nového dědícího programu. Například následující řádek běží šachy a umožňuje, aby byl řízen současným procesem - řekněme, šachovým mistrem.
překrývání -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id šachy
To je mnohem efektivnější než "interagovat -u", nicméně, to obětuje schopnost dělat programované interakce odOčekávat proces již není pod kontrolou.
Pamatujte, že žádný řídicí terminál není k dispozici. Pokud tedy odpojíte nebo přepočítete standardní vstup, programy, které provádějí kontrolu úlohy (skořepiny, přihlašovací údaje atd.), Nebudou fungovat správně.
parita -d -i spawn_id hodnota
definuje, zda má být parita zachována nebo odstraněna z výstupu způsobených procesů. Li hodnota je nulová, parita je odstraněna, jinak není odstraněna. Ne hodnota argument je vrácena aktuální hodnota.
S-d , je nastavena výchozí hodnota parity. (Výchozí výchozí hodnota je 1, tj. Parita není odstraněna)-i flag, hodnota parity je nastavena pro jménu jména, jinak je nastavena pro aktuální proces.
remove_nulls -d -i spawn_id hodnota
definuje, zda jsou nulls zachovány nebo odebrány z výstupu procesů, které se tvořily, před porovnáním vzoru nebo uložením v proměnné expect_out nebo interact_out . Li hodnota je 1, odstraní se null. Li hodnota je 0, nulls nejsou odstraněny. Ne hodnota argument je vrácena aktuální hodnota.
S-d , je nastavena výchozí hodnota. (Počáteční výchozí hodnota je 1, tj. Jsou odstraněny nulls.) Pomocí příkazu-i flag, hodnota je nastavena pro jménu jména, jestliže je nastavena pro aktuální proces.
Zda jsou odstraněny nully,Očekávat bude zaznamenávat nulové bajty do protokolu a stdout.
odeslat řetězec -flags
Odesílá řetězec k aktuálnímu procesu. Například příkaz
poslat "hello world r"
odešle znaky, které jsou aktuálně zpracovány. (Tcl zahrnuje příkaz typu printf (nazvanýformát ), které mohou libovolně vytvářet složité řetězce.)
Znaky jsou okamžitě odesílány, přestože programy s řádkovým vstupem nebudou číst znaky, dokud nebude odeslána zpětná charakteristika. Zpětný znak je označen jako " r".
The-- flag nutí další argument být interpretován jako řetězec spíše než příznak.Každému řetězci může předcházet znak "-", ať už vypadá jako příznak nebo ne. To poskytuje spolehlivý mechanismus pro zadání proměnných řetězců, aniž by byly propojeny ty, které náhodně vypadají jako vlajky. (Všechny řetězce začínající "-" jsou vyhrazeny pro budoucí možnosti.)
The-i flag prohlašuje, že řetězec je odeslán na název spawn_id. Pokud je spawn_id user_spawn_id , a terminál je v neupraveném režimu, nové řádky v řetězci jsou přeloženy do sekvence návratové linky, takže se objeví tak, jako kdyby byl terminál v režimu vaření. The-drsný flag zakáže tento překlad.
The-nula příznak odesílá null znaky (0 bajtů). Ve výchozím nastavení je odeslán jeden null. Celé číslo může následovat-nula udává,




