Komanda Linux / Unix presin

Prisni është një program që flet për programe të tjera interaktive sipas një skenari. Pas skenarit, Expect di se çfarë mund të pritet nga një program dhe cila duhet të jetë përgjigja e saktë. Një gjuhë e interpretuar ofron struktura bronkiale dhe të nivelit të lartë të kontrollit për të drejtuar dialogun. Përveç kësaj, përdoruesi mund të marrë kontrollin dhe të bashkëveprojë direkt kur të jetë e dëshiruar, pastaj të kthehet në kontroll tek skripti.

Expectk është një përzierje e Expect dhe Tk. Sillet ashtu si presin dhe dëshira e Tk-së. Prisni gjithashtu mund të përdoret direkt në C ose C + + pa Tcl.

Emri "Prisni" vjen nga ideja e dërgimit / pritjes së sekuencave të popullarizuara nga uucp, kermit dhe programe të tjera të kontrollit modem. Megjithatë ndryshe nga uucp, Expect është i përgjithësuar në mënyrë që të mund të funksionojë si një komandë e nivelit të përdoruesit me çdo program dhe detyrë në mendje. Pritni mund të bisedoni me disa programe në të njëjtën kohë.

Çfarë presin mund të bëjnë

Për shembull, këtu janë disa gjëra që komanda e pritshme mund të bëjë:

Ekzistojnë shkaqe të ndryshme pse predha nuk mund t'i kryejë këto detyra. Të gjitha janë të mundshme me Presin.

Në përgjithësi, Expect është i dobishëm për drejtimin e ndonjë programi që kërkon bashkëveprim midis programit dhe përdoruesit. E gjithë kjo është e nevojshme që ndërveprimi të karakterizohet në mënyrë programore. Presin gjithashtu mund të japë përsëri kontrollin e përdoruesit pa ndaluar programin që kontrollohet. Në mënyrë të ngjashme, përdoruesi mund të kthejë kontrollin në skriptin në çdo kohë.

përdorim

Prisni lexon cmdfile për një listë të komandave për ekzekutim. Prisni mund të thirret në mënyrë implicite në sistemet që mbështesin #! notation duke shënuar script si ekzekutues dhe duke e bërë rreshtin e parë në script:

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

Natyrisht, rruga duhet të përshkruajë me saktësi se ku presin jeton. / usr / local / bin është vetëm një shembull.

-c flamuri prefaces një komandë që do të ekzekutohet para ndonjë në script. Komanda duhet të citohet për të parandaluar shkatërrimin e guaskës. Ky opsion mund të përdoret shumë herë. Komandat e shumëfishta mund të ekzekutohen me një c të vetme duke i ndarë ato me pikëpresje. Komandat ekzekutohen në rendin që shfaqen. Kur përdorni Expectk, ky opsion është specifikuar si -komandë.

-d flamuri mundëson një dalje diagnostike, e cila kryesisht raporton aktivitetin e brendshëm të komandave siç janë pritjet dhe bashkëveprimi. Ky flamur ka të njëjtin efekt si "exp_internal 1" në fillim të një skenari të Prisni, plus versioni i Prisni është shtypur.

-D flamuri mundëson një debugger interaktive. Duhet të vijë një vlerë e plotë. Debugger do të marrë kontrollin para procedurës së ardhshme Tcl nëse vlera është jo-zero ose nëse një ^ C është shtypur ose një pikë breakpoint është goditur, ose komandë të tjera të përshtatshme debugger shfaqet në script. Kur përdorni Expectk, ky opsion është specifikuar si - Debug.

-f flamuri prefaces një skedar nga i cili për të lexuar komandat. Vetë flamuri është i detyrueshëm pasi është i dobishëm vetëm kur përdorni #! notation, kështu që argumente të tjera mund të furnizohen në rreshtin e komandës. Kur përdorni Expectk, ky opsion është specifikuar si -file.

By default, skedari i komandës lexohet në memorie dhe ekzekutohet në tërësinë e tij. Ndonjëherë është e dëshirueshme që të lexohen skedarët një rresht në të njëjtën kohë. Në mënyrë që të detyrohen që dosjet arbitrare të trajtohen në këtë mënyrë, përdorni flamurin -b. Kur përdorni Expectk, ky opsion është specifikuar si -buffer.

Nëse string "-" jepet si një emër i skedarit, në vend të kësaj lexohet hyrja standarde. Përdorni "./-" për të lexuar nga një skedar i quajtur me të vërtetë "-".

Arsyet e flamurit -i Prisni të ndërveprojnë me shpejtësi për komandat në vend të leximit të tyre nga një skedar. Kërkimi përfundon nëpërmjet komandës së daljes ose në EOF. Flamuri i -i supozohet nëse as një skedar komande as -c nuk është përdorur. Kur përdorni Expectk, ky opsion është specifikuar si -interaktive.

- mund të përdoren për të kufizuar fundin e opsioneve. Kjo është e dobishme nëse doni të kaloni një argument të ngjashëm me opsionin në skenarin tuaj pa u interpretuar nga Pritni. Kjo mund të vendoset me sukses në #! line për të parandaluar interpretimin e flamurit sipas Pritni. Për shembull, në vijim do të lihen argumentet origjinale duke përfshirë emrin e shkrimit në variablën argv .

#! / usr / local / bin / pres -

Vini re se konventat e zakonshme getopt (3) dhe execve (2) duhet të vëzhgohen kur shtohen argumente tek #! linjë.

Skedari $ exp_library / expect.rc vjen me burim automatikisht nëse është i pranishëm, përveç nëse përdoret flamuri -N. (Kur përdorni Expectk, ky opsion është specifikuar si -NORC.) Menjëherë pas kësaj, skedari ~ / .expect.rc vjen me burim automatikisht, përveç nëse përdoret flamuri -n. Nëse definohet variabli i mjedisit DOTDIR, ajo trajtohet si një direktorium dhe .expect.rc lexohet prej aty. Kur përdorni Expectk, ky opsion është specifikuar si -norc. Ky burim ndodh vetëm pas ekzekutimit të ndonjë flamuri -c.

-v shkaqet Presin të printoni numrin e versionit dhe daljen. Flamuri përkatës në Expectk, i cili përdor emra flamuri të gjatë, është -version.

Args opsionale janë ndërtuar në një listë dhe ruhen në variablën e quajtur argv dhe. argc është inicializuar në gjatësinë e argv.

Argv0 është përcaktuar të jetë emri i skriptit ose binar nëse nuk përdoret skript. Për shembull, në vijim shtypet emri i shkrimit dhe tre argumentet e para:

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

komandat

Prisni përdor gjuhën e komandës së veglave. Tcl siguron rrjedhjen e kontrollit (nëse, për pushim), vlerësimin e shprehjes dhe disa veçori të tjera të tilla si përkufizimi i rekursionit dhe procedurës. Komandat e përdorur këtu, por jo të përcaktuara (set, if, exec) janë komanda Tcl. Prisni mbështet komandat shtesë. Përveç nëse specifikohet ndryshe, komandat kthejnë vargun e zbrazët.

Komandat janë të renditura në mënyrë alfabetike në mënyrë që ato të mund të vendosen shpejt. Megjithatë, përdoruesit e rinj mund ta gjejnë më të lehtë për të filluar duke lexuar përshkrimet e pjellem, dërgojnë, presin dhe bashkëveprojnë, në atë mënyrë.

mbyll [-slave] [-onexec 0 | 1] [-i spawn_id]

mbyll lidhjen me procesin aktual. Shumica e programeve interaktive do të zbulojnë EOF në stdin e tyre dhe dalje; kështu që afërsia zakonisht mjafton për të vrarë edhe procesin . Flamuri i -i deklaron procesin për të mbyllur korrespondon me emrin spawn_id.

Të dyja presin dhe do të ndërveprojnë do të zbulojnë kur të dalë procesi aktual dhe në mënyrë implicite të bëjë një mbyllje, por në qoftë se ju vrasin procesin nga, të themi, "exec kill $ pid", ju duhet të thërrisni në mënyrë eksplicite afër .

Flamuri -onexec përcakton nëse idi i vezëve është i mbyllur në çdo proces të ri të lindur ose nëse procesi është mbivendosur. Për të lënë një ID të pjellem të hapur, përdorni vlerën 0. Një vlerë e plotë e integruar jo-zero e detyron pllenim të mbyllur në çdo proces të ri.

Flamuri i skllaves mbyll skllavin që shoqërohet me ID-në e pemëve. Kur lidhja është e mbyllur, skllaveri mbyllet automatikisht nëse është ende i hapur.

Pa marrë parasysh nëse lidhja është e mbyllur në mënyrë implicite ose në mënyrë eksplicite, duhet të telefononi të prisni për të pastruar vendin përkatës të procesit të kernelit. Komanda e ngushtë nuk e thërret thirrjen pasi nuk ka asnjë garanci se mbyllja e një lidhjeje procesi do ta bëjë atë të dalë.

debug [[-now] 0 | 1]

kontrollon një debugger Tcl lejuar ju që të hap përmes deklaratave dhe të vendosur breakpoints.

Pa argumente, një 1 kthehet nëse debugger nuk po kandidon, përndryshe kthehet një 0.

Me një argument 1, debugger është nisur. Me një argument 0, debugger është ndalur. Nëse një argument 1 paraprihet nga flaka-ora, debugger fillon menjëherë. Përndryshe, debugger është nisur me deklaratën e ardhshme Tcl.

Komanda e debugut nuk ndryshon asnjë kurthe. Krahasoni këtë me fillimin Prisni me flamurin -D.

Komanda shkëputje shkëputet nga një proces i lidhur me pirun nga terminali . Ai vazhdon të vrapojë në sfond. Procesi i është dhënë grupit të vet të procesit. Standardi I / O është ridrejtuar në / dev / null .

Fragma e mëposhtme përdor shkëputjen për të vazhduar drejtimin e shkrimit në sfond.

nëse {{fork] = 0} dalje shkëputje. . .

Skenari i mëposhtëm lexon një fjalëkalim dhe pastaj drejton një program çdo orë që kërkon një fjalëkalim sa herë që të ekzekutohet. Skenari siguron fjalëkalimin në mënyrë që ta shtypni vetëm një herë.

do të dërgojë "$ send_user" fjalëkalim? \ "expect_user -re" (. *) \ n "për {} 1 {} {if {[fork]! = 0} {sleep 3600; 1, string) \ r ". . . dalje}

Një avantazh për të përdorur shkyçjen mbi funksionin e procesit asinkronik të shell (&) është që Presin mund të shpëtojë parametrat e terminalit para se të shkëputet dhe pastaj më vonë t'i zbatojë ato në ptys të reja. Me &, Expect nuk ka një shans për të lexuar parametrat e terminalit pasi që terminali tashmë është i shkyçur nga koha Prisni merr kontrollin.

dalja [-opts] [status]

shkaqet Presin të dalin ose përgatiten ndryshe për ta bërë këtë.

Flamuri- onexit shkakton argumentin e ardhshëm që do të përdoret si një mbajtës dalës. Pa një argument, përdoruesi aktual i daljes kthehet.

Shigjetat e jo - exit Presin të përgatiten për të dalë, por të ndalojnë kontrollin e vërtetë të kthimit në sistemin operativ. Udhëheqësi i daljes së përcaktuar nga përdoruesi drejtohet, si dhe përdoruesit e brendshëm të Pritjes. Nuk duhet të ekzekutohen komandat e pritura më tej. Kjo është e dobishme nëse jeni duke ekzekutuar me Tcl extensions tjera. Interpretuesi aktual (dhe dritarja kryesore në qoftë se në mjedisin Tk) mbeten në mënyrë që zgjerimet e tjera Tcl të pastrohen. Nëse dalja e Pritjes thirret përsëri (megjithatë kjo mund të ndodhë), handlers nuk përsëriten.

Pas daljes, të gjitha lidhjet në proceset e lindura mbyllen. Mbyllja do të zbulohet si një EOF nga proceset e lindura. dalje nuk merr veprime të tjera përtej asaj që ekziston procedura normale _exit (2). Kështu, proceset e lindura që nuk kontrollojnë për EOF mund të vazhdojnë të funksionojnë. (Një sërë kushtesh janë të rëndësishme për të përcaktuar, për shembull, se çfarë sinjale do të dërgohen një proces i prodhuar, por këto janë të varura nga sistemi, zakonisht të dokumentuara nën daljen (3).) Proceset e nxjerra që vazhdojnë të ekzekutohen do të trashëgohen nga init.

statusi (ose 0 nëse nuk është specifikuar) kthehet si statusi i daljes së Pritni . dalja ekzekutohet në mënyrë implicite nëse arrihet fundi i shkrimit.

exp_continue [-continue_timer]
Komanda exp_continue lejon presin që vetë të vazhdojë ekzekutimin e jo të kthehet siç do normalisht. Si parazgjedhje exp_continue rivendos kohën timer. Flamuri i -continue_timer parandalon rinumërimin e kohëmatësit. (Shih pritni për më shumë informacion.)

exp_internal [-f file] vlera
shkakton komanda të mëtejshme për të dërguar informacionin diagnostik të brendshëm në Pritnistderr nëse vlera është jo-zero. Ky prodhim është i çaktivizuar nëse vlera është 0. Informacioni diagnostik përfshin çdo karakter të marrë, dhe çdo përpjekje e bërë për të përputhur prodhimin e tanishëm kundrejt modeleve.

Nëse skedari opsional është furnizuar, të gjitha prodhimet normale dhe debugging janë shkruar në atë skedar (pavarësisht nga vlera e vlerës ). Çdo skedar i prodhimit të mëparshëm diagnostik është i mbyllur.

Flag - info shkakton exp_internal për të kthyer një përshkrim të argumenteve më të fundit jo-info dhënë.

exp_open [args] [-i spawn_id]
kthen një identifikues skedari Tcl që korrespondon me id origjinal spawn. Identifikuesi i skedarit pastaj mund të përdoret sikur të ishte hapur nga komanda e hapur e Tcl-së. (Id idesë nuk duhet të përdoret. Një pritje nuk duhet të ekzekutohet.

Flamuri i fluturimit lë idin e hapur për hyrje përmes komandave të Prisni. Një pritje duhet të ekzekutohet në ID-në e pjelleve.

exp_pid [-i spawn_id]
kthen id proces që korrespondon me procesin e lindur aktualisht. Nëse përdoret flamuri -i , pala e kthyer i korrespondon asaj të idit të dhënë të pjelleve.

exp_send
është një alias për dërgimin .

exp_send_error
është një alias për send_error .

exp_send_log
është një alias për send_log .

exp_send_tty
është një alias për send_tty .

exp_send_user
është një alias për send_user .

exp_version [[-exit] version]
është e dobishme për të siguruar që skripti të jetë në përputhje me versionin aktual të Prisni.

Pa argumente, versioni i tanishëm i Prisni kthehet. Ky version pastaj mund të kodohet në skenarin tuaj. Nëse e dini që nuk po përdorni tiparet e versioneve të fundit, mund të specifikoni një version të mëparshëm.

Versionet përbëhen nga tre numra të ndara me pika. E para është numri i madh. Skriptet e shkruara për versionet e Pritni me një numër tjetër të madh pothuajse me siguri nuk do të funksionojnë. exp_version kthen një gabim nëse numrat kryesorë nuk përputhen.

I dyti është numri i vogël. Skriptet e shkruara për një version me një numër më të vogël se versioni aktual mund të varen nga disa veçori të reja dhe mund të mos funksionojnë. exp_version kthen një gabim nëse numrat kryesorë përputhen, por numri i vogël i shkrimit është më i madh se ai i ekzekutimit ekzekutiv.

E treta është një numër që nuk luan pjesë në krahasimin e versionit. Megjithatë, ajo rritet kur shpërndarja e softuerit Pritet të ndryshohet në çfarëdo mënyre, siç është dokumentacioni shtesë ose optimizimi. Është rivendosur në 0 për çdo version të ri të vogël.

Me flamurin -exit , Expect printon një gabim dhe dilte nëse versioni është i vjetëruar.

presin [[-opt] pat1 body1] ... [-ops] patn [bodyn]
pret derisa njëra prej modeleve të përputhet me prodhimin e një procesi të pjellur, ka kaluar një periudhë kohore e specifikuar, ose një fund i skedarit është parë. Nëse trupi përfundimtar është i zbrazët, mund të hiqet.

Modelet nga komanda më e fundit që pritet përpara përdorimit përdoren implicitisht para çdo modeli tjetër. Modelet nga komanda më e fundit e pritjes pas përdorimit përdoren implicitisht pas çdo modeli tjetër.

Nëse argumentet për deklaratën e pritur kërkojnë më shumë se një rresht, të gjitha argumentet mund të "mbështjellin" në një mënyrë që të shmangin ndërprerjen e çdo rreshti me një rresht të kundërt. Në këtë rast, zëvendësimet e zakonshme Tcl do të ndodhin përkundër shtrëngimit.

Nëse një model është eof fjalen, trupi përkatës ekzekutohet pas skedarit përfundimtar. Nëse një model është koha për fjalën, trupi përkatës ekzekutohet me kalimin e kohës. Nëse nuk përdoret asnjë fjalëkalim me kohë, një veprim i nënkuptuar nullor kryhet me kalimin e kohës. Periudha e parazgjedhur e kohës është 10 sekonda, por mund të vendoset, për shembull në 30, me komandën "set timeout 30". Një kohë e pafundme mund të përcaktohet me vlerën -1. Nëse një model është parazgjedhur për fjalën, trupi korrespondues ekzekutohet me kohën ose fundin e skedarit.

Nëse përputhet një model, atëherë ekzekutohet trupi korrespondues. presin kthimin e rezultatit të trupit (ose vargun bosh nëse nuk përputhet ndonjë model). Në rast se përputhen format e shumta, ajo që shfaqet së pari përdoret për të zgjedhur një trup.

Çdo herë që arrin prodhimi i ri, ai krahasohet me çdo model në rendin që ato janë të listuara. Kështu, mund të provoni për mungesën e një ndeshje duke e bërë modelin e fundit diçka të garantuar të shfaqet, të tilla si një nxitje. Në situata ku nuk ka të shpejtë, duhet të përdorni kohën (ashtu si do të kishit nëse do të bashkoheshit me dorë).

Modelet janë të specifikuara në tri mënyra. Sipas paracaktimit, modelet janë të specifikuara si me komandën e ndeshjes së stringit Tcl. (Modele të tilla janë gjithashtu të ngjashme me shprehjet e rregullta të C-shell zakonisht të referuara si modele "glob"). Flamuri -gl mund të përdoret për të mbrojtur modelet që përndryshe mund të përputhen me pritjen e flamujve. Çdo model që fillon me një "-" duhet të mbrohet në këtë mënyrë. (Të gjitha vargjet që fillojnë me "-" rezervohen për opsionet e ardhshme.)

Për shembull, fragmenti i mëposhtëm kërkon një identifikim të suksesshëm. (Vini re që aborti konsiderohet të jetë një procedurë e përcaktuar diku tjetër në shkrimin.)

presin {busy {shton zënë \ n; exp_continue} dështoi të ndërpresë "fjalëkalimin e pavlefshëm" ndërpritet afati i ndërprerjes së ndërprerjes}

Kuotat janë të domosdoshme në modelin e katërt pasi ai përmban një hapësirë, e cila përndryshe do të ndante modelin nga veprimi. Modelet me të njëjtin veprim (si p.sh. 3 dhe 4) kërkojnë që të renditen veprimet përsëri. Kjo mund të shmanget duke përdorur modele të stilit të rexxp (shih më poshtë). Më shumë informacion mbi formimin e modeleve të globit mund të gjenden në manualin Tcl.

Modelet e stilit Regexp ndjekin sintaksën e përcaktuar nga regexp Tcl (e shkurtër për "shprehjen e rregullt"). modelet e regexp futen me flamurin -re . Shembulli i mëparshëm mund të rishkruhet duke përdorur një regexp si:

presin {busy {shton zënë \ n; exp_continue} -re "dështoi | fjalëkalimi i pavlefshëm" ndërpreu ndërprerjen e ndërprerjes së afatit}

Të dyja llojet e modeleve janë "unanchored". Kjo do të thotë që modelet nuk duhet të përputhen me të gjithë vargun, por mund të fillojnë dhe t'i japin fund ndeshjes kudo në varg (për aq kohë sa çdo gjë tjetër përputhet). Përdorni ^ për të përputhur fillimin e një vargu, dhe $ për të përputhur fundin. Vini re se nëse nuk prisni fundin e një vargu, përgjigjet tuaja lehtë mund të përfundojnë në mes të vargut, pasi ato janë dukej nga procesi i lindur. Ndërsa ende prodhojnë rezultate korrekte, prodhimi mund të duket i panatyrshëm. Kështu, përdorimi i $ është i inkurajuar nëse mund t'i përshkruani saktësisht personazhet në fund të një vargu.

Vini re se në shumë redaktorë, ^ dhe $ përputhen përkatësisht me fillimin dhe mbarimin e linjave. Megjithatë, për shkak se presin nuk është e orientuar nga linja, këto karaktere përputhen me fillimin dhe përfundimin e të dhënave (në krahasim me linjat) aktualisht në pritje të tamponit të përputhjes. (Gjithashtu shih shënimin më poshtë mbi "dispepsi të sistemit".)

Flamja -ex shkakton modelin që duhet të përputhet si një varg "i saktë". Asnjë interpretim i *, ^, etj nuk është bërë (edhe pse konventat e zakonshme Tcl duhet ende të respektohen). Modelet e sakta janë gjithmonë të paangazhuara.

Flamuri i gazit shkakton shkronja të mëdha të prodhimit për t'u krahasuar sikur të ishin shkronja të vogla. Modeli nuk ndikohet.

Gjatë leximit të rezultateve, më shumë se 2000 bytes mund të detyrojnë bajtët e mëparshëm që të "harrohen". Kjo mund të ndryshohet me funksionin match_max . (Vini re se vlerat tepër të mëdha mund të ngadalësojnë modifikuesin e modelit.) Nëse patlist është full_buffer , organi korrespondues ekzekutohet nëse bytat match_max janë pranuar dhe asnjë model tjetër nuk përputhet. Nëse përdoret fjalia full_buffer ose nuk përdoret, personazhet e harruara janë shkruar për të pritur (tampon).

Nëse patlist është fjalen null dhe nulls lejohen (nëpërmjet command remove_nulls ), trupi korrespondues ekzekutohet nëse një ASCII e vetme 0 përputhet. Nuk është e mundur që të përputhen me 0 bytes nëpërmjet modeleve glob ose regexp.

Pas përputhjes së një modeli (ose eof ose full_buffer), çdo prodhim i krahasueshëm dhe i pashoq i mëparshëm ruhet në variablin expect_out (buffer) . Deri në 9 ndeshje substring të regexp ruhen në variabla expect_out (1, string) përmes expect_out (9, string) . Nëse flamuri i indekseve përdoret para një modeli, indekset e fillimit dhe të mbarimit (në një formë të përshtatshme për shpërndarje ) të 10 vargjeve ruhen në variablat expect_out (X, start) dhe expect_out (X, fund) ku X është një shifror, korrespondon me pozicionin e nënsistemit në tampon. 0 i referohet vargjeve që përputhen me të gjithë modelin dhe është krijuar për modelet e globit, si dhe modelet regexp. Për shembull, nëse një proces ka prodhuar prodhimin e "abcdefgh \ n", rezultati i:

presin "cd"

është sikur deklaratat e mëposhtme të ekzekutuara:

set expect_out (0, string) cd vendosur expect_out (buffer) abcd

dhe "efgh \ n" është lënë në buffer output. Nëse një proces prodhon outputin "abbbcabkkkka \ n", rezultati i:

pres-indekset -re "b (b *). * (k +)"

është sikur deklaratat e mëposhtme të ekzekutuara:

(1, start) 2 set expect_out (1, fund) 3 set expect_out (1, string) bb set expect_out (0, mbaron) (2, filloni) 10 set expect_out (2, fund) 10 set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

dhe "a \ n" është lënë në buffer output. Modeli "*" (dhe -re ". *") Do të shkurtojë tamponun e prodhimit pa lexuar ndonjë dalje tjetër nga procesi.

Normalisht, prodhimi i përputhshëm hidhet nga tamponët e brendshëm të Expect. Kjo mund të parandalohet duke prefiksuar një model me flamurin - jo - transferues . Ky flamur është veçanërisht i dobishëm në eksperimentimin (dhe mund të shkurtohet në "-not" për komoditet gjatë eksperimentimit).

ID-ja e pjesshme e lidhur me prodhimin e përputhshëm (ose eof ose full_buffer) ruhet në expect_out (spawn_id) .

Flamuri -timeout shkakton komandën e pritur aktuale për të përdorur vlerën e mëposhtme si një kohë të caktuar në vend të përdorimit të vlerës së ndryshores së kohës.

Sipas paracaktimit, modelet përputhen me daljen nga procesi aktual, megjithatë flamuri -i deklaron që rezultati nga lista e emrave spawn_id duhet të përputhet me çdo model të mëposhtëm (deri në i ardhshëm -i ). Lista spawn_id duhet të jetë një listë e ndarë e hapësirës së bardhë e spawn_ids ose një ndryshore që i referohet një liste të tillë të spawn_ids.

Për shembull, shembulli në vijim pret "lidhje" nga procesi aktual, ose "i zënë", "dështuar" ose "fjalëkalim i pavlefshëm" nga spawn_id i emëruar nga $ proc2.

pres {-i $ proc2 i zënë {shton zënë \ n; exp_continue} -re "dështoi | fjalëkalimi i pavlefshëm" ndërpreu ndërprerjen e ndërprerjes së afatit}

Vlera e variablit global any_spawn_id mund të përdoret për të përputhur modelet me çdo spawn_ids që emërohen me të gjithë flamujt e tjerë -i në komandën aktuale të pritur . Skeda spawn nga një flamur-i pa ndonjë model të lidhur (p.sh., e ndjekur menjëherë nga një tjetër -i ) është vënë në dispozicion për çdo model tjetër në të njëjtin komandë pritëse të lidhur me any_spawn_id.

Flamuri -i gjithashtu mund të emërojë një ndryshore globale në të cilin rast lexohet ndryshorja për një listë të ids spawn. Variabli rilexohet sa herë që ndryshon. Kjo siguron një mënyrë për të ndryshuar burimin e I / O ndërsa komanda është në ekzekutim. Idetë e shpërndara në këtë mënyrë quhen "ida indirekte" të pjellave.

Veprime të tilla si thyerja dhe vazhdimi i strukturave të kontrollit të shkaktojnë (dmth. Për proc ) të sillen në mënyrën e zakonshme. Komanda exp_continue lejon presin që vetë të vazhdojë ekzekutimin e jo të kthehet siç do normalisht.

Kjo është e dobishme për të shmangur sythe të qarta ose deklarata të përsëritura pritëse. Shembulli i mëposhtëm është pjesë e një fragmenti për të automatizuar rlogin. Exp_continue shmangë që duhet të shkruajnë një deklaratë të dytë presin (për të kërkuar përsëri promptin) nëse rlogin bën një fjalëkalim.

\ n "dërgoni" $ pres_out (1, string) \ n "{stty -echo send_user" fjalëkalim (për $ user) në $ host: "expect_user -re" (. echo {exp_continue} {incorrect {send_user "fjalëkalim i pavlefshëm ose llogari \ n" dalje} timeout {send_user "lidhje me $ host ndalohet nga \ n" exit} eof {send_user \ "lidhje me host dështoi: $ expect_out (buffer) re $ prompt}

Për shembull, fragmenti i mëposhtëm mund të ndihmojë një përdorues që të udhëheqë një ndërveprim që tashmë është plotësisht i automatizuar. Në këtë rast, terminali vendoset në modalitetin e papërpunuar. Nëse përdoruesi shtyp "+", një ndryshore rritet. Nëse shtypet "p", procesi i dërgon disa kthime, ndoshta për ta mbushur atë në një farë mënyre, dhe "i" lejon përdoruesin të bashkëveprojë me procesin, duke vjedhur në mënyrë efektive kontrollin nga skripti. Në secilin rast, exp_continue lejon që tanët presin të vazhdojnë përputhjen e modelit pas ekzekutimit të veprimit aktual.

stty raw -echo expect_after {-i $ user_spawn_id "p" {dërgoj "\ r \ r \ r"; exp_continue} "+" {inkr foo; exp_continue} "i" {ndërveprojnë; exp_continue} "lë" dalje}

Si parazgjedhje, exp_continue rivendos kohëzgjatjen e kohës. Kohëmatësi nuk rifillohet, nëse exp_continue quhet me flamur -continue_timer .

presin pas [presin_args]
punon në mënyrë identike me pritjet përpara, përveç nëse modelet nga të dyja presin dhe presin që pas mund të përputhen, përdoret modeli pritës . Shikoni komandën e pritshme para për më shumë informacion.

presback_background [pres_args]
merr të njëjtat argumente si presin , megjithatë kthehet menjëherë. Modelet testohen sa herë që arrihet hyrja e re. Kohëzgjatja dhe parazgjedhja e modelit janë të pakuptimtë për të pritur dhe mbahen në heshtje. Përndryshe, komanda wait_background përdor presin përpara dhe presin pas modeleve ashtu si prisnin .

Kur janë duke u vlerësuar veprimet e pritshme të hapura , përpunimi i sfondit për të njëjtin ID të pemëve është bllokuar. Përpunimi i sfondit është zhbllokuar kur veprimi përfundon. Përderisa përpunimi i sfondit është i bllokuar, është e mundur të bëhet një (skicë) e pritshme në të njëjtën ID të pëlhurave.

Nuk është e mundur të ekzekutosh një parashikim ndërsa një hapësira pritëse është zhbllokuar. presback_background për një id të veçantë spawn është fshirë duke deklaruar një expect_background të ri me të njëjtën ID spawn. Deklarimi i pritjes_background me asnjë model heq id dhënë spawn nga aftësia për të përputhen modelet në sfond.

presin para [presin_args]
merr të njëjtat argumente si presin , megjithatë kthehet menjëherë. Çiftet e veprimit nga modelet më të fundit që presin përpara me të njëjtin ID të pemëve janë shtuar në mënyrë implicite për çdo komandë të ardhshme pritëse . Nëse një model përputhet, ai trajtohet sikur të ishte specifikuar në komandën e pritshme vetë dhe trupi i lidhur ekzekutohet në kontekstin e komandës pritëse. Nëse modelet nga të dyja presin para dhe presin që të përputhen, modeli i pritshëm para përdorimit.

Nëse nuk përcaktohet asnjë model, skeda id nuk është kontrolluar për asnjë model.

Përveç nëse anashkalohet nga një flamur -i , prisni para se modelet të përputhen me ID-në e pjesshme të përcaktuar në kohën kur ekzekutohej komanda e pritjes para se të ekzekutohej (jo kur modeli i saj përputhet).

Flamuri i informacionit -info shkakton para se të kthejë specifikimet e tanishme të modeleve që do të përputhen. Si parazgjedhje, ai raporton mbi ID-në aktuale. Mund të jepet një specifikim opsional i spawn id për informacion mbi atë ID të pjellem. Për shembull

presin para-info -i $ proc

Më së shumti mund të jepet një specifikim i ID-së për pemë. Flamuri-indirekte shtyp ids direkt spawn që vijnë vetëm nga specifikimet indirekt.

Në vend të një specifikimi të ID-së përhapjes, flamuri "-të gjitha" do të shkaktojë "-info" për të raportuar mbi të gjitha idetë e pjellave.

Dalja e flamurit të informacionit mund të ripërdoret si argument për të pritur përpara.

presin_jt [presin_args]
është sikur prisni, por lexon karakteret nga / dev / tty (dmth. tastet nga përdoruesi). Nga default, leximi kryhet në mënyrë të gatuar. Kështu, linjat duhet të përfundojnë me një kthim në mënyrë që të presin t'i shohin ato. Kjo mund të ndryshohet nëpërmjet stty (shih komandën stty më poshtë).

presin_dorues [presin_args]
është sikur prisni, por lexon karaktere nga stdin (dmth. tastet nga përdoruesi). Nga default, leximi kryhet në mënyrë të gatuar. Kështu, linjat duhet të përfundojnë me një kthim në mënyrë që të presin t'i shohin ato. Kjo mund të ndryshohet nëpërmjet stty (shih komandën stty më poshtë).

pirun
krijon një proces të ri. Procesi i ri është një kopje e saktë e procesit aktual të pritur . Me sukses, piruni kthen 0 në procesin e ri (fëmija) dhe kthen procesin e identifikimit të procesit të fëmijës tek procesi i prindit. Në dështim (pa ndryshim për shkak të mungesës së resurseve, p.sh., hapësirën e shkëmbimit, kujtesës), fork kthen -1 në procesin e prindit dhe nuk krijohet asnjë proces i fëmijës.

Proceset me forcë dalin nëpërmjet komandës së daljes , ashtu si procesi origjinal. Proceset me forcë lejohen të shkruajnë në skedarët e regjistrit. Nëse nuk eaktivizon debugging ose logging në shumicën e proceseve, rezultati mund të jetë konfuze.

Disa implementime të pty mund të ngatërrohen nga lexuesit dhe shkrimtarët e shumtë, madje edhe për një çast. Kështu, është më e sigurt të pirun përpara proceseve të vezëve.

bashkëveprojnë [string1 body1] ... [stringn [bodyn]]
jep kontrollin e procesit aktual tek përdoruesi, në mënyrë që tastet të dërgohen në procesin aktual, dhe stdout dhe stderr i procesit aktual janë kthyer.

Çiftet e string-trupit mund të specifikohen si argumente, me ç'rast trupi ekzekutohet kur stringa përkatëse futet. (Parazgjedhje, vargu nuk i dërgohet procesit aktual.) Komanda e interpretuesit supozohet nëse trupi përfundimtar mungon.

Nëse argumentet për të gjithë deklaratën e bashkëveprimit kërkojnë më shumë se një rresht, të gjitha argumentet mund të "mbështjellin" në një mënyrë që të shmangin ndërprerjen e çdo rreshti me një rresht të kundërt. Në këtë rast, zëvendësimet e zakonshme Tcl do të ndodhin përkundër shtrëngimit.

Për shembull, komanda e mëposhtme shkon në ndërveprim me palët e mëposhtme string-body përcaktuar: Kur ^ Z shtypet, Pritni pezullohet. (Flamuri i ngjarjes rikthen mënyrat e terminalit.) Kur ^ A shtypet, përdoruesi sheh "që ke shtypur një kontroll-A" dhe procesi dërgohet një ^ A. Kur shtypet $, përdoruesi e sheh datën. Kur ^ C shtypet, prisni daljet. Nëse futet "foo", përdoruesi sheh "bar". Kur ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

vendos CTRLZ \ 032 ndërveproni {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "keni shtypur një kontroll-A \ n"; dërgoni "\ 001"} $ {send_user "Data është [format ora [orët e orës]]."} \ 003 dalje foo {send_user "bar"} ~~}

Në palë string-body, vargjet përputhen në mënyrë që ato të renditen si argumente. Llojet që përputhen pjesërisht nuk dërgohen në procesin aktual në pritje të pjesës tjetër që vjen. Nëse karakteret pastaj hyjnë në mënyrë të tillë që nuk mund të ketë më një ndeshje, vetëm pjesa e vargut do të dërgohet në proces që nuk mund të fillojë një ndeshje tjetër. Kështu, vargjet që janë nënstringa të ndeshjeve të pjesshme mund të përputhen më vonë, nëse vargjet origjinale që po përpiqej të përputheshin përfundimisht dështojnë.

By default, përputhja me string është e saktë pa karta të egra . (Në të kundërt, komanda e pritshme përdor modelet e stilit të globit sipas parazgjedhjes.) Flamja ex mund të përdoret për të mbrojtur modelet që përndryshe mund të përputhen me ndërveprimin e flamujve. Çdo model që fillon me një "-" duhet të mbrohet në këtë mënyrë. (Të gjitha vargjet që fillojnë me "-" rezervohen për opsionet e ardhshme.)

Flamuri -re forcon vargun që duhet interpretuar si një model rexxp-stili. Në këtë rast, nënshtresat përputhen ruhen në variablën e ndërveprueshme në mënyrë të ngjashme me mënyrën e pritjes së ruajtjes së rezultatit të saj në variabël expect_out . Flamuri i tregjeve është mbështetur në mënyrë të ngjashme.

Modeli eof paraqet një veprim që ekzekutohet në fund të skedarit. Një model i veçantë eof gjithashtu mund të ndjekë flamurin-output në të cilin rast ajo përputhet nëse një eof është zbuluar gjatë shkrimit të prodhimit. Veprimi i parazgjedhur është "kthimi", kështu që bashkëveprimi thjesht kthehet në çdo EOF.

Koha e modelimit prezanton një kohë (në sekonda) dhe veprim që ekzekutohet pasi nuk janë lexuar shkronja për një kohë të dhënë. Modeli i periudhës kohore vlen për procesin e specifikuar më së fundi. Nuk ka kohë të caktuar të parazgjedhur. Variabli i veçantë "timeout" (përdoret nga komanda pritëse) nuk ka ndikim në këtë kohë.

Për shembull, deklarata e mëposhtme mund të përdoret për të autologuar përdorues që nuk kanë shkruar ndonjë gjë për një orë, por që ende marrin mesazhe të shpeshta të sistemit:

bashkëveproni -input $ user_spawn_id timeout 3600 return-output \ $ spawn_id

Nëse modeli është fjalia null dhe nulls lejohen (nëpërmjet command remove_nulls ), trupi korrespondues ekzekutohet nëse një ASCII e vetme 0 përputhet. Nuk është e mundur që të përputhen me 0 bytes nëpërmjet modeleve glob ose regexp.

Parashtrimi i një modeli me flag- iwrite shkakton variablën interact_out (spawn_id) që do të vendoset në spawn_id që përputhet me modelin (ose eof).

Veprime të tilla si thyerja dhe vazhdimi i strukturave të kontrollit të shkaktojnë (dmth. Për proc ) të sillen në mënyrën e zakonshme. Megjithatë shkaqet e kthimit bashkëveprojnë për t'u kthyer tek telefonuesi i saj, ndërkohë që ndërhyrjet ndërvepruese bashkëveprojnë për të shkaktuar një kthim në telefonuesin e tij. Për shembull, nëse "proc foo" quhet ndërveprim dhe pastaj ekzekutohet veprimi inter_return , proc foo do të kthehej. (Kjo do të thotë që nëse bashkëveprimi quan përkthyesit interaktivisht shtypja e kthimit do të shkaktojë bashkëveprimin të vazhdojë, ndërkohë që inter_return do të shkaktojë bashkëveprimin të kthehet te telefonuesi i tij.)

Gjatë ndërveprimit , modaliteti i papërpunuar përdoret në mënyrë që të gjitha karakteret të kalojnë në procesin aktual. Nëse procesi aktual nuk kap sinjalet e kontrollit të punës, ajo do të ndalet nëse dërgon një sinjal ndalimi (në parazgjedhje ^ Z). Për ta rifilluar atë, dërgoni një sinjal të vazhduar (siç është "vrisni -CONT"). Nëse vërtet dëshironi të dërgoni një SIGSTOP në një proces të tillë (nga ^ Z), konsideroni fillimisht csh hapjen dhe pastaj drejtimin e programit tuaj. Nga ana tjetër, nëse dëshironi të dërgoni një SIGSTOP të presin vetë, përktheni thirrjen e parë (ndoshta duke përdorur një karakter largimi) dhe shtypni ^ Z.

Çiftet e string-trupit mund të përdoren si një stenografi për të shmangur që duhet të hyjnë në interpretues dhe të ekzekutojnë komandat në mënyrë interaktive. Modaliteti i mëparshëm i terminalit përdoret ndërsa trupi i një palë string-trup është duke u ekzekutuar.

Për shpejtësinë, veprimet kryhen në mënyrë të papërpunuar sipas parazgjedhjes. Blloku -reset rivendos terminalin në mënyrën që kishte para se bashkëveprimi të ekzekutohej (pa ndryshim, mënyra e gatuar). Vini re se karakteret e huaja kur moda po ndizet mund të humbet (një tipar fatkeqësues i shoferit të terminalit në disa sisteme). Arsyeja e vetme për të përdorur -reset është nëse veprimi juaj varet nga futja në regjimin e gatuar.

Flamuri -echo dërgon karaktere që përputhen me modelin e mëposhtëm prapa në procesin që i gjeneroi kur secili person lexohet. Kjo mund të jetë e dobishme kur përdoruesi ka nevojë të shikojë reagimet nga modelet pjesërisht të shtypura.

Nëse një model po jehon, por përfundimisht nuk arrin të përputhet, personazhet dërgohen në procesin e lindur. Nëse procesi i hedhur pas i bën jehonë, përdoruesi do të shohë dy personazhet. -echo është ndoshta i përshtatshëm vetëm në situata ku përdoruesi nuk ka gjasa të mos plotësojë modelin. Për shembull, fragmenti i mëposhtëm është nga rftp, skriptin rekursiv-ftp, ku përdoruesi kërkohet të futë ~ g, ~ p, ose ~ l, për të marrë, vendosur ose lista në dosjen aktuale në mënyrë rekursive. Këto janë aq larg nga komandat normale të ftp, se përdoruesi nuk ka gjasa të shkruajë ~ ndjekur nga ndonjë gjë tjetër, përveç gabimisht, në të cilin rast, ata ndoshta do të injorojnë rezultatin gjithsesi.

ndërveprojnë {-echo ~ g {getcurdirectory 1} -echo ~ l {getcurdirectory 0} -echo ~ p {putcurdirectory}}

Flamuri -nobuffer dërgon karaktere që përputhen me modelin e mëposhtëm në procesin e nxjerrjes kur karakteret lexohen.

Kjo është e dobishme kur doni të leni një program që e bën prapë modelin. Për shembull, mund të përdoren këto për të monitoruar se ku një person është i thirrur (një modem i stilit Hayes). Çdo herë "atd" është parë script shkrimet pjesën tjetër të linjës.

proc lognumber {} {interact -nobuffer -re "(. *) kthimi vendos $ log" [orën format [orë sekonda]]: dialed $ interact_out (1, string) "} ndërveprojnë -nobuffer" atd "lognumber

Gjatë ndërveprimit , përdorimi i mëparshëm i log_user është injoruar. Në veçanti, bashkëveprimi do të detyrojë outputin e tij të regjistrohet (dërgohet në prodhimin standard) pasi pretendohet se përdoruesi nuk dëshiron të ndërveprojë në mënyrë të verbër.

-O flamuri shkakton çdo palë kyçe të trupit të mëposhtëm që do të aplikohen në prodhimin e procesit aktual. Kjo mund të jetë e dobishme, për shembull, kur merret me hostët që dërgojnë karaktere të padëshiruar gjatë një sesioni telnet.

Si parazgjedhje, ndërveprimi pret që përdoruesi të shkruajë stdin dhe të lexojë stdout të vetë procesit të Pritni . Flamuri -u (për "përdorues") bën ndërveprimin të kërkojë përdoruesit si proces të emëruar nga argumenti i tij (i cili duhet të jetë një ID i prodhuar).

Kjo lejon që dy procese të palidhura të bashkohen së bashku pa përdorur një lak të qartë. Për të ndihmuar në debugging, Expect diagnostics gjithmonë shkoni në stderr (ose stdout për informacione të caktuara për prerje dhe debugging). Për të njëjtën arsye, komanda e përkthyesit do të lexojë në mënyrë interaktive nga stdin.

Për shembull, fragmenti i mëposhtëm krijon një proces identifikimi. Pastaj ai zgjedh përdoruesin (nuk shfaqet) dhe më në fund lidh të dy së ​​bashku. Natyrisht, çdo proces mund të zëvendësohet për identifikimin. Një predhë, për shembull, do të lejonte përdoruesin të punonte pa dhënë një llogari dhe fjalëkalim.

spawn login set hyrje $ spawn_id spawn tip modem # dial kthehuni tek përdoruesi # lidheni përdoruesin për të identifikuar ndërveprojnë -u $ login

Për të dërguar prodhime në procese të shumta, listoni çdo listë të idesë së spawn para një flamuri dalje . Inputet për një grup të ID-ve të prodhimit të prodhimit mund të përcaktohen nga një listë identifikimi për pluhura të parapërcaktuar me një flamur të hyrjes . (Të dy hyrja dhe dalja mund të marrin listat në të njëjtën formë si flamuri i -i në komandën e pritshme , përveç se any_spawn_id nuk ka kuptim në bashkëveprimin .) Të gjitha flamujt dhe vargjet e mëposhtme zbatohen në këtë input deri në një tjetër - shfaqet flamuri i hyrjes. Nëse nuk shfaqet një hyrje , -output nënkupton "-input $ user_spawn_id-output". (Në mënyrë të ngjashme, me modelet që nuk kanë -input .) Nëse një input është specifikuar, ajo anashkalon $ user_spawn_id. Nëse specifikohet një hyrje e dytë, ajo anashkalon $ spawn_id. Mund të specifikohen flamuj shtesë të hyrjes .

Të dy proceset e nënkuptuara të futjes së parazgjedhur kanë rezultatet e tyre të specifikuara si $ spawn_id dhe $ user_spawn_id (në të kundërt). Nëse shfaqet një flamur me hyrje pa flamur me dalje , karakteret nga ai proces hidhen poshtë.

Flamuri i -i paraqet një zëvendësim për spawn_id aktuale kur nuk përdoren flamuj të tjerë- hyrje ose dalje . Flamuri A-i nënkupton një flamur-o.

Është e mundur që të ndryshohen proceset me të cilat po ndërveprojnë duke përdorur ids indirekte për pjekje. (Ids indirekt spawn janë përshkruar në seksionin mbi komandën pritshme.) Ids indirekt spawn mund të specifikohen me flamuj -i, -u, -input ose -output.

interpretues [args]
shkakton që përdoruesi të nxitet interaktive për komandat Expect dhe Tcl. Rezultati i secilit komandë shtypet.

Veprime të tilla si thyerja dhe vazhdimi i strukturave të kontrollit të shkaktojnë (dmth. Për proc ) të sillen në mënyrën e zakonshme. Sidoqoftë kthimi shkakton përkthyesin që të kthehet në telefonuesin e tij, ndërkohë që inter_resurn shkakton përkthyesin të shkaktojë një kthim në telefonuesin e tij. Për shembull, nëse "proc foo" quhet interpretues i cili pastaj ekzekutoi veprimin inter_return , proc foo do të kthehej. Çdo komandë tjetër shkakton përkthyesin që të vazhdojë të nxisë komandat e reja.

Sipas parazgjedhjes, e shpejtë përmban dy numra të plotë. Numri i plotë i parë përshkruan thellësinë e grumbullimit të vlerësimit (dmth., Sa herë është thirrur Tcl_Eval). Numri i plotë i dytë është identifikuesi i historisë Tcl. E menjëhershme mund të caktohet duke përcaktuar një procedurë të quajtur "prompt1", vlera e kthimit e të cilit bëhet e shpejtë e ardhshme. Nëse një deklaratë ka kuota të hapura, parens, formatimin e teksteve, ose kllapa, një rresht sekondar (me parazgjedhje "+>") lëshohet me linjë të re. E shpejtë sekondare mund të vendoset duke përcaktuar një procedurë të quajtur "prompt2".

Gjatë përkthyesit përdoret modaliteti i gatuar, edhe nëse thirrësi i tij po përdorte regjimin e papërpunuar.

Nëse stdin është i mbyllur, përkthyesi do të kthehet nëse nuk përdoret flamuri i flamurit, në të cilin rast thirret argumenti i mëpasshëm.

log_file [args] [[-a] skedar]
Nëse një emër i skedarit është dhënë, log_file do të regjistrojë një transkript të sesionit (duke filluar nga ajo pikë) në skedar. log_file do të ndalojë regjistrimin nëse nuk jepet asnjë argument. Çdo skedar i mëparshëm i skedarit është i mbyllur.

Në vend të një emri i skedarit, mund të sigurohet një identifikues i skedarit Tcl duke përdorur flamujt -open ose -leaveopen . Kjo është e ngjashme me komandën e spawn . (Shihni pjelle per me shume informacion.)

A-forcat e flamurit prodhojnë për t'u regjistruar që u shtyp nga komanda log_user .

Si parazgjedhje, komanda log_file shton skedarët e vjetër në vend të shkurorëzimit të tyre, për lehtësinë e të qënit në gjendje të fiken dhe më shumë herë në një sesion. Për të copëtuar skedarët, përdorni flamurin -joendoj .

Flag - info shkakton log_file për të kthyer një përshkrim të argumenteve më të fundit jo-info dhënë.

log_user -info | 0 | 1
Si parazgjedhje, dialogu dërgoni / presin regjistrohet në stdout (dhe një logfile nëse është i hapur). Regjistrimi në stdout është i çaktivizuar me komandën "log_user 0" dhe riaktivizohet nga "log_user 1". Logging në logfile është i pandryshuar.

Flag - info shkakton log_user për të kthyer një përshkrim të argumenteve më të fundit jo-info dhënë.

match_max [-d] [-i spawn_id] [madhësia]
përcakton madhësinë e tamponit (në bytes) të përdorura brenda vendit nga presioni . Me asnjë argument të madhësisë , madhësia aktuale kthehet.

Me flamurin -d , vendoset madhësia e parazgjedhur. (Parazgjedhja fillestare është 2000.) Me flamurin -i , madhësia përcaktohet për emrin e emërit spawn, përndryshe është caktuar për procesin aktual.

mbivendosje [- # spawn_id] [- # spawn_id] [...] program [args]
ekzekuton "program args" në vend të programit të pritur aktual, i cili përfundon. Një argument i zhveshur i shtyllave shtyn një germë përpara emrit të komandës sikur të ishte një shell login. Të gjitha spawn_ids janë të mbyllura përveç atyre që quhen argumente. Këto janë të përcaktuara në identifikuesit e skedarëve të emëruar.

Spawn_ids janë mapuar të identifikojnë skedarët për programin e ri për të trashëguar. Për shembull, vija në vijim kryen shahun dhe lejon që ajo të kontrollohet nga procesi aktual - për shembull, një master shahu.

mbivendosje -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id shah

Kjo është më efikase se "ndërveproni -u", megjithatë, ai sakrifikon aftësinë për të bërë bashkëveprimin e programuar meqë procesi i Pritjes nuk është më në kontroll.

Vini re se nuk ofrohet terminali kontrollues. Kështu, nëse shkyçni ose rihapni inputin standard, programet që bëjnë kontrollin e punës (predha, hyrja, etj) nuk do të funksionojnë si duhet.

pariteti [-d] [-i spawn_id] [vlera]
përcakton nëse barazia duhet të ruhet ose të hiqet nga prodhimi i proceseve të pjellura. Nëse vlera është zero, barazimi është zhveshur, përndryshe nuk është i zhveshur. Me asnjë argument vlerash , vlera e tanishme kthehet.

Me flamurin -d , vlera e paritetit e parazgjedhur është vendosur. (Parazgjedhja fillestare është 1, dmth, pariteti nuk është zhveshur.) Me flamurin -i , vlera e paritetit është vendosur për idin e emërit të emëruar, përndryshe është caktuar për procesin aktual.

hiqni_nulls [-d] [-i spawn_id] [vlera]
përcakton nëse nulls mbahen ose hiqen nga prodhimi i proceseve të pjellura përpara përputhjes së modelit ose ruajtjes në variablin expect_out ose interact_out . Nëse vlera është 1, nullat hiqen. Nëse vlera është 0, nullat nuk hiqen. Me asnjë argument vlerash , vlera e tanishme kthehet.

Me flamurin -d , vlera e parazgjedhur është vendosur. (Parazgjedhja fillestare është 1, dmth, nullat janë hequr.) Me -i flag, vlera është vendosur për idën e emërit të emëruar, përndryshe është caktuar për procesin aktual.

Nëse nullat janë hequr ose jo, Pritni do të regjistrojë null bytes në log dhe stdout.

dërgoni string [-flags]
Dërgon vargunprocesin aktual. Për shembull, komanda

dërgoni "hello world \ r"

dërgon personazhet, helloworld në procesin aktual. (Tcl përfshin një komandë printf- like (të quajtur format ) që mund të ndërtojë vargje komplekse komplekse.)

Figurët dërgohen menjëherë edhe pse programet me hyrje të bufferuar në linja nuk do të lexojnë karakteret derisa të dërgohet një karakter kthimi. Karakteri i kthimit shënohet "\ r".

Flamuri e detyron argumentin e ardhshëm që të interpretohet si një varg dhe jo një flamur. Çdo varg mund të paraprihet nga "-" nëse duket apo nuk duket si një flamur. Kjo siguron një mekanizëm të besueshëm për të specifikuar vargjet e ndryshueshme pa u marrë nga ata që rastësisht duken si flamuj. (Të gjitha vargjet që fillojnë me "-" rezervohen për opsionet e ardhshme.)

Flamuri i -i deklaron që vargu do të dërgohet te spawn_id i quajtur. Nëse spawn_id është user_spawn_id dhe terminali është në modalitetin e papërpunuar, vijat e reja në vargun janë përkthyer në sekuencat e kthimit-newline në mënyrë që ato të shfaqen sikur terminali të ishte në regjimin e gatuar. Flamuri i flamurit e çaktivizon këtë përkthim.

Flamuri -null i dërgon karaktere zero (0 bytes). By default, një null është dërguar. Një numër i plotë mund të ndjekë -nullin për të treguar sa nulls duhet të dërgohen.

Flamuri i shkeljes gjeneron një gjendje pushimi. Kjo ka kuptim vetëm në qoftë se ID spawn i referohet një pajisje tty hapur përmes "spawn-hap". Nëse keni pjellë një proces të tillë si tip, duhet të përdorni konventën e tipit për të gjeneruar një pushim.

Forcat e flamurit -s do të dalin që të dërgohen "ngadalë", duke shmangur kështu situatën e zakonshme kur një kompjuter nxjerr një tampon hyrjeje që është projektuar për një njeri që nuk do të zgjaste kurrë të njëjtin tampon . Ky output kontrollohet nga vlera e variablës "send_slow" e cila merr një listë dy elementësh. Elementi i parë është një numër i plotë që përshkruan numrin e bytes për të dërguar në mënyrë atomike. Elementi i dytë është një numër i vërtetë që përshkruan numrin e sekondave me të cilat dërgohen atomike duhet të ndahen. Për shembull, "set send_slow {10 .001}" do të detyronte "send -s" për të dërguar vargjet me 1 milisekonda në mes të çdo 10 personave të dërguar.

Forcat e fluturimit -h do të dërgohen (disi) si një njeri i vërtetë duke shtypur. Vonesa njerëzore shfaqen mes personazheve. (Algoritmi bazohet në shpërndarjen Weibull, me modifikime që i përshtaten këtij aplikacioni të veçantë.) Ky output kontrollohet nga vlera e ndryshores "send_human" që merr një listë pesë elementësh. Dy elementet e para janë koha mesatare e karaktereve në sekonda. E para është përdorur nga default. E dyta përdoret në përfundimet e fjalëve, për të simuluar pushimet delikate që ndodhin herë pas here në këto tranzicion. Parametri i tretë është një masë ndryshueshmërie ku .1 është mjaft e ndryshueshme, 1 është mjaft e ndryshueshme dhe 10 është mjaft e pandryshueshme. Ekstremet janë 0 deri në pafundësi. Dy parametrat e fundit janë, respektivisht, një kohë minimale dhe maksimale interarrival. Minimumi dhe maksimumi përdoren për herë të fundit dhe "clip" kohën e fundit. Mesatarja e fundit mund të jetë mjaft e ndryshme nga mesatarja e dhënë nëse vlerat minimale dhe maksimale të klipeve janë të mjaftueshme.

Si shembull, komanda e mëposhtme emulon një daktilograf të shpejtë dhe të qëndrueshëm:

set send_human {.1 .3 1 .05 2} dërgoni -h "Unë jam i uritur. Le të bëjmë drekë."

ndërsa këto mund të jenë më të përshtatshme pas një hangover:

set send_human {.4 .2 .2 .5 100} dërgoni -h "Partia e mirë e partisë së mirë!"

Vini re se gabimet nuk simulohen, edhe pse mund të vendosni vetë situatat e korrigjimit të gabimeve duke futur gabime dhe korrigjime në një argument dërgimi.

Flamujt për dërgimin e karaktereve zero, për dërgimin e pushimeve, për detyrimin e prodhimit të ngadaltë dhe për prodhimin e stilit njerëzor janë reciprokisht ekskluzive. Do të përdoret vetëm ajo e specifikuar e fundit. Për më tepër, nuk mund të specifikohet asnjë argument string me flamuj për dërgimin e karaktereve ose thyenave zero.

Është një ide e mirë t'i parapriheni dërgimit të parë në një proces nga një shpresë . presin që do të presë që procesi të fillojë, ndërsa dërgimi nuk mundet. Në veçanti, nëse dërgimi i parë përfundon përpara se procesi të fillojë të ekzekutohet, ju rrezikoni të keni injoruar të dhënat tuaja. Në situatat ku programet interaktive nuk ofrojnë asnjë fillim fillestar, mund t'i parapriheni dërgimit me vonesë si në:

# Për të mos dhënë hackers lë të kuptohet se si të thyejnë, # ky sistem nuk bën thirrje për një fjalëkalim të jashtëm. # Prisni për 5 sekonda për exec për të përfunduar spawn telnet very.secure.gov gjumë 5 dërgoni fjalëkalimin

exp_send është një alias për dërgimin. Nëse përdorni Expectk ose ndonjë variant tjetër të Pritni në mjedisin Tk, dërgimi përcaktohet nga Tk për një qëllim krejt tjetër. exp_send është siguruar për pajtueshmërinë mes mjediseve. Aliases të ngjashme janë dhënë për komandat e tjera të dërgimit të tjerë të Pritshëm.

send_error [-flags] string
është si dërgoni , përveç se prodhimi është dërguar në stderr dhe jo në procesin aktual.

send_log [-] varg
është si dërgimi , përveç se vargu dërgohet vetëm në skedarin e logaritmit (shih log_file .) Argumentet shpërfillen nëse nuk është hapur skedari i skedarit.

send_tty [-flags] string
është si dërgoni , përveç se output-i është dërguar në / dev / tty dhe jo në procesin aktual.

send_user [-flags] string
është si dërgimi , përveç se prodhimi është dërguar në stdout dhe jo në procesin aktual.

gjumi sekonda
shkakton shkrimin të fle për numrin e dhënë të sekondave. Sekondat mund të jenë një numër decimal. Interrupts (dhe ngjarjet Tk nëse jeni duke përdorur Expectk) janë përpunuar ndërsa presin fle.

spawn program [args] [args]
krijon një proces të ri duke "program args". Stdin, stdout dhe stderr e tij janë të lidhura me Presin, në mënyrë që ato të mund të lexohen dhe të shkruhen nga komanda të tjera të Pritni . Lidhja është thyer nga afër ose nëse vetë procesi mbyll ndonjë nga identifikuesit e skedarit.

Kur një proces fillon nga pjellemi , spawn_id ndryshueshme është vendosur në një përshkrues që i referohet atij procesi . Procesi i përshkruar nga spawn_id konsiderohet " procesi aktual ". spawn_id mund të lexohet ose të shkruhet, në fakt siguron kontrollin e punës.

user_spawn_id është një ndryshore globale që përmban një përshkrues që i referohet përdoruesit. Për shembull, kur spawn_id është vendosur në këtë vlerë, prisni sillet si expect_user .

.I error_spawn_id është një ndryshore globale që përmban një përshkrues i cili i referohet gabimit standard. Për shembull, kur spawn_id është vendosur në këtë vlerë, dërgoni sillet si send_error .

tty_spawn_id është një ndryshore globale që përmban një përshkrues që i referohet / dev / tty. Nëse / dev / tty nuk ekziston (si në një script në cron, at ose batch), atëherë tty_spawn_id nuk është definuar. Kjo mund të testohet si:

nëse {{info {tty_spawn_id}} {# / dev / tty ekziston} tjetër {# / dev / tty nuk ekziston # ndoshta në cron, batch ose në script}

spawn kthen ID-në e procesit UNIX. Nëse nuk prodhohet asnjë proces , kthehet 0. Ndryshorja spawn_out (skllavi, emri) është vendosur në emër të pajisjes skllavë të pty.

Në parazgjedhje, pjellemi i bën jehonë emrit të komandës dhe argumenteve. Flamuri- noecho ndalon pjellem per te bere kete.

Flamuri i konsolës shkakton që produkti i konsolës të ridrejtohet në procesin e lindjes . Kjo nuk mbështetet në të gjitha sistemet.

Brenda, spawn përdor një pty, inicializohet në të njëjtën mënyrë si tty e përdoruesit. Kjo është inicializuar më tej në mënyrë që të gjitha cilësimet të jenë "të shëndetshme" (sipas stty (1)). Nëse variabli stty_init është përcaktuar, ai interpretohet në stilin e argumenteve stty si konfigurim i mëtejshëm. Për shembull, "vendosja e stty_init raw" do të shkaktojë që terminalet e proceseve të pjalmuara të fillojnë në regjimin e papërpunuar. -nottycopy kalon inicializimin bazuar në tty të përdoruesit. -nottyinit kalon inicializimin "të arsyeshëm".

Normalisht, pemët kërkojnë pak kohë për të ekzekutuar. Nëse vëreni pjella duke marrë një sasi të konsiderueshme të kohës, ndoshta po hasni ptys që janë të ngjitura. Një numër i testeve janë drejtuar në ptys për të shmangur pengesat me proceset e gabuara. (Këto marrin 10 sekonda për pty.) Running Expect me opsionin -d do të tregojë nëse presin që hasni shumë ptys në gjendje të çuditshme. Nëse ju nuk mund të vrasin proceset në të cilat këto ptys janë bashkangjitur, rekurs i juaj i vetëm mund të jetë për të ristartoni.

Nëse programi nuk mund të lindë me sukses sepse exec (2) dështon (p.sh. kur programi nuk ekziston), një mesazh gabimi do të kthehet nga ndërveprimi tjetër ose do të presë komandën sikur programi të kishte drejtuar dhe të prodhonte mesazhin e gabimit si dalje. Kjo sjellje është një pasojë e natyrshme e zbatimit të pjellem . Brenda vendit, pirgjet e mishit, pas së cilës procesi i pjellur nuk ka asnjë mënyrë për të komunikuar me procesin e pritjes origjinale , përveçse nëpërmjet komunikimit nëpërmjet spawn_id.

Flamuri -open shkakton argumentin e ardhshëm që do të interpretohet si një identifikues i skedarit Tcl (dmth., I kthyer nga i hapur .) Id idesë mund pastaj të përdoret sikur të ishte një proces i lindur. (Nuk duhet të përdoret identifikuesi i skedarit.) Kjo ju lejon të trajtoni pajisjet e papërpunuara, skedarët dhe tubacionet si procese të lindura pa përdorur një pty. 0 është kthyer për të treguar se nuk ka proces të lidhur. Kur lidhja me procesin e pjelljes mbyllet, ashtu është edhe identifikuesi i skedarit Tcl. Flamuri i fluturimit është i ngjashëm me hapjen, përveç se -leaveopen shkakton identifikuesin e skedarit që të lihet i hapur edhe pas mbylljes së idit të pjellem.

Flamuri i shigjetës shkakton hapjen e një pty , por nuk ka prodhuar asnjë proces . 0 është kthyer për të treguar se nuk ka proces të lidhur. Spawn_id është vendosur si zakonisht.

Ndryshori spawn_out (rob, fd) është vendosur në një identifikues skedari që korrespondon me skllavin pty. Mund të mbyllet duke përdorur "mbyllje të ngushtë".

Flamuri i emrit emërton një sinjal që duhet injoruar në procesin e lindjes . Përndryshe, sinjalet marrin sjelljen e paracaktuar. Sinjalet emërohen si në komandën e kurthit , përveç se çdo sinjal kërkon një flamur të veçantë.

nivelin e strace
shkakton deklaratat e mëposhtme për t'u shtypur para se të ekzekutohet. (Niveli i gjurmëve të komandës së gjurmëve të Tcl-it). Tregon se sa larg poshtë në raftin e thirrjeve për të gjurmuar. Për shembull, komanda e mëposhtme shkon Pritni gjatë gjetjes së 4 niveleve të para të thirrjeve, por asnjë më poshtë kësaj.

presin -c "strace 4" script.exp

Flag - info shkakton strace për të kthyer një përshkrim të argumenteve më të fundit jo-info dhënë.

args stty
ndryshon mënyrat e terminalit në mënyrë të ngjashme me komandën e jashtme stty.

Në parim, arrihet terminali kontrollues. Terminale të tjera mund të arrihen duke shtuar "Kërkesat për kthimin e statusit si rezultat i komandës .Nëse nuk kërkohet status dhe terminalit kontrollues arrihet, statusi i mëparshëm i atributeve të para dhe echo kthehen në një formë që më vonë mund të jetë përdoret nga komanda.

Për shembull, argumentet e papërpunuara ose të gatuara vënë terminalin në modalitetin e papërpunuar. Argumentet -çart ose gatuar e vendosin terminalin në mënyrë të gatuar. Argumentet echo dhe -echo vënë terminali në echo dhe noecho mode respektivisht.

Shembulli i mëposhtëm ilustron si ta çaktivizoni përkohësisht jehonën. Kjo mund të përdoret në skripta të tjera automatike për të shmangur futjen e fjalëkalimeve në to. (Shihni më shumë diskutime për këtë nën NDRYSHIMIN E HIPOTIT më poshtë.)

stty -echo send_user "Fjalëkalimi:" expect_user -re "(. *) \ n" vendos fjalëkalimin $ expect_out (1, string) stty echo

sistemi args
jep args për sh (1) si input, sikur të ishte shtypur si një komandë nga një terminal. Prisni prisni derisa skeleti përfundon. Statusi i kthimit nga sh trajtohet njësoj si exec që merret me statusin e kthimit.

Në kontrast me exec që përcjell stdin dhe stdout në script, sistemi kryen asnjë ridrejtim (përveç asaj që tregohet nga vetë vargu). Kështu, është e mundur që të përdoren programe të cilat duhet të flasin direkt me / dev / tty. Për të njëjtën arsye, rezultatet e sistemit nuk regjistrohen në regjistër.

afati kohor [args]
e kthen një kohë. Pa argumente, numri i sekondave që nga epoka është kthyer.

Formati -format paraqet një varg i cili është kthyer, por me zëvendësimet e bëra sipas rregullave POSIX për strftime. Për shembull% a zëvendësohet me një emër të shkurtuar të ditëve të javës (dmth., Sat). Të tjerët janë:

% një emër të shkurtuar të ditëve të javës% Emër të plotë të ditëve të javës% b shkurtim i emrit të muajit% B emri i plotë muaj% c data-ora si në: Wed Oct 6 11:45:56 1993% d dita e muajit (01-31% H orë (00-59)% p am ose pm% S sekonda (00-61)% I orë (01-12)% j ditë (001-366)% m muaj (01-12) % u ditë (1-7, e hëna është dita e parë e javës)% U javë (00-53, e diela e parë është dita e parë e javës së parë)% V javë (01-53, stili ISO 8601) 6)% W javë (00-53, e hëna e parë është dita e parë e javës së parë)% x data-ora si në: Wed Oct 6 1993% Koha X në: 23:59:59% y vit (00-99) % Y viti si në: 1993% Z zonën kohore (ose asgjë nëse nuk është e përcaktueshme) %% një shenjë të paekshapur

Specifikimet e tjera të% janë të padefinuara. Karaktere të tjera do të kalojnë përmes paprekur. Vetëm lokalet C mbështeten.

Flamuri i sekuencave fut disa sekonda që epoka të përdoret si burim nga i cili të formatizohet . Përndryshe, përdoret koha aktuale.

Blloku -gmt forcat shtyjnë afatin kohor për të përdorur orën GMT . Pa flamur, përdoret zona kohore lokale.

kurth [[command] sinjale]
shkakton komandën e dhënë që të ekzekutohet pas marrjes së ardhshme të ndonjë prej sinjaleve të dhëna. Komanda ekzekutohet në fushën globale. Nëse komanda mungon, veprimi i sinjalit kthehet. Nëse komanda është vargu SIG_IGN, sinjalet shpërfillen. Nëse komanda është vargu SIG_DFL, sinjalet janë rezultat i parazgjedhur i sistemit. sinjalet janë ose një sinjal i vetëm ose një listë e sinjaleve. Sinjalet mund të specifikohen numerikisht ose simbolikisht sipas sinjalit (3). Prefixja "SIG" mund të hiqet.

Me asnjë argument (ose argument-numër), kurthi kthen numrin e sinjalit të komandës së kurthit që po ekzekutohet aktualisht.

Kodi-kodi përdor kodin e kthimit të komandës në vend të cilësdo kod Tcl ishte gati të kthehej kur komanda fillimisht filloi të vraponte.

Flamuri i ndërfaqes shkakton që komanda të vlerësohet duke përdorur përkthyesin aktiv në kohën kur komanda filloi të funksiononte dhe jo kur u deklarua kurthi.

Flamuri i emrit shkakton komandën e kurthit të kthejë emrin e sinjalit të komandës së kurthit që po ekzekutohet aktualisht.

Flamuri -max shkakton komandën e kurthit të kthejë numrin më të madh të sinjaleve që mund të vendosen.

Për shembull, komanda "trap {send_user" Ouch! "} SIGINT" do të shtypë "Ouch!" çdo herë që përdoruesi shtyp ^ C.

By default, SIGINT (i cili zakonisht mund të gjenerohet duke shtypur ^ C) dhe SIGTERM shkaktojnë Prisni të dalë. Kjo është për shkak të kurthit të mëposhtëm, i krijuar me parazgjedhje kur Pritni fillon.

dalje trap {SIGINT SIGTERM}

Nëse përdorni flamurin -D për të nisur debugger, SIGINT është ridefinuar për të filluar debugger interaktive. Kjo është për shkak të kurthit në vijim:

kurth {exp_debug 1} SIGINT

Kurthi i debugger mund të ndryshohet duke vendosur variablin e mjedisit EXPECT_DEBUG_INIT në një komandë të re kurth.

Natyrisht, mund të anashkaloni të dyja këto vetëm duke shtuar komandat e kurthit në skenarin tuaj. Në veçanti, nëse keni "SIGINT" daljen nga kurthi, kjo do të anashkalojë kurthin e debugger. Kjo është e dobishme në qoftë se ju doni të parandaloni përdoruesit të hyjnë në debugger fare.

Nëse doni të përcaktoni kurthin tuaj në SIGINT, por ende kurthoheni te debugger kur ajo është në punë, përdorni:

nëse {! [exp_debug]} {trap mystuff SIGINT}

Përndryshe, mund të kesh kurth tek debugger duke përdorur ndonjë sinjal tjetër.

kurth nuk do t'ju lejojë të anashkaloni veprimin për SIGALRM pasi kjo është përdorur brenda në Expect . Komanda shkëputje e vendos SIGALRM në SIG_IGN (injoro). Ju mund ta rifitoni këtë për aq kohë sa ta çaktivizoni gjatë komandave të mëvonshme të spawn.

Shikoni sinjal (3) për më shumë informacion.

prisni [args]
vonesat derisa të përfundojë një proces i prodhuar (ose procesi aktual nëse nuk është emëruar) përfundon.

prit normalisht kthimin e një liste prej katër integers. Numri i plotë i parë është ideja e procesit që pritej. Numri i plotë i dytë është id përkatës i spawn. Numri i plotë i tretë është -1 nëse ndodh një gabim i sistemit operativ, ose 0 ndryshe. Nëse numri i plotë i tretë ishte 0, numri i plotë i katërt është statusi i kthyer nga procesi i pjellur. Nëse numri i plotë i tretë ishte -1, numri i katërt është vlera e gabimit të vendosur nga sistemi operativ. Gabimi global i ndryshorit është vendosur gjithashtu.

Elementet shtesë mund të shfaqen në fund të vlerës së kthimit nga pritja . Një element i pestë opsional identifikon një klasë informacioni. Aktualisht, vlera e vetme e mundshme për këtë element është FËMIJË, me ç'rast dy vlerat e ardhshme janë emri i sinjalit të stilit C dhe një përshkrim i shkurtër tekstual.

Flamuri -i deklaron procesin të presë që korrespondon me emrin spawn_id (NUK ID e procesit ). Brenda një mbajtësi SIGCHLD, është e mundur të presësh për çdo proces të pjellë duke përdorur ID-në e pjesshme -1.

Flamuri i ndezur shkakton pritje për t'u kthyer menjëherë me treguesin e një presioni të suksesshëm. Kur procesi të dalë (më vonë), ai automatikisht do të zhduket pa nevojën për një pritje të qartë.

Komanda e pritjes mund të përdoret gjithashtu të presë për një proces të pandryshuar duke përdorur argumentet "-i -1". Ndryshe nga përdorimi i tij me proceset e lindura, ky komandë mund të ekzekutohet në çdo kohë. Nuk ka kontroll mbi se cili proces është korrur. Megjithatë, vlera e kthimit mund të kontrollohet për procesin id.

Bibliotekat

Expect automatikisht di rreth dy bibliotekave të ndërtuara për skedarët e Pritni. Këto janë përcaktuar nga direktoritë e emërtuara në variablat exp_library dhe exp_exec_library. Të dyja janë menduar të përmbajnë skedarë të shërbimeve që mund të përdoren nga skripta të tjera.

exp_library përmban skedarë të pavarur të arkitekturës. exp_exec_library përmban skedarë të varur nga arkitektura. Në varësi të sistemit tuaj, të dy drejtoritë mund të jenë plotësisht bosh. Ekzistenca e skedarit $ exp_exec_library / cat-buffers përshkruan nëse juaj / bin / cat zbrapsë parazgjedhje.

PRETTY-PRINTING

Një përkufizim vgrind është i disponueshëm për shtypjen e bukur Prisni skriptet. Duke supozuar që definicioni vgrind i furnizuar me shpërndarjen e Prisni është instaluar siç duhet, mund ta përdorni si:

skedar vgrind -lexpage

SHEMBUJ

Shumë prej tyre nuk mund të jenë të dukshme se si të vendosni gjithçka që faqja e njeriut përshkruan. Unë ju inkurajoj që të lexoni dhe provoni shembujt në dosjen e shembullit të shpërndarjes së Pritni . Disa prej tyre janë programe reale. Të tjerët thjesht ilustrojnë teknika të caktuara, dhe natyrisht, një çift janë hacks të shpejtë. Dosja INSTALL ka një pasqyrë të shpejtë të këtyre programeve.

Letrat e Pritni (shih SHIKO GJITHASHTU) janë gjithashtu të dobishme. Ndërsa disa letra përdorin sintaksë që korrespondojnë me versionet e mëparshme të Pritni, arsyet shoqëruese janë akoma të vlefshme dhe hyjnë në detaje shumë më të detajuara nga kjo faqe e njeriut.

Garanci

Zgjerimet mund të përplasen me emrat e komandave të Pritjes. Për shembull, dërgimi përcaktohet nga Tk për një qëllim krejt tjetër. Për këtë arsye, shumica e komandave të presin janë gjithashtu në dispozicion si "exp_XXXX". Komandat dhe variablat që fillojnë me "exp", "inter", "spawn" dhe "timeout" nuk kanë pseudonime. Përdorni emrat e komandës së zgjeruar nëse keni nevojë për këtë pajtueshmëri mes mjediseve.

Presin merr një pamje mjaft liberale të scoping. Në veçanti, variablave të lexuara nga komandat specifike për programin Expect do të kërkohet së pari nga fushëveprimi lokal dhe nëse nuk gjendet, në fushën globale. Për shembull, kjo e pengon nevojën për të vendosur "kohën e largët globale" në çdo procedurë që shkruani që përdor presin . Nga ana tjetër, variablat e shkruara janë gjithmonë në hapësirën lokale (përveç nëse një komandë "globale" është lëshuar). Problemi më i zakonshëm që kjo shkakton është kur pjellemi ekzekutohet në një procedurë. Jashtë procedurës, spawn_id nuk ekziston më, kështu që procesi i lindur nuk është më i arritshëm thjesht për shkak të qëllimit. Shtoni një "spawn_id global" në një procedurë të tillë.

Nëse nuk mund të aktivizoni aftësinë multispawning (dmth., Sistemi juaj nuk mbështet as zgjidhni (BSD *. *), Sondazhi (SVR> 2), as diçka ekuivalente), Pritni do të jetë në gjendje të kontrollojë një proces të vetëm në të njëjtën kohë. Në këtë rast, mos u përpiqni të vendosni spawn_id , as duhet të ekzekutoni procese nëpërmjet ekzekutimit, derisa po zhvillohet një proces spawned . Për më tepër, nuk do të mund të presësh nga proceset e shumta (duke përfshirë përdoruesin si një) në të njëjtën kohë.

Parametrat e terminalit mund të kenë një efekt të madh në skriptet. Për shembull, nëse një shkrim është shkruar për të kërkuar jehonë, ai do të keqtrajton nëse echo është fikur. Për këtë arsye, presin forcat e parametrave të arsyeshëm të terminalit nga default. Për fat të keq, kjo mund t'i bëjë gjërat të pakëndshme për programe të tjera. Si shembull, predha e emacs dëshiron të ndryshojë mappings "e zakonshme": newlines get mapped në newlines në vend të linelines kthesë-kthimit, dhe jehonë është e paaftë. Kjo lejon një të përdorë emacs për të redaktuar vijën e hyrjes. Fatkeqësisht, Pritni nuk mund ta imagjinoni këtë.

Ju mund të kërkoni që Presin të mos anashkalojë vendosjen e parazgjedhur të parametrave të terminalit, por duhet të jeni shumë të kujdesshëm kur shkruani skripta për mjedise të tilla. Në rastin e emacs, të shmangur varësisht nga gjërat si echoing dhe end-of-line mappings.

Komandat që pranuan argumentet e mbështetur në një listë të vetme (variantet pritëse dhe bashkëveprimi ) përdorin një heuristik për të vendosur nëse lista është në të vërtetë një argument ose shumë. Heuristika mund të dështojë vetëm në rastin kur lista në të vërtetë paraqet një argument të vetëm që ka shumë elementë të ngulitur \ n me karakter jo të bardhë ndërmjet tyre. Kjo duket mjaft e pamundur, megjithatë argumenti "-nobrace" mund të përdoret për të detyruar një argument të vetëm për t'u trajtuar si një argument i vetëm. Kjo ndoshta mund të përdoret me kodin Expect të gjeneruar nga makina. Në mënyrë të ngjashme, -brace detyron një argument të vetëm për tu trajtuar si modele / veprime të shumëfishta.

Bugs

Ishte me të vërtetë joshëse të emërosh programin "seks" (ose "Smart EXec" ose "Send-EXpect"), por mbizotëronte një kuptim i mirë (ose ndoshta vetëm puritani).

Në disa sisteme, kur një shell është pjellë, ajo ankohet për të mos qenë në gjendje për të hyrë në tty por shkon gjithsesi. Kjo do të thotë se sistemi juaj ka një mekanizëm për të fituar kontrollin që pret që nuk e di. Ju lutem gjeni se çfarë është, dhe ta dërgoni këtë informacion tek unë.

Ultrix 4.1 (të paktën versionet e fundit këtu) konsideron se kohëzgjatjet mbi 1000000 janë të barasvlefshme me 0.

Digital UNIX 4.0A (dhe ndoshta versionet e tjera) refuzon të ndajë ptys nëse përcaktoni një mbajtës SIGCHLD. Shikoni faqen e dhënë për më shumë informacion.

IRIX 6.0 nuk merret me lejet e pty saktë kështu që nëse Expect përpiqet të ndajë një pty përdorur më parë nga dikush tjetër, ajo dështon. Përmirëso në IRIX 6.1.

Telnet (verifikuar vetëm nën SunOS 4.1.2) varet nëse TERM nuk është vendosur. Ky është një problem nën cron, në dhe në cgi script, të cilat nuk përcaktojnë TERM. Kështu, duhet ta vendosni në mënyrë eksplicite - për çfarë lloji zakonisht është i parëndësishëm. Ajo thjesht duhet të vendoset në diçka! Në shumicën e rasteve, mjafton për sa më sipër.

vendosni env (TERM) vt100

Këshillë (e verifikuar vetëm nën BSDI BSD / OS 3.1 i386) varet nëse SHELL dhe HOME nuk janë vendosur. Ky është një problem nën cron , në dhe në cgi script, të cilat nuk përcaktojnë këto ndryshore të mjedisit. Kështu, ju duhet t'i vendosni ato në mënyrë eksplicite - për çfarë lloji zakonisht është i parëndësishëm. Ajo thjesht duhet të vendoset në diçka! Në shumicën e rasteve, mjafton për sa më sipër.

vendosni env (SHELL) / bin / sh vendosur env (HOME) / usr / local / bin

Disa implementime të ptys janë projektuar në mënyrë që kerneli hedh çdo dalje të palexuar pas 10 deri në 15 sekonda (numri aktual varet nga zbatimi) pasi procesi ka mbyllur përshkruesin e skedarit. Kështu priten programe të tilla si

datën spawn gjumi 20 presin

do të dështojë. Për të shmangur këtë, thërrisni programe jo-interaktive me ekzekutuesin sesa pjelle . Ndërsa situata të tilla janë të mundshme, në praktikë unë kurrë nuk kam hasur në një situatë në të cilën rezultati përfundimtar i një programi me të vërtetë interaktive do të humbiste për shkak të kësaj sjelljeje.

Nga ana tjetër, Cray UNICOS ptys hedh poshtë çdo dalje të palexuar menjëherë pasi procesi ka mbyllur skedarin e skedarit. Unë kam raportuar këtë për Cray dhe ata po punojnë për një rregullim.

Ndonjëherë kërkohet një vonesë ndërmjet një përgjigjeje të menjëhershme dhe një përgjigje, siç është kur një ndërfaqe tty ndryshon cilësimet e UART ose normat e baudit të përputhshme duke kërkuar copa të fillimit / ndalimit. Zakonisht, e gjithë kjo është e nevojshme që të fle për një të dytë ose dy. Një teknikë më e fuqishme është të përsëritet derisa pajisja të jetë gati për të marrë të dhëna. Shembulli i mëposhtëm përdor të dy strategjitë:

dërgoni "shpejtësinë 9600"; fle 1 presin {timeout {dërgoni "\ r"; exp_continue} $ prompt}

kurth -code nuk do të funksionojë me asnjë komandë që ulet në ciklin e ngjarjeve të Tcl-së, siç është gjumi. Problemi është se në ciklin e ngjarjes, Tcl hedh poshtë kodet e kthimit nga përpunuesit e ngjarjeve të async. Një zgjidhje e punës është të vendosni një flamur në kodin e kurthit. Pastaj kontrolloni flamurin menjëherë pas komandës (dmth. Fle).

Komanda e pritjes_background injoron argumentet e testimit dhe nuk ka konceptin e kohës së përgjithshme në përgjithësi.

& # 34; PREMTIMET E PRITSHME & # 34;

Ka disa gjëra rreth Pritni që mund të jetë jo intuitiv. Ky seksion përpiqet të adresojë disa nga këto gjëra me disa sugjerime.

Një problem i zakonshëm që pritet është se si të njohin kërkesat e shell. Meqë këto janë përshtatur ndryshe nga njerëz të ndryshëm dhe predha të ndryshme, rlogin automatikisht automatizues mund të jetë i vështirë pa e ditur shpejtësinë. Një konventë e arsyeshme është që përdoruesit të ruajnë një shprehje të rregullt që përshkruan shpejtësinë e tyre (në veçanti, fundin e saj) në variablin mjedisor EXPECT_PROMPT. Kodi si në vijim mund të përdoret. Nëse EXPECT_PROMPT nuk ekziston, kodi ende ka një shans të mirë për të funksionuar siç duhet.

set prompt "(% | # | \\ $) $"; # paracaktim i menjëhershëm i kapur {set prompt $ env (EXPECT_PROMPT)} presin -re $ prompt

Unë ju inkurajoj që të shkruani modele të pritshme që përfshijnë fundin e çdo gjëje që prisni të shihni. Kjo shmang mundësinë e përgjigjjes së një pyetjeje para se të shohë gjithë gjë. Përveç kësaj, ndërsa ju mund të jeni në gjendje t'u përgjigjeni pyetjeve para se t'i shihni ato tërësisht, nëse përgjigjeni herët, përgjigjja juaj mund të duket sërish në mes të pyetjes. Me fjalë të tjera, dialogu që rezulton do të jetë i saktë, por duken të fërguara.

Shumica e kërkesave përfshijnë një karakter hapësirë ​​në fund. Për shembull, ftesa nga ftp është 'f', 't', 'p', '>' dhe. Për të përputhur këtë rresht, duhet të llogaritni secilin prej këtyre shenjave. Është një gabim i zakonshëm që të mos përfshihet boshllëku. Vendos bosh në mënyrë eksplicite.

Nëse përdorni një model të formës X *, * do të përputhet me të gjithë outputin e marrë nga fundi i X në gjënë e fundit të marrë. Kjo tingëllon intuitive, por mund të jetë disi konfuze sepse fraza "gjëja e fundit e marrë" mund të ndryshojë në varësi të shpejtësisë së kompjuterit dhe përpunimit të I / O si nga kerneli dhe nga drejtuesi i pajisjes.

Në veçanti, njerëzit kanë tendencë të shohin daljen e programeve që vijnë në grupe të mëdha (në mënyrë atomike), kur në të vërtetë shumica e programeve prodhojnë një rresht në të njëjtën kohë. Duke supozuar se ky është rasti, * në modelin e paragrafit të mëparshëm mund të përputhet vetëm me fundin e linjës aktuale edhe pse duket të ketë më shumë, sepse në kohën e ndeshjes ishte e gjithë rezultati që ishte marrë.

presin që nuk ka asnjë mënyrë për të ditur se prodhimi i mëtejshëm po vjen nëse modeli juaj në mënyrë specifike nuk është përgjegjës për të.

Edhe në varësi të buffering orientuar nga linja është e pamatur. Jo vetëm që programet rrallë bëjnë premtime për llojin e buffering që bëjnë, por dispepsi i sistemit mund të thyejë linjat e prodhimit në mënyrë që linjat të thyejnë në vende në dukje të rastësishme. Kështu, në qoftë se ju mund të shprehni karakteret e fundit të një të shpejtë kur shkruani modelet, është e mençur ta bëni këtë.

Nëse jeni duke pritur një model në prodhimin e fundit të një programi dhe programi lëshon diçka tjetër, nuk do të mund ta dalloni atë me fjalën timeout . Arsyeja është se presin nuk do të kalojnë kohë - në vend të kësaj ajo do të marrë një tregues të eof . Përdoreni atë në vend. Edhe më mirë, përdorni të dyja. Në këtë mënyrë nëse kjo rresht është zhvendosur ndonjëherë, ju nuk do të keni nevojë të redaktoni vetë rreshtin.

Newlines zakonisht konvertohen në kthimin e karrocave, sekuencat linefeed kur dalin nga shoferi i terminalit. Kështu, nëse doni një model që në mënyrë eksplicite përputhet me dy linjat, nga, thuaj, printf ("foo \ nbar"), duhet të përdorni modelin "foo \ r \ nbar".

Një përkthim i ngjashëm ndodh kur lejohet nga përdoruesi, nëpërmjet presës_dorues . Në këtë rast, kur shtypni kthimin, do të përkthehet në një rresht të ri. Nëse presin pastaj e kalon atë në një program që përcakton terminalin e tij në modalitetin e papërpunuar (si telnet), do të ketë një problem, pasi programi pret një kthim të vërtetë. (Disa programe me të vërtetë falen në atë që automatikisht do të përkthejnë linjat e reja në kthim, por shumica nuk e bëjnë.) Për fat të keq, nuk ka asnjë mënyrë për të kuptuar se një program e vendos terminali në mënyrë të papërpunuar.

Në vend që të zëvendësojë me dorë rreshta me kthime, zgjidhja është përdorimi i komandës "stty raw", e cila do ta ndalë përkthimin. Vini re, megjithatë, që kjo do të thotë që nuk do të marrësh veçoritë e gatshme të redaktimit të linjës.

bashkëveprojnë në mënyrë implicite përcakton terminalin tuaj në mënyrë të papërpunuar kështu që ky problem nuk do të lindë atëherë.

Shpesh është e dobishme për të ruajtur fjalëkalimet (ose informacione të tjera private) në skedarët e Pritni . Kjo nuk rekomandohet pasi që çdo gjë që ruhet në një kompjuter është e ndjeshme për t'u qasur nga dikush. Kështu, ndërvepruesi nxitës për fjalëkalimet nga një skriptë është një ide më e mençur sesa t'i futësh ato fjalë për fjalë. Sidoqoftë, ndonjëherë përfshirja e tillë është e vetmja mundësi.

Për fat të keq, sistemi i skedarëve UNIX nuk ka mënyrë të drejtpërdrejtë të krijimit të skripteve të cilat janë të ekzekutueshme por të paqartë. Sistemet që mbështesin skriptet shell shell mund të indirekt simulojnë këtë si vijon:

Krijo skenarin Prisni (që përmban të dhënat sekrete) si zakonisht. Bëni lejet e tij të jetë 750 (-rwxr-x ---) dhe në pronësi të një grupi të besuar, pra një grup i cili lejohet ta lexojë atë. Nëse është e nevojshme, krijoni një grup të ri për këtë qëllim. Tjetra, krijoni skriptin / bin / sh me lejet 2751 (-rwxr-s - x) të zotëruara nga i njëjti grup si më parë.

Rezultati është një skript që mund të ekzekutohet (dhe lexohet) nga kushdo. Kur thirret, ai drejton skenarin e Pritni .

& # 34; SHIKO GJITHASHTU & # 34;

Tcl (3), libexpect (3)
"Eksplorimi i pritjes: Një udhëzues i bazuar në Tcl për automatizimin e programeve interaktive" nga Don Libes, f. 602, ISBN 1-56592-090-2, O'Reilly dhe Associates, 1995.
"presin: Shërimi i përshtatjeve të pakontrollueshme të interaktivitetit" nga Don Libes, Procesi i Konferencës USENIX të Verës 1990, Anaheim, California, 11-15 qershor 1990.
. "Përdorimi i pritjes për të Automate Detyrat e Administratës së Sistemit" nga Don Libes, Proceset e Konferencës së Administrimit të Sistemeve të Mëdha të Sistemit të Ujësjellësit të SHBA-së në vitin 1990, Colorado Springs, Kolorado, 17-19 tetor 1990.
I "Tcl: Një Gjuhë e Komandës për Embeddable" nga John Ousterhout, Procesi i Konferencës USENIX të Dimrit 1990, Washington, DC, 22-26 Janar 1990. Unë pres "Scripts për Kontrollin e Programeve Interaktive" nga Don Libes, , Vol. 4, Nr. 2, Revistat e Shtypit të Universitetit të Kalifornisë, nëntor 1991. I "Testimi i Regresionit dhe Testimi i Konformitetit të Programeve Interaktive", nga Don Libes, Procesi i Konferencës USENIX të Verës 1992, fq. 135-144, San Antonio, TX, 12-15 qershor, 1992 .. Unë "Kibitz - Lidhja Multiple Interactive Programs Së bashku", nga Don Libes, Software - Praktikë dhe Përvojë, John Wiley dhe Sons, West Sussex, Angli, Vol.

5, maj, 1993. "Një debugger për aplikimet Tcl", nga Don Libes, Proceedings of the 1993 Workshop Tcl / Tk, Berkeley, CA, 10-11 qershor 1993.

AUTHOR

Don Libes, Instituti Kombëtar i Standardeve dhe Teknologjisë

MIRËNJOHJE

Falë John Ousterhout për Tcl, dhe Scott Paisley për frymëzim. Në sajë të kodit Robo Savoye për autoconfigurimin e Expect.

Dosja e HISTORISË dokumenton shumë nga evolucioni i pritjes . Kjo bën lexim interesant dhe mund t'ju japë njohuri të mëtejshme për këtë softuer. Në sajë të njerëzve të përmendur në atë që më dërgoi fixes bug dhe dha ndihmë të tjera.

Hartimi dhe zbatimi i Pritjes u pagua pjesërisht nga qeveria amerikane dhe prandaj është në domenin publik. Sidoqoftë, autori dhe NIST do të dëshironin të përfitonin nëse ky program dhe dokumentacioni ose pjesë të tyre do të përdoreshin.