Příkaz Linux / Unix očekávejte

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:

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í programu Expectk je tato možnost zadána jako - Debug.

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 #! čára.

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; tak se blíží obvykle postačí zabít proces také. 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.

Příznak -onexit 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.

Příznak -noexit způsobí, že se očekává, že se připraví na ukončení, ale přestane se skutečně vrátit 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. Je-li znovu zavolán Expectův výstup (ovšem může dojít), obsluha se neprovede znovu.

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. ukončení neprobíhá žádná akce, která by překračovala normální postup _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.

status (nebo 0, není-li zadán) je vrácen jako stav ukončení aplikace Expect . 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 , že bude pokračovat v spouštění spíše než vracet se tak, jak to obvykle bude. Ve výchozím nastavení exp_continue obnoví časovač časového limitu. Příznak -continue_timer zabraňuje restartování časovače. (Viz další informace.)

exp_internal [-f soubor] hodnota
způsobuje další příkazy k odeslání diagnostické informace interní, aby očekávalo, že hodnota stderr bude nenulová. Tento výstup je deaktivován, je-li hodnota 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 dodán volitelný soubor , do tohoto souboru je zapsán veškerý normální a ladicí výstup (bez ohledu na hodnotu hodnoty ). Jakýkoli předchozí diagnostický výstupní soubor je uzavřen.

Příznak -info způsobí, že exp_internal vrátí 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 kdyby byl otevřen příkazem Tcl open . (ID tresky by se už nemělo používat.) Čeknutí by nemělo být provedeno.

Příznak -leaveopen opouští ID otevřeného přístupu pro přístup prostřednictvím příkazů Expect. Čekací doba musí být spuštěna na identifikačním indexu.

exp_pid [-i spawn_id]
vrací ID procesu odpovídající aktuálně spuštěnému procesu. Pokud je použit příznak -i , vrácená hodnota pid odpovídá hodnotě daného identifikátoru.

exp_send
je alias pro odeslání .

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 vrácena aktuální verze aplikace Expect . 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 aplikace Expect s jiným významným číslem téměř jistě nebudou fungovat. 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 v případě, že se shodují hlavní čísla, ale menší číslo skriptu je větší než číslo běžícího očekávání .

Třetí je číslo, které se nezúčastní porovnání verzí. Je však narůstající, jakmile se distribuce softwaru Expect nějakým způsobem změní, například pomocí dodatečné dokumentace nebo optimalizace. Je obnovena na 0 při každé nové drobné verzi.

Pomocí příznaku -exit očekává služba Expect chybu a ukončí se, 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ího příkazu expect_before jsou implicitně používány před jinými vzory. Vzory z posledního příkazu expect_after se implicitně používají po dalších vzorcích.

Pokud argumenty celého příkazu očekávají 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.

Je-li vzorem klíčové slovo eof , příslušné tělo se provede po ukončení souboru. Pokud vzorec je časový limit pro klíčové slovo, odpovídající těleso se provede 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 výchozí klíčové slovo, odpovídající těleso 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ává návrat výsledku těla (nebo prázdný řetězec, pokud není shodný vzorek). 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 žádná výzva, musíte použít časový limit (stejně jako byste měli, kdybyste ručně komunikovali).

Vzory jsou určeny třemi způsoby. Ve výchozím nastavení jsou vzory specifikovány jako příkaz Tcl s řetězcem . (Takové vzory jsou také podobné regulárním výrazům C-shellu, obvykle označovaným jako "globální" vzory). Vlajka -gl může být použita k ochraně vzorků, které by jinak mohly být v souladu s očekávanými vlajkami. 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í. (Uvědomte si, že přerušení je považováno za proceduru definovanou jinde ve skriptu.)

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 příkazem Tcl's regexp (zkratka pro "regulární výraz"). regexp vzory jsou zavedeny s příznakem -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í.")

Příznak -ex 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.

Příznak -nocase způsobí, že velká písmena výstupu budou porovnána jako malá písmena. Vzor není ovlivněn.

Při čtení výstupu může více než 2000 bajtů přinutí předchozí bajty "zapomenout". To může být změněno pomocí funkce match_max . (Všimněte si, že nadměrně velké hodnoty mohou zpomalit vzorek.) Pokud je patrollist full_buffer , provede se odpovídající tělo, pokud byly přijaty bajty match_max a žádné jiné vzory neodpovídají. Bez ohledu na to, zda je použito klíčové slovo full_buffer , zapomenuté znaky jsou zapsány na hodnotu expect_out (vyrovnávací paměť).

Pokud je seznam klíčů null a jsou povoleny nulls (pomocí příkazu remove_nulls ), příslušné tělo se provede, 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é expect_out (vyrovnávací paměť) uloží jakýkoli odpovídající a dříve nesrovnatelný výstup. Do proměnných expect_out (1, string) se do očekávaných proměnných regexp uchovávají až 9 regexpových podřetězců přes expect_out (9, string) . Pokud se před vzorkem používá příznak -indices , jsou počáteční a koncové indexy (ve formě vhodné pro lord ) 10 řetězců uloženy v proměnných expect_out (X, start) a expect_out (X, end) 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. To může být zabráněno předponou vzorku s příznakem -notransfer . 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 očekávaném (spawn_id) .

Příznak " -timeout" způsobí příkazu očekávat, že použije následující hodnotu jako časový limit namísto použití hodnoty proměnné časového limitu.

Ve výchozím nastavení jsou vzory porovnávány s výstupem z aktuálního procesu, avšak parametr -i 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 může být použita pro porovnání vzorků s jakýmkoli spawn_ids, které jsou pojmenovány se všemi ostatními příznaky -i v aktuálním očekávaném příkazu. Spolecnost_podkazu z příznaku -i bez přidruženého vzoru (tj. Následovaného okamžitým jiným -i ) je zpřístupněna všem jiným vzorkům ve stejném očekávaném příkazu přidruženém k any_spawn_id.

Příznak -i 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 je přerušení a pokračování, způsobují, že struktury řízení (tj. Pro , proc ) se chovají obvyklým způsobem. Příkaz exp_continue umožňuje očekávat , že bude pokračovat v spouštění spíše než vracet se tak, jak to obvykle bude.

To je užitečné pro vyloučení explicitních smyček nebo opakovaných očekávaných příkazů. Následující příklad je součástí fragmentu pro automatizaci rlogin. Exp_continue se vyhne tomu, aby musel napsat další očekávaný příkaz (znovu hledat 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 aktuálnímu očekávání 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 nastavení exp_continue obnoví časovač časového limitu. Časovač není restartován, pokud je volána exp_continue s příznakem -continue_timer .

expect_after [expect_args]
pracuje shodně s předpokládaným očekáváním, s výjimkou toho, že pokud vzory oba očekávají a očekávají, že může odpovídat, použije se očekávaný vzor. Další informace naleznete v příkazu expect_before .

expect_background [expect_args]
má stejné argumenty, jaké očekává , ale okamžitě se vrátí. Vzory jsou testovány vždy, když přichází nový vstup. Časový limit a výchozí vzorec nemají smysl očekávat_zad a jsou tiše vyřazeni. V opačném případě příkaz expect_background používá vzorce expect_before a expect_after stejně jako očekává .

Při vyhodnocování akcí očekávaných vzhledu se zablokuje zpracování pozadí pro stejný identifikátor. Zpracování pozadí je odblokováno po dokončení akce. Zatímco zpracovávání pozadí je zablokováno, je možné provést (popředí) očekávat na stejném ID trávníku.

Nelze provést očekávání, když je odblokováno pole wait_background . expect_background pro konkrétní identifikátor plodnosti je smazán tím, že deklaruje nový expect_background se stejným identifikátorem. Deklarace očekávaného vzhledu s žádným vzorem nezruší danou ID trávníku ze schopnosti přizpůsobit vzory v pozadí.

expect_before [expect_args]
má stejné argumenty, jaké očekává , ale okamžitě se vrátí. Vzorové páry od nejnovějšího očekávaného očekávání se stejným identifikátorem plodnosti jsou implicitně přidány do všech následujících očekávaných příkazů. Pokud se vzorec shoduje, považuje se za to, jako kdyby byl zadán v očekávaném příkazu samotném a přidružené tělo se provede v kontextu příkazu očekávat . Pokud vzory oba očekávají a očekávají, že se mohou shodovat, použije se očekávaný vzorec.

Není-li zadán žádný vzorec, není identifikátor spodního prádla zkontrolován pro žádné vzory.

Pokud není potlačeno příznakem -i , očekávejte předtím , než vzory odpovídají identifikačnímu indexu definovaného v okamžiku, kdy byl proveden příkaz expect_before (nikoliv když je jeho vzorec vyrovnán).

Příznak -info způsobí očekávání před návratem aktuálních specifikací, které 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 jako očekávat, ale čte znaky z / dev / tty (tj. stisknutí klávesy od uživatele). Ve výchozím nastavení se čtení provádí v režimu vaření. Řádky tedy musí skončit návratem, aby mohli očekávat, že je uvidí. To může být změněno prostřednictvím stty (viz příkaz stty níže).

expect_user [expect_args]
je jako čekat, ale čte znaky ze stdin (tj. stisknutí klávesy od uživatele). Ve výchozím nastavení se čtení provádí v režimu vaření. Řádky tedy musí skončit návratem, aby mohli očekávat, že je uvidí. To může být změněno prostřednictvím stty (viz příkaz stty níže).

Vidlička
vytváří nový proces . Nový proces je přesná kopie současného procesu Expect . Na úspěchu vidlice 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ř. Swap prostoru, paměti), vidlice vrátí -1 do nadřazeného procesu a není vytvořen žádný podřízený proces .

Vypínané procesy opouštějí příkaz příkazu exit , 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. Takže je nejbezpečnější, aby se vidličky 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 .) Příkaz interpretu se předpokládá, pokud chybí poslední tělo.

Pokud argumenty pro celý příkaz interact vyžadují více než jeden řádek, všechny argumenty mohou být "zarovnány" do jednoho, aby se zabránilo 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 řetězec: Když je stisknuto tlačítko ^, je očekáváno, že je pozastaveno. (Příznak -reset 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ávejte ukončení. Pokud je zadáno "foo", uživatel vidí "bar". Když je stisknuto ~~, interpretátor Expect 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 . (Naopak, příkaz expect očekává ve výchozím nastavení vzory v globálním stylu.) Příznak -ex může být použit k ochraně vzorků, které by jinak mohly odpovídat interaktivním příznakům. 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.)

Příznak -re vynutí, že řetězec bude interpretován jako vzor typu regexp. V tomto případě jsou odpovídající podřetězce uloženy v proměnné interact_out podobně jako způsob, jakým se očekává ukládání výstupu v proměnné expect_out . Příznak -indices je podobně podporován.

Vzor eof představuje akci, která je spuštěna na konci souboru. Samostatný eof vzorec může také sledovat příznak -output, v kterémžto případě se odpovídá, pokud je eof detekován během zápisu výstupu. Výchozí akce eof je "návrat", takže interakce se jednoduše vrátí na jakýkoli EOF.

Časový limit vzorku zavádí časový limit (v sekundách) a akci, která se provádí po přečtení žádných znaků po určitou dobu. Vzorec časového limitu platí pro naposledy zadaný proces . Neexistuje výchozí časový limit. Speciální proměnná "timeout" (použitá příkazem očekávání ) nemá žádný 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

Je-li vzorek klíčové slovo null a jsou povoleny nulls (pomocí příkazu remove_nulls ), odpovídající těleso se provede, pokud je splněna jedna ASCII 0. Nelze porovnávat 0 bajtů pomocí globálních nebo regexpových vzorků.

Předcházející vzorek s příznakem -writer způsobí, že proměnná interact_out (spawn_id) bude nastavena na hodnotu spawn_id, která odpovídá vzoru (nebo eof).

Akce, jako je přerušení a pokračování, způsobují, že struktury řízení (tj. Pro , proc ) se chovají obvyklým způsobem. Nicméně návrat způsobuje interakce vrátit se k jeho volajícímu, zatímco inter_return způsobuje interagovat způsobit návrat v jeho volající. Například, pokud "proc foo" nazývá interakce, která pak provedla akci inter_return , proc foo by se vrátil. (To znamená, že pokud interaktivně komunikuje s tlumočníkem interaktívne, zadání vrací způsobí, že interakce pokračuje, zatímco inter_return způsobí, že se interakce vrátí k volajícímu.)

Během interakce se používá surový režim, takže všechny znaky mohou 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 poslat SIGSTOP, aby se mohl očekávat sám, zavolejte nejprve tlumočníka (možná pomocí znaku escape) a 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. Příznak -reset obnovuje terminál do režimu, který měl předtím, než byl spuštěn (vždy režim 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í resetu je, pokud vaše akce závisí na spuštění v režimu vaření.

Příznak -echo 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}}

Příznak -nobuffer odešle znaky, které odpovídají následujícímu vzoru, na výstupní proces při čtení znaků.

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"

Při interakci se předchozí použití log_useru ignoruje. Konkrétně interakce vynutit jeho záznam, který má být zaznamenán (odeslán na standardní výstup), protože se předpokládá, že uživatel nechce slepě komunikovat.

Příznak -o 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 nastavení interakce očekává, že uživatel bude psát stdin a bude číst stdout samotného procesu Expect . Příznak -u (pro uživatele) umožňuje interakci hledat 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ůvodu bude příkaz tlumočníka 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 poslat výstup do více procesů, seznam všech seznamů idů, které předcházejí příznakem -output . Vstup pro skupinu výstupních identifikačních bodů může být určen seznamem idů, který předchází příznak vstupu . (Jak -input a -output mohou obsahovat seznamy ve stejné podobě jako příznak -i v očekávaném příkazu, kromě toho, že any_spawn_id nemá smysluplné interakce .) Všechny následující příznaky a řetězce (nebo vzory) platí pro tento vstup až do další - zobrazí se příznak vstupu. Pokud se neobjeví žádný vstup, -výstup znamená "-input $ user_spawn_id -output". (Podobně se vzory, které nemají -input .) Pokud je zadán jeden -input , přepíše $ user_spawn_id. Je-li zadán druhý vstup, přepíše $ spawn_id. Mohou být zadány další 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 se zobrazí příznak -input s příznakem bez výstupu , znaky z tohoto procesu se vyřadí.

Příznak -i zavádí náhradu za aktuální spawn_id, pokud nejsou použity žádné další vstupní nebo výstupní příznaky. 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án k příkazům Expect a Tcl. Výsledek každého příkazu je vytištěn.

Akce, jako je přerušení a pokračování, způsobují, že struktury řízení (tj. Pro , proc ) se chovají obvyklým způsobem. Avšak návrat způsobí, že se tlumočník vrátí k jeho volajícímu, zatímco inter_return způsobí, že tlumočník způsobí návrat svého volajícího. Pokud například "proc foo" nazývá interpret, který pak provedl akci inter_return , vrátí se proc foo . Jakýkoli jiný příkaz způsobí, že interpret bude pokračovat ve 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ěhem tlumočníka se používá režim vaření, i když jeho volající používal surový režim.

Je-li stdin uzavřen, vrátí se tlumočník , pokud není použit příznak -eof , v takovém případě je vyvolán následující argument.

log_file [args] [[-a] soubor]
Je-li zadán název souboru, log_file bude v souboru zaznamenávat přepis relace (začíná v daném okamžiku). log_file 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 identifikátor souboru Tcl poskytován pomocí příznaků -open nebo -leaveopen . Toto je podobné příkazu spouštění . (Více informací naleznete v článku Spalovat .)

Příznaky -a příznaků, které mají být zaznamenány, byly potlačeny příkazem log_user .

Ve výchozím nastavení příkaz log_file připojuje ke starým souborům spíše než k jejich zkrácení, protože umožňuje pohodlné vypínání a opakování odhlášení v jedné relaci. Chcete-li zkrátit soubory, použijte příznak -noappend .

Příznak -info 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.

Příznak -info 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 bajtech) používaná interně podle očekávání . Bez argumentu velikosti se vrátí aktuální velikost.

Pomocí parametru -d je nastavena výchozí velikost. (Počáteční výchozí hodnota je 2000.) Příznakem -i je nastavena velikost jména jména, jinak je nastavena pro aktuální proces .

překrýt [- # spawn_id] [- # spawn_id] [...] program [args]
spustí program " args" namísto aktuálního programu Expect , který ukončí. 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ž interakce -u, nicméně obětuje schopnost provést naprogramovanou interakci, protože proces Expect už 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ů. Pokud je hodnota nulová, parita se stáhne, jinak není odstraněna. Bez argumentu hodnot se vrátí aktuální hodnota.

S příznakem -d je nastavena výchozí hodnota parity. (Počáteční výchozí hodnota je 1, tj. Parita není odstraněna.) S příznakem -i je hodnota parity nastavena pro jménem jména jména, jinak je nastavena pro aktuální proces .

remove_nulls [-d] [-i spawn_id] [hodnota]
definuje, zda jsou nulls ponechány nebo odstraněny z výstupu procesů, které se tvořily, před porovnáním vzorků nebo uložením v proměnné expect_out nebo interact_out . Je-li hodnota 1, odstraní se null. Je-li hodnota 0, nulls nejsou odstraněny. Bez argumentu hodnot se vrátí aktuální hodnota.

Pomocí parametru -d je nastavena výchozí hodnota. (Počáteční výchozí hodnota je 1, tj. Jsou odstraněny nully.) S příznakem -i je hodnota nastavena pro jménem identifikovaného jména, jinak je nastavena pro aktuální proces .

Zda jsou odstraněny nulls, očekává se, že zaznamená nulové bajty do protokolu a stdout.

odeslat řetězec [-flags]
Odesílá řetězec do aktuálního procesu . Například příkaz

poslat "hello world \ r"

posílá znaky, helloworld do aktuálního procesu . (Tcl zahrnuje příkaz typu printf (tzv. Formát ), který může libovolně vytvářet komplexní ř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".

Příznak - příznaky nutí další argument interpretovat jako řetězec spíše než jako 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.)

Příznak -i prohlašuje, že řetězec bude odeslán na název spawn_id. Pokud je spawn_id user_spawn_id a terminál je v nespracovaném režimu, nové řádky v řetězci jsou přeloženy do sekvence return-newline tak, aby vypadaly, jako kdyby byl terminál v režimu vaření. Příznak -raw zakazuje tento překlad.

Příznak -null odesílá nulové znaky (0 bajtů). Ve výchozím nastavení je odeslán jeden null. Celé číslo může následovat - null, které udává, kolik nullů se má odeslat.

Příznak -break vygeneruje podmínku zlomu. To dává smysl pouze tehdy, jestliže ID se označuje jako tty zařízení, které je otevřeno prostřednictvím "spawn-open". Pokud jste vytvořili proces, jako je tip, měli byste použít konvenci tipů pro vytvoření přestávky.

Příznaky s- vlajkových sil se posílají "pomalu", a tak se vyvaruje běžné situace, kdy počítač vytypuje vstupní vyrovnávací paměť, která byla navržena pro člověka, který nikdy neprochází stejnou vyrovnávací pamětí . Tento výstup je řízen hodnotou proměnné "send_slow", která obsahuje seznam dvou prvků. Prvním prvkem je celé číslo, které popisuje počet bajtů, které mají být odeslány atomově. Druhým prvkem je skutečné číslo, které popisuje počet sekund, po kterých musí být atomové odesílání odděleny. Například "set send_slow {10 .001}" by přinutil "send -s" odeslat řetězce s 1 milisekundou mezi každých 10 odeslaných znaků.

Příznaky -h vlajky se vysílají (poněkud) jako lidské psaní. Mezi znaky se objevují zpoždění podobná lidem. (Tento algoritmus je založen na Weibullově distribuci s modifikacemi pro tuto konkrétní aplikaci.) Tento výstup je řízen hodnotou proměnné "send_human", která obsahuje seznam pěti prvků. Prvním dvěma prvky jsou průměrné mezery mezi jednotlivými znaky v sekundách. První je použito ve výchozím nastavení. Druhá se používá při koncovkách slov, aby se simulovaly jemné pauzy, které se občas vyskytují při takových přechodech. Třetí parametr je měřítkem proměnlivosti, kde .1 je poměrně variabilní, 1 je poměrně variabilní a 10 je poměrně nepřeměnitelná. Extrémy jsou 0 až nekonečno. Poslední dva parametry jsou minimální a maximální mezní čas. Minimální a maximální jsou použity naposledy a "klip" poslední čas. Konečný průměr může být zcela odlišný od daného průměru, pokud minimální a maximální klip dostatečně hodnotí.

Například následující příkaz emuluje rychlou a konzistentní písařku:

set send_human {.1 .3 1 .05 2} poslat -h "Mám hlad, jdeme na oběd."

zatímco následující může být vhodnější po kocovině:

nastavit send_human {.4 .4 .2 .5 100} odeslat -h "Goodd party bláznivá noc!"

Všimněte si, že chyby nejsou simulovány, ačkoli můžete nastavit situace pro opravu chyb sami vložením chyb a oprav v argumentu odesílání.

Vlajky pro odesílání null znaků, pro odeslání přestávek, pro vynucení pomalého výstupu a pro výstup v lidském stylu se vzájemně vylučují. Použije se pouze ta, která byla zadána jako poslední. Navíc nemůže být zadán žádný argument řetězce s příznaky pro odesílání nulových znaků nebo zlomů.

Je dobré předcházet prvnímu odeslání do procesu očekávaným . čeká na počátek procesu , zatímco odesílání nemůže. Zejména pokud první odeslání dokončí před spuštěním procesu , riskujete, že vaše data budou ignorována. V situacích, kdy interaktivní programy nenabízejí počáteční výzvu, můžete předložit odesílání zpožděním jako v:

# Aby nedošlo k tomu, že by hackerům poskytoval informace o tom, jak se vracet, # tento systém nevyzve externí heslo. # Počkejte 5 sekund pro exec dokončit spawn telnet very.secure.gov spát 5 odeslat heslo \ r

exp_send je alias pro odeslání. Pokud používáte Expectk nebo nějakou jinou variantu Expect v prostředí Tk, odesíláme Tk pro zcela jiný účel. exp_send je určen pro kompatibilitu prostředí. Podobné aliasy jsou k dispozici pro ostatní příkazy pro odesílání společnosti Expect.

send_error [-flags] řetězec
je jako odeslání , kromě toho, že výstup je odeslán na stderr spíše než aktuální proces .

send_log [-] řetězec
je jako odeslání , s výjimkou, že řetězec je odeslán pouze do souboru protokolu (viz log_file .) Argumenty jsou ignorovány, pokud není otevřen žádný soubor protokolu.

send_tty [-flags] řetězec
je jako poslat , kromě toho, že výstup je odeslán na / dev / tty spíše než aktuální proces .

send_user [-flags] řetězec
je jako poslat , kromě toho, že výstup je odeslán na stdout spíše než aktuální proces .

spánku sekund
způsobí, že skript spí pro daný počet sekund. Počet sekund může být desetinné číslo. Přerušení (a události Tk, pokud používáte přípravek Expectk) jsou zpracovávány v době, kdy Expect spí.

spousta [args] program [args]
vytvoří nový proces s programem "args". Jeho stdin, stdout a stderr jsou spojeny s očekáváním, takže mohou být čteny a napsány jinými příkazy Expect . Připojení je přerušeno zavřením nebo pokud proces sám uzavře některý z identifikátorů souborů.

Když je proces spuštěn rozštěpením, je proměnná spawn_id nastavena na deskriptor odkazující na tento proces . Proces popsaný spawn_id se považuje za "současný proces ". spawn_id může být čteno nebo psáno, což ve skutečnosti zajišťuje kontrolu práce.

user_spawn_id je globální proměnná obsahující deskriptor, který odkazuje na uživatele. Pokud je například hodnota spawn_id nastavena na tuto hodnotu, očekává se, že se chová jako expect_user .

.I error_spawn_id je globální proměnná obsahující deskriptor, který odkazuje na standardní chybu. Například pokud je hodnota spawn_id nastavena na tuto hodnotu, odeslání se chová jako send_error .

tty_spawn_id je globální proměnná obsahující deskriptor, který odkazuje na / dev / tty. Pokud / dev / tty neexistuje (například v cron, v nebo dávkovém skriptu), pak tty_spawn_id není definován. Toto může být testováno jako:

pokud {{vars tty_spawn_id]} {# / dev / tty existuje} jinak {# / dev / tty neexistuje # pravděpodobně v cron, dávkovém nebo skriptu}

spawn vrací identifikátor procesu UNIX. Pokud není spuštěn žádný proces , vrátí se 0. Proměnná spawn_out (slave, name) je nastavena na název zařízení pty slave.

Ve výchozím nastavení spouští echo název příkazu a argumenty. Příznaky -noecho se zastaví.

Příznak -console způsobí přesměrování výstupu konzoly na proces spuštěný. Tato funkce není podporována ve všech systémech.

Vnitřně využívá tzv. Pty, inicializuje stejným způsobem jako tty uživatele. Toto je dále inicializováno tak, aby všechna nastavení byla "zdravá" (podle stty (1)). Pokud je proměnná stty_init definována, interpretuje se ve stylu stty argumentů jako další konfigurace. Například "nastavit stty_init raw" způsobí, že další terminálové procesy se spustí v nezpracovaném režimu. -nottycopy přeskočí inicializaci založenou na tty uživatele. -nottyinit přeskočí inicializaci "zdravý".

Za normálních okolností trénink trvá jen málo času. Pokud si všimnete plodu trvajícího značné množství času, pravděpodobně se setkáte s ptys, které jsou zaklíněné. Na ptys probíhá řada testů, aby nedošlo k zapletení s chybnými procesy. (Ty trvají 10 sekund na klínu pty.) Běh Expect s volbou -d ukáže, zda Expect narazí na mnoho ptys v lichých stavech. Pokud nemůžete zabít procesy, ke kterým jsou tyto ptyy připojeny, může se jednat pouze o restartování.

Pokud program nemůže být úspěšně spuštěn, protože selže (2) (např. Pokud program neexistuje), vrátí se chybové hlášení dalším příkazem interact nebo očekávat, jako kdyby program spustil a vytvořil chybovou zprávu jako výstup. Toto chování je přirozeným důsledkem implementace plodů . Vnitřně se rozštěpí vidličky, po kterém se rozštěpený proces nemá způsob, jak komunikovat s původním procesem Expect, kromě komunikace přes spawn_id.

Příznak -open způsobí, že další argument bude interpretován jako identifikátor souboru Tcl (tj. Vrácený otevřeným .) Identifikátor tresky se pak může použít, jako by se jednalo o plod. (Identifikátor souboru by se již neměl používat.) To vám umožní zacházet se surovými zařízeními, soubory a potrubími jako procesy plodů bez použití pty. 0 je vráceno, což znamená, že neexistuje žádný související proces . Když je spojení se spuštěným procesem uzavřeno, tak je identifikátor souboru Tcl. Příznak -leaveopen je podobný - open, kromě toho, že -leaveopen způsobí, že bude souborový identifikátor ponechán otevřený i po uzavření ID tresky .

Vlajka -typ způsobí otevření pty, ale žádný proces nevytvořil. 0 je vráceno, což znamená, že neexistuje žádný související proces . Spawn_id se nastavuje jako obvykle.

Proměnná spawn_out (slave, fd) je nastavena na identifikátor souboru odpovídající pty slave. Může být uzavřena pomocí funkce "close-slave".

Příznak -ignore označuje signál, který má být ignorován v procesu plodu . V opačném případě mají signály výchozí chování. Signály jsou pojmenovány jako v příkazu trap , s výjimkou, že každý signál vyžaduje samostatnou příznak.

strace
způsobuje, že následující příkazy budou vytištěny před provedením. (Příkaz trace Tcl určuje proměnné.) Úroveň udává, jak daleko v zásobníku volání lze sledovat. Například následující příkaz běží očekávat při sledování prvních 4 úrovní hovorů, ale nikoli pod nimi.

očekávejte -c "strace 4" script.exp

Vlajka -info způsobí, že se strace vrátí popis nejnovějších neindikovaných argumentů.

stty args
mění režimy terminálu podobně jako externí příkaz stty.

Ve výchozím nastavení je přístupný řídicí terminál. Ostatní terminály jsou přístupné připojením "Žádosti o stav vrátí se jako výsledek příkazu.Pokud není požadován žádný stav a řídící terminál je přístupný, předchozí stav surových a echo atributy jsou vráceny ve formě, která může být později použitý příkazem.

Například argumenty raw nebo cooked dávají terminál do raw režimu. Argumenty - rozevíratelné nebo uvařené, dávají terminál do režimu vaření. Argumenty echo a -echo umístit terminál do režimu echa a noecho.

Následující příklad ukazuje, jak dočasně vypnout ozvěnu. To může být použito v jinak automatických skriptech, aby se zabránilo vkládání hesel do nich. (Více viz níže v části OČEKÁVAT OČEKÁVÁNÍ.)

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

system args
dává args sh (1) jako vstup, jako kdyby byl zadán jako příkaz z terminálu. Očekávejte, že čeká, dokud nebude ukončen shell. Stav návratu z sh je zpracován stejným způsobem, jakým provádí příkaz return status.

Na rozdíl od příkazu exec, který přesměruje stdin a stdout do skriptu, systém nevykonává žádné přesměrování (jiné než to, které označuje samotný řetězec). Takže je možné použít programy, které musí komunikovat přímo s / dev / tty. Ze stejného důvodu se výsledky systému nezaznamenávají do protokolu.

časové razítko [args]
vrátí časové razítko. Bez argumentů je počet sekund od doby, kdy je epocha vrácena.

Příznak -format představuje řetězec, který je vrácen, ale nahrazeny podle pravidel POSIX pro strftime. Například% a je nahrazen zkráceným názvem v týdnu (tj. Sat). Jiné jsou:

% a zkrácený název dne v týdnu% Úplný název v týdnu% b zkrácený název měsíce% B úplný název měsíce% c datum-čas jako v: St 6 října 11:45:56 1993% den v měsíci (01-31% H hodina (00-23)% I hodiny (01-12)% j den (001-366)% m měsíc (01-12)% M minuta (00-59)% p am nebo pm% S second (00-61) % u den (1-7, pondělí je první den v týdnu)% U týden (00-53, první neděle je první den v týdnu jedna)% V týden (01-53, styl ISO 8601) 6)% W týden (00-53, první pondělí je první den v týdnu jedna)% x datum-čas jako v: St 6 října 1993% X čas jako v: 23:59:59% y rok (00-99) % Y rok jako v: 1993% Z časové pásmo (nebo nic, pokud není určeno) %% barevné procento znaménko

Jiné% specifikace jsou nedefinované. Ostatní znaky budou procházeny nedotčenými. Podporována je pouze lokalizace C.

Příznak -seconds zavádí několik sekund od doby, kdy má být epocha použita jako zdroj, ze kterého se má formátovat. V opačném případě se používá aktuální čas.

Příznak -gmt vynutí výstup časové značky pro použití časové zóny GMT . Bez příznaku se používá místní časové pásmo.

trap [[příkaz] signály]
způsobí, že daný příkaz bude proveden při budoucím přijetí některého z uvedených signálů. Příkaz se provádí v globálním rozsahu. Pokud chybí příkaz , vrátí se signální akce. Je-li příkazem řetězec SIG_IGN, signály jsou ignorovány. Pokud je příkazem řetězec SIG_DFL, jsou signály výsledkem výchozího systému. Signály jsou buď jediným signálem nebo seznamem signálů. Signály mohou být zadány číselně nebo symbolicky podle signálu (3). Předpona "SIG" může být vynechána.

Bez argumentů (nebo argumentu -number) vrátí trap číslo signálu aktuálně prováděného příkazu trap.

Příznak -code používá návratový kód příkazu namísto libovolného kódu Tcl, který se chystal vrátit, když příkaz původně spuštěn.

Příznak -interp způsobí, že příkaz bude vyhodnocen pomocí tlumočníka, který byl aktivní v okamžiku spuštění příkazu spíše než při deklaraci lapače.

Příznak -name způsobí, že příkaz trap vrátí název signálu aktuálně prováděného příkazu trap.

Příznak -max způsobí, že příkaz trap vrátí největší číslo signálu, které lze nastavit.

Například příkaz "trap {send_user" Ouch! "} SIGINT" vytiskne "Ouch!" pokaždé, když uživatel stiskne tlačítko ^ C.

Ve výchozím nastavení SIGINT (který lze obvykle generovat stisknutím tlačítka ^ C) a SIGTERM způsobí ukončení aplikace Expect. Důvodem je následující chyba, vytvořená ve výchozím nastavení při spuštění aplikace Expect.

výstup trapu {SIGINT SIGTERM}

Pokud použijete příznak -D ke spuštění ladicího programu, SIGINT je nově definován, aby spustil interaktivní ladicí program. Důvodem je následující chyba:

trap {exp_debug 1} SIGINT

Lapač ladicího programu lze změnit nastavením proměnné prostředí EXPECT_DEBUG_INIT na nový příkaz trap.

Samozřejmě je možné obe tyto funkce přepsat pouze přidáním povelů ke skriptu. Zejména pokud máte vlastní "SIGINT ukončení trap", bude to přepsat lapač ladění. To je užitečné, pokud chcete uživatelům zabránit dostat se do ladicího programu vůbec.

Pokud chcete definovat vlastní trap na síti SIGINT, ale přesto ji do běžícího lapače přetrvávat, použijte:

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

Případně můžete zachytit ladicí program pomocí jiného signálu.

pasažér vám nedovolí přepsat akci pro SIGALRM, protože je použita interně pro očekávání . Příkaz odpojení nastavuje SIGALRM na SIG_IGN (ignorovat). Tuto funkci můžete znovu povolit, pokud ji deaktivujete během následujících příkazů.

Více informací naleznete v signálu (3).

počkat [args]
zpoždění, dokud nedojde k ukončení procesu (nebo současného procesu, pokud nikdo není jmenován).

wait normálně vrátí seznam čtyř celých čísel. První celé číslo je pid procesu, který byl čekal. Druhé celé číslo odpovídá id. Třetí celé číslo je -1, jestliže došlo k chybě operačního systému nebo 0 jinak. Pokud třetí celé číslo bylo 0, čtvrté celé číslo je stav vrácený procesem plodil. Pokud bylo třetí celé číslo -1, čtvrté celé číslo je hodnota errno nastavená operačním systémem. Je také nastavena globální proměnná chybového kódu.

Na počátku návratové hodnoty se mohou objevit další prvky od čekání . Volitelný pátý prvek identifikuje třídu informací. V současné době je jedinou možnou hodnotou pro tento prvek CHILDKILLED, přičemž dalšími dvěma hodnotami jsou název signálu typu C a krátký textový popis.

Příznak -i deklaruje proces čekat odpovídající jménu spawn_id (NEID procesu id). Uvnitř obslužného zařízení SIGCHLD je možné čekat na jakýkoli proces, který vznikl, a to pomocí parametru spawn id -1.

Příznak -nowait způsobí, že čekání se okamžitě vrátí s indikací úspěšného čekání. Když proces opustí (později), automaticky zmizí, aniž by bylo nutné explicitně čekat.

Příkaz wait může také být použit, počkejte na vykročení procesu pomocí argumentů "-i -1". Na rozdíl od jeho použití s ​​plodnými procesy může být tento příkaz proveden kdykoli. Neexistuje žádná kontrola, který proces je využíván. Vrácenou hodnotu je však možné zkontrolovat pro id procesu .

KNIHOVNY

Očekávejte, že automaticky ví o dvou vestavěných knihovnách pro Skripty očekávat. Ty jsou definovány adresáři uvedenými v proměnných exp_library a exp_exec_library. Oba obsahují užitečné soubory, které mohou být použity jinými skripty.

exp_library obsahuje soubory nezávislé na architektuře. exp_exec_library obsahuje soubory závislé na architektuře. V závislosti na vašem systému mohou být oba adresáře zcela prázdné. Existence souboru $ exp_exec_library / cat-buffers popisuje, zda jsou vaše buffery / bin / cat standardně.

PRETTY-PRINTING

Definice vgrind je k dispozici pro pěkné tiskové skripty. Za předpokladu, že je definice vgrind dodávaná s distribucí Expect správně nainstalována, můžete ji použít jako:

vgrind -lexpect

PŘÍKLADY

Mnoho z nich není zřejmé, jak dát vše dohromady, jak popisuje manuálová stránka. Doporučuji vám, abyste si přečetli a vyzkoušeli příklady v příkladovém adresáři distribuce Expect . Některé z nich jsou skutečné programy. Jiné jsou prostě ilustrativní pro určité techniky, a samozřejmě, pár jsou jen rychlé hacks. Soubor INSTALL obsahuje rychlý přehled o těchto programech.

Rovněž jsou užitečné dokumenty " očekávat" (viz JMEN). Zatímco některé články používají syntaxi, která odpovídá dřívějším verzím aplikace Expect, přiložené odůvodnění jsou stále platné a podrobněji se zabývají touto manuálovou stránkou.

PŘIPRAVUJEME

Rozšíření může kolidovat s názvy příkazů Expect. Například odesílání je definováno Tk pro zcela jiný účel. Z tohoto důvodu je většina příkazů Expect k dispozici také jako "exp_XXXX". Příkazy a proměnné začínající slovy "exp", "inter", "spawn" a "timeout" nemají aliasy. Pokud potřebujete tuto kompatibilitu mezi prostředími, použijte názvy rozšířených příkazů.

Očekává se, že má spíše liberální pohled na rozsah. Zejména proměnné čtené příkazy specifické pro program Expect budou vyhledávány nejprve z místního rozsahu a pokud nejsou nalezeny v globálním rozsahu. Například to vylučuje potřebu umístit "globální časový limit" v každém postupu, který píšete, který používá očekávat . Na druhé straně jsou proměnné zapsané vždy v lokálním rozsahu (pokud nebyl vydán "globální" příkaz). Nejběžnějším problémem, který způsobuje, je to, že se spouštění provádí v postupu. Mimo procedury už neexistuje spawn_id , takže zplozený proces již není přístupný jednoduše proto, že je určen rozsah. Přidejte "globální spawn_id" do takového postupu.

Nemůžete-li povolit funkci multispawningu (tj. Váš systém nepodporuje výběr (BSD *. *), Anketa (SVR> 2) ani něco ekvivalentního), očekáváme, že bude moci řídit pouze jeden proces najednou. V tomto případě se nepokoušejte nastavit parametr spawn_id , ani byste neměli spouštět procesy pomocí příkazu exec při spuštěném procesu . Navíc nebudete moci očekávat od více procesů (včetně uživatele jako jednoho) současně.

Parametry terminálu mohou mít velký vliv na skripty. Například pokud je napsán skript, který hledá ozvěnu, bude chybět, pokud je vypnuto ozvěnování. Z tohoto důvodu očekávejte standardní parametry koncových svorek. Bohužel to může dělat věci nepříjemné pro jiné programy. Jako příklad emacs shell chce změnit "obvyklé" mapování: nové řádky se namapují na nové řádky namísto vratných řádků a zpětná vazba je zakázána. To umožňuje použít emacs pro úpravu vstupního řádku. Naneštěstí to očekáváme.

Můžete požádat, aby aplikace Expect nezahrnula výchozí nastavení parametrů terminálu, ale musíte při vytváření skriptů pro takové prostředí být velmi opatrní. V případě emaků se vyvarujte závislostem od věcí, jako je ozvěna a mapování na konci řádku.

Příkazy, které přijaly argumenty zařazené do jediného seznamu ( očekávají varianty a interagují ), používají heuristiku k tomu, aby rozhodli, zda je seznam vlastně jeden argument nebo mnoho. Heurističnost může selhat pouze v případě, že seznam skutečně představuje jediný argument, který má více vnořených \ n s znaky, které nejsou mezery mezi nimi. To se zdá být dostatečně nepravděpodobné, nicméně argument "-nobrace" může být použit k tomu, aby jediný argument byl zpracován jako jediný argument. To lze předpokládat s použitím strojně generovaného kódu Expect. Podobně -brace nutí jediný argument, který má být zpracován jako více vzorků / akcí.

HMYZ

Bylo opravdu lákavé pojmenovat program "sex" (buď "Smart EXec" nebo "Send-Expect"), ale převládal dobrý smysl (nebo snad jen puritanismus).

Na některých systémech, když je vytvořen shell, se stěžuje na to, že nebude mít přístup k tty, ale běží stejně. To znamená, že váš systém má mechanismus pro získání ovládacího prvku, o němž společnost Expect neví. Zjistěte, co to je, a zašlete mi tyto informace zpět.

Ultrix 4.1 (alespoň ty nejnovější verze zde) považuje časové limity nad 1000000 za ekvivalentní hodnotě 0.

Digitální systém UNIX 4.0A (a pravděpodobně i jiné verze) odmítne přidělit ptys, pokud definujete obslužný program SIGCHLD. Další informace naleznete na stránce grantů.

IRIX 6.0 nezpracovává oprávnění pty správně, takže pokud očekáváte pokus o přidělení pty dříve použitého někým jiným, selže. Upgrade na IRIX 6.1.

Telnet (ověřený pouze v rámci systému SunOS 4.1.2) zablokuje, pokud není nastaven TERM. Toto je problém v cron, cgi a cgi skriptech, které nedefinují TERM. Musíte ji tedy explicitně nastavit - na typ, který je obvykle irelevantní. To prostě musí být nastaveno na něco! Následující pravděpodobně postačuje pro většinu případů.

nastavit env (TERM) vt100

Tip (ověřeno pouze podle BSDI BSD / OS 3.1 i386) visí, pokud SHELL a HOME nejsou nastaveny. Toto je problém v cron , cgi a cgi skriptech, které nedefinují tyto proměnné prostředí. Proto je musíte explicitně nastavit - na typ, který je obvykle irelevantní. To prostě musí být nastaveno na něco! Následující pravděpodobně postačuje pro většinu případů.

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

Některé implementace ptys jsou navrženy tak, aby jádro vyhodilo veškerý nepřečtený výstup po 10 až 15 sekundách (skutečné číslo závisí na implementaci) po ukončení procesu deskriptoru souboru. Tak očekávejte programy, jako je

datum spaní 20 očekávat

selže. Abyste tomu zabránili, vyvolávejte neinteraktivní programy s exec spíše než s trestem . Zatímco takové situace jsou myslitelné, v praxi jsem se nikdy nesetkal s situací, kdy by se kvůli tomuto chování ztratí konečný výstup skutečně interaktivního programu.

Na druhou stranu, Cray UNICOS ptys vyhodí veškerý nepřečtený výstup okamžitě po ukončení procesu deskriptoru souboru. Ohlásil jsem to Crayovi a pracují na opravě.

Někdy je potřeba zpoždění mezi výzvu a odpovědí, například když rozhraní tty mění nastavení UART nebo odpovídající přenosové rychlosti vyhledáním bitů start / stop. Obvykle je to všechno, co vyžaduje, spát za vteřinu nebo dvě. Robustnější technikou je pokus o opakování, dokud není hardware připraven přijímat vstupy. Následující příklad používá obě strategie:

odeslat "rychlost 9600 \ r"; spánek 1 očekávejte {timeout {odeslat "\ r"; exp_continue} $ prompt}

kód trap nepracuje s žádným příkazem, který sedí v smyčce událostí Tcl, například spánku. Problémem je, že ve smyčce událostí Tcl odmítne návratové kódy z obslužných programů událostí async. Řešením je nastavit příznak v kódu trapu. Pak zkontrolujte příznak ihned po příkazu (tj. Spánku).

Příkaz expect_background ignoruje argumenty -timeout a obecně nemá pojem časových limitů.

& # 34; EXPECT HINTS & # 34;

Existuje několik věcí, které by mohly být neintuitivní. Tato část se pokouší některé z těchto věcí řešit několika návrhy.

Společným očekáváním problému je, jak rozpoznat výzvy pro shell. Vzhledem k tomu, že tyto jsou přizpůsobeny odlišně různými lidmi a různými shelly, může být automatizace rloginu automatizována, aniž by byla známa výzva. Přiměřenou konvencí je, že uživatelé ukládají do proměnné prostředí EXPECT_PROMPT regulární výraz popisující jejich výzvu (zejména její konec). Může být použit kód jako následující. Pokud EXPECT_PROMPT neexistuje, kód stále má dobrou šanci správného fungování.

nastavit výzvu "(% | # | \\ $) $"; # výchozí výzva catch {nastavit výzvu $ env (EXPECT_PROMPT)} expect -re $ prompt

Doporučuji vám, abyste napsali očekávané vzorce, které zahrnují konec čehokoli, co očekáváte. Tím se vyhnete možnosti odpovědi na otázku před tím, než uvidíte celou věc. Kromě toho, i když budete pravděpodobně schopni odpovědět na otázky předtím, než je uvidíte úplně, pokud odpovíte časně, vaše odpověď se může objevit opakovaně zpět uprostřed otázky. Jinými slovy, výsledný dialog bude správný, ale vypadá zkroucený.

Většina výzvy obsahuje znak na mezeru na konci. Například příkaz z ftp je 'f', 't', 'p', '>' a. Chcete-li odpovídat této výzvě, musíte pro každou z těchto znaků vytvořit účet. Obvykle se chyba nezahrnuje prázdné místo. Položte políčko explicitně.

Pokud použijete vzorek formuláře X *, bude * odpovídat veškerému výstupu získanému od konce X poslední přijaté věci. To zní intuitivně, ale může být poněkud matoucí, protože frázi "poslední věc přijatá" se může lišit v závislosti na rychlosti počítače a zpracování vstupů / výstupů jak jádrem, tak ovladačem zařízení.

Obzvláště lidé mají tendenci vidět, že programový výstup přichází v obrovských kusech (atomově), když ve skutečnosti většina programů produkuje výstupní jeden řádek najednou. Za předpokladu, že se jedná o tento případ, * ve vzoru předchozího odstavce může odpovídat pouze konci aktuálního řádku, i když se zdá, že je více, protože v době zápasu, který byl veškerý výstup, který byl přijat.

očekáváte, že nemá žádný způsob, jak vědět, že přichází další produkce, pokud na to váš vzor neurčuje.

Dokonce i v závislosti na řádkové vyrovnávací paměti je nerozumné. Programy nejen zřídka dělají sliby o typu ukládání do vyrovnávací paměti, ale systémové trávení může přerušit výstupní linky tak, aby se řádky rozpadly na zdánlivě náhodných místech. Pokud tedy při psaní vzorků můžete vyjádřit posledních několik znaků výzvy, je to moudré.

Pokud čekáte na vzorek v posledním výstupu programu a program vysílá místo něčeho jiný, nebudete moci rozpoznat to s klíčovým časovým limitem . Důvodem je to, že se očekává , že nebude časový limit - namísto toho se dostane eof indikace. Místo toho použijte. Ještě lepší, použijte oba. Tímto způsobem, pokud se tato linka někdy pohybuje, nebudete muset upravovat linku samotnou.

Nové řádky jsou obvykle převedeny na návrat vozíku, sekvence linefeed při výstupu ovladačem terminálu. Pokud tedy chcete vzor, ​​který explicitně odpovídá dvěma řádkům, např. Z printf ("foo \ nbar"), použijte vzor "foo \ r \ nbar".

Podobný překlad se vyskytuje při čtení od uživatele, přes očekávanou_user . V tomto případě, když stisknete návrat, bude překládán do nového řádku. Pokud to očekáváme, očekáváme program, který nastaví terminál do režimu raw (jako je telnet), bude to problém, protože program očekává skutečný výnos. (Některé programy skutečně odpouštějí tím, že automaticky převedou nové řádky na návraty, ale většina z nich ne.) Bohužel, neexistuje způsob, jak zjistit, že program dal svůj terminál do raw režimu.

Spíše než ručně nahrazovat nové řádky s návraty, řešení je použít příkaz "stty raw", který zastaví překlad. Všimněte si však, že to znamená, že již nebudete mít funkce vařené úpravy čáry.

interaktivně implicitně nastaví terminál na režim raw, takže tento problém nebude následovat.

Často je užitečné ukládat hesla (nebo jiné soukromé informace) do skriptů očekávat . To se nedoporučuje, protože vše, co je uloženo v počítači, je přístupné nikomu. Interaktivní výzva k zadávání hesel ze skriptu je proto chytřejší, než je doslova vložit. Přesto je někdy taková vestavění jedinou možností.

Bohužel souborový systém UNIX nemá přímý způsob vytváření skriptů, které jsou spustitelné, ale nečitelné. Systémy, které podporují skripty setgid shell, mohou nepřímo simulovat takto:

Vytvořte skript Expect (který obsahuje tajná data) jako obvykle. Udělat jeho oprávnění 750 (-rwxr-x ---) a vlastnit důvěryhodnou skupinu, tj. Skupinu, která ji může číst. V případě potřeby vytvořte pro tento účel novou skupinu. Dále vytvořte skript / bin / sh s oprávněním 2751 (-rwxr-s - x) ve stejné skupině, jako dříve.

Výsledkem je skript, který může být proveden (a čten) nikým. Při vyvolání spustí skript Expect .

"VIZ TAKÉ"

Tcl (3), libexpect (3)
"Exploring Expect: Tcl-Based Toolkit pro automatizaci interaktivních programů" od Don Libes, str. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"očekávat: vytvrzení těch neovladatelných interakcí interaktivity" od Don Libes, sborník z leto 1990 USENIX konference, Anaheim, Kalifornie, 11.-11. června 1990.
.I "Použití očekávat, že automatizovat úkoly správy systému" od Don Libes, Proceedings of the 1990 USENIX Large Installation Systems Administration Conference, Colorado Springs, Colorado, 17.-19. Října 1990.
. "Tcl: Vestavěný příkazový jazyk" od Johna Ousterhouta, Sborník Zimní 1990 USENIX Conference, Washington, DC, 22. - 26. ledna 1990. "Očekávám: Skripty pro ovládání interaktivních programů" od Don Libes, , Vol. 4, č. 2, časopisy University Press v Kalifornii, listopad 1991. I "Regresní testování a testování souladů interaktivních programů", Don Libes, Sborník z léta 1992 USENIX Conference, str. 135-144, San Antonio, TX, 12. - 15. června 1992. "Kibitz - Připojování více interaktivních programů dohromady", Don Libes, Software - Praxe a zkušenosti, John Wiley & Sons, West Sussex, Anglie, sv.

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

AUTOR

Don Libes, Národní institut pro standardy a technologie

POZNÁMKY

Díky Johnu Ousterhoutovi za Tcl a Scott Paisley za inspiraci. Díky Rob Savoye pro autokonfigurační kód společnosti Expect.

Soubor HISTORY dokumentuje velkou část očekávaného vývoje. To dělá zajímavé čtení a může vám dát další pohled na tento software. Díky osobám, které jsou v ní uvedeny, kteří mi poslali opravy chyb a dal další pomoc.

Návrh a implementace společnosti Expect byla částečně zaplacena americkou vládou, a proto je veřejně přístupná. Nicméně autor a NIST by si přáli úvěr, pokud tento program a dokumentace nebo jejich části budou použity.