La Linukso / Unikso Komando Atendas

Atendu estas programo, kiu parolas al aliaj interagaj programoj laŭ skripto. Sekvante la skripton, Atendu scias, kio povas esti atendata de programo kaj kia ĝusta respondo estu. Interpretata lingvo provizas branĉajn kaj altnivelajn kontrolojn por direkti la dialogon. Krome, la uzanto povas regi kaj interagi rekte kiam ĝi deziras, poste redonante kontrolon al la skripto.

Atendo estas miksaĵo de Atendo kaj Tk. Ĝi kondutas nur kiel Atendu kaj deziras Tk. Atendo ankaŭ povas esti uzata rekte en C aŭ C ++ sen Tcl.

La nomo "Atendo" venas de la ideo sendi / atendi sekvencojn popularigitajn per uukp, kermit kaj aliaj modemaj programoj. Tamen kontraste kun uucp, Atendu estas ĝeneraligita tiel ke ĝi povas esti kurita kiel uzanto-nivela komando kun iu ajn programo kaj tasko en menso. Atendu paroli plurajn programojn samtempe.

Kion Atendu Povas Fari

Ekzemple, jen kelkaj aferoj, kiujn atendas la komando povas fari:

Ekzistas diversaj kialoj, kial la ŝelo ne povas plenumi ĉi tiujn taskojn. Ĉiuj eblas kun Atendu.

Ĝenerale, Atendu utilas por kurado de iu programo, kiu postulas interrilatadon inter la programo kaj la uzanto. Ĉio necesa estas, ke la interago povas esti karakterizita programme. Atendu ankaŭ povas redoni kontrolon al la uzanto sen haltigi la programon kontrolitan. Simile, la uzanto povas regi kontrolon al la skripto en ajna momento.

Uzado

Atendu legi cmdfile por listo de komandoj por ekzekuti. Atendu, ke oni povas alpreĝiĝi al sistemoj, kiuj subtenas la #! skribmaniero per markado de la skripto kiel ejecutable kaj farante la unuan linion en la skripto:

#! / usr / loka / bin / expect -f

Kompreneble, la vojo devas precize priskribi, kie esperas vivi. / usr / loka / bin estas nur ekzemplo.

La -c-flago preferas komandon por esti ekzekutita antaŭ iu ajn en la skripto. La komando devas esti citita por malhelpi esti rompita de la ŝelo. Ĉi tiu opcio povas esti uzata multfoje. Multoblaj komandoj povas esti ekzekutitaj per ununura -c per apartigo de ili per duonkolonoj. Komandoj estas ekzekutitaj laŭ la ordo, kiun ili aperas. Kiam vi uzas Atendon, ĉi tiu opcio estas specifita kiel -command.

La -d-flago ebligas iujn diagnozajn rezultojn, kiuj ĉefe raportas internan agadon de komandoj kiel atendi kaj interagi. Ĉi tiu flago havas la saman efikon kiel "exp_internal 1" komence de Atendo-skripto, krom la versio de Atendo estas presita.

La--flago ebligas interagan elpurigilon. Entjera valoro devus sekvi. La elpurigilo prenos la kontrolon antaŭ la sekva Tcl-proceduro se la valoro estas ne-nulo aŭ se a C estas premita aŭ punkto de punkto estas trafita, aŭ alia taŭga debugger-komando aperas en la skripto. Kiam vi uzas Atendon, ĉi tiu opcio estas precizigita kiel - Depuŝo.

La -f-flago preferas dosieron el kiu legi komandojn. La flago mem estas laŭvola ĉar ĝi estas nur utila kiam vi uzas la #! skribmaniero, por ke aliaj argumentoj estu provizitaj sur la komandlinio. Kiam vi uzas Atendon, ĉi tiu opcio estas specifita kiel -file.

Defaŭlte, la komandosiero estas legata en memoro kaj ekzekutita en ĝia tuteco. Ĝi de tempo al tempo estas dezirinde legi dosierojn unu linio samtempe. Por devigi arbitrajn dosierojn esti manipulitaj de ĉi tiu maniero, uzu la -b-flagon. Kiam vi uzas Atendon, ĉi tiu opcio estas precizigita kiel -buffer.

Se la ĉeno "-" estas provizata kiel dosiernomo, norma enigo estas legata anstataŭe. Uzu "./-" por legi el dosiero vere nomata "-".

La flago -i kaŭzas Atendu interagie pruvi ordonojn anstataŭ legi ilin el dosiero. Promesado estas nuligita per la eliro komando aŭ sur EOF. La -i-flago estas supozita, ĉu nek komando-dosiero nek -c estas uzata. Kiam vi uzas Atendon, ĉi tiu opcio estas precizigita kiel -spekta.

- povas esti uzata por limigi la finon de la elektoj. Ĉi tio estas utila se vi volas pasi opcion-similajn argumentojn al via skripto sen ĝi esti interpretita de Atendu. Ĉi tio povas esti utile metita en la #! linio por eviti ajnan simplan interpreton de Atendu. Ekzemple, la sekvaj eliros la originalajn argumentojn inkluzive de la skripta nomo en la variablo argv .

#! / usr / loka / bin / atendu -

Rimarku, ke la kutimaj getopt (3) kaj ekzecve (2) konvencioj devas esti observitaj aldonante argumentojn al la #! linio.

La dosiero $ exp_library / expect.rc estas utiligita aŭtomate se ĉeestas, krom se la -N-flago estas uzata. (Kiam uzanta Atendon, ĉi tiu opcio estas specifita kiel -NORC.) Tuj post tio, la dosiero ~ / .expect.rc estas uzata aŭtomate, se la n-flago estas uzata. Se la varia variablo de medio DOTDIR estas difinita, ĝi estas traktita kiel dosierujo kaj .expect.rc estas legata de tie. Kiam vi uzas Atendon, ĉi tiu opcio estas specifita kiel -nork. Ĉi tiu sourcing okazas nur post ekzekuti ajnajn -c flagojn.

-v kaŭzas Atendu presi ĝian version-numeron kaj eliri. La responda flago en Atendo, kiu uzas longajn flavajn nomojn, estas -versio.

Laŭvolaj argumentoj estas listigitaj kaj listigitaj en la variablo nomata argv kaj. argc estas inicialigita al la longeco de argv.

Argv0 estas difinita kiel la nomo de la skripto aŭ binara se neniu skripto estas uzata. Ekzemple, jenaj pruvas la nomon de la skripto kaj la unuaj tri argumentoj:

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

Komandoj

Atendu uzi Ilan Komandan Lingvon. Tcl provizas kontrolan fluon (se, por, rompi), espriman taksadon kaj plurajn aliajn funkciojn kiel rekursio kaj proceduro-difino. Komandoj uzataj ĉi tie sed ne difinitaj (aro, se, ekzec) estas Tcl-komandoj. Atendu subtenajn aldonajn komandojn. Krom se alie difinita, ordonoj redonu la malplenan ĉenon.

Komandoj estas listigitaj alfabete por ke ili rapide estu lokitaj. Tamen, novaj uzantoj eble pli facile komenciĝu per legado de la priskriboj de kreado, sendo, atendo kaj interagado en tiu ordo.

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

fermas la ligon al la nuna procezo . Plej multaj interagaj programoj detektos EOF sur siaj stdin kaj eliroj; tiel proksime kutime sufiĉas mortigi la procezon . La -i-flago deklaras la procezon fermi respondan al la nomata spawn_id.

Ambaŭ atendu kaj interagas detekti kiam la nuna procezo eliras kaj implicite finiĝos, sed se vi mortigos la procezon , diru, "ekzek mortigu $ pid", vi devas eksplicite voki fermi .

La -onexec-flago determinas ĉu la aŭtomata identigilo estas fermita en iuj novaj kreitaj procezoj aŭ se la procezo estas overlayed. Por lasi malfermitan id-malfermon, uzu la valoron 0. Ne-nula entjera valoro devigas la generitan fermon en iuj novaj procezoj.

La sklava flago fermas la sklavon asociitan kun la identeco. Kiam la ligo fermiĝas, la sklavo ankaŭ aŭtomate fermiĝas se ĝi ankoraŭ estas malfermita.

Ne gravas ĉu la rilato estas fermita implicite aŭ eksplicite, vi devas nomi atendon por liberigi la respondan kernan procezon . La proksima komando ne vokas atendon, ĉar ne ekzistas garantio, ke fermado de proceza konekto kaŭzos ĝin foriri.

elpurigi [[-now] 0 | 1]

Kontrolas Tcl-sugestilon, permesante al vi paŝi tra deklaroj kaj starigi punktojn.

Sen argumentoj, 1 estas redonita se la debugger ne funkcias, alie 0 estas redonita.

Kun 1 argumento, la elpurigilo komenciĝas. Kun 0 argumento, la elpurigilo estas haltita. Se 1 argumento estas antaŭita per la -nova flago, la elpurigilo komenciĝas tuj. Alie, la elpurigilo komenciĝas per la sekva Tcl-deklaro.

La debugkomando ne ŝanĝas neniujn kaptilojn. Komparu ĉi tion por komenci Atendu per la -D-flago.

La diskonekta komando malkonstruas forkaptitan procezon de la fina stacio . Ĝi daŭre funkcias en la fono. La procezo donas sian propran procezon grupon. Norma I / O estas alidirektita al / dev / null .

La sekva fragmento uzas malkonekton por daŭrigi kurante la skripton en la fono.

se {[fork]! = 0} eliras malŝlosi. . .

La sekva skripto legas pasvorton kaj poste kuras programon ĉiun horon, kiu postulas pasvorton ĉiufoje kiam ĝi estas kurita. La skripto provizas la pasvorton por ke vi nur devas tajpi ĝin unufoje.

send_user "pasvorto? \" expect_user -re "(. *) \ n" por {} 1 {} {se {[fork]! = 0} {dorm 3600; daŭrigi} malkonekti spawn priv_prog atendu Pasvorton: sendu "$ expect_out ( 1, ĉeno) \ r ". . . eliro}

Avantaĝo por malŝalti super la ŝelo asincrona procezaĵo (&) estas ke Atendu povas savi la finaĵojn de la fina stacioj antaŭ malŝalti kaj poste apliki ilin al novaj ptys. Kun &, Atendu ne havas ŝancon legi la parametrojn de la fina stacio ekde la fina stacio jam estas interŝanĝita de la tempo, Atendu ricevas kontrolon.

eliro [-opts] [statuso]

kaŭzas Atendu eliri aŭ alie preparu fari tion.

La flago- konektita kaŭzas la sekvan argumenton esti uzata kiel elirejo. Sen argumento, la nuntempa elŝutilo estas redonita.

La nuna flago kaŭzas Atendu prepari por eliri, sed ĉesu reale regi kontrolon al la mastruma sistemo. La uzanto difinita elirejo estas kurita same kiel la propraj internaj manipuliloj de Expect. Ne plu Atendu komandojn devas esti ekzekutitaj. Ĉi tio utilas se vi funkcias Atendu kun aliaj etendoj de Tcl. La nuna interpretisto (kaj ĉefa fenestro se en la Tk-medio) restas tiel ke aliaj etendoj de Tcl povas purigi. Se la eliro de Atendo estas denove vokita (tamen tio okazas), la manipuliloj ne reruniĝas.

Post la foriro, ĉiuj ligoj al generitaj procezoj estas fermitaj. Fermo estos detektita kiel EOF per generitaj procezoj. eliro ne prenas aliajn agojn preter la normala _exit (2) procedo. Tiel, naskitaj procezoj, kiuj ne kontrolas EOF, povas daŭri kuri. (Vario de kondiĉoj estas gravaj por determini, ekzemple, kio signaloj generita procezo estos sendita, sed ĉi tiuj estas sistemon-dependaj, tipe dokumentitaj sub eliro (3).) Proksimaj procezoj, kiuj daŭras kuri, estos hereditaj de init.

statuso (aŭ 0 se ne specifita) estas redonita kiel la eliro-statuso de Atendu . Eliro estas implicite ekzekutita se la fino de la skripto estas atingita.

exp_continue [-continue_timer]
La komando exp_continue permesas atendi , ke li daŭre ekzekutos anstataŭ reveni kiel ĝi kutime volus. Defaŭlte exp_continue restarigas la temporizan tempon. La -continue_timer- flago malhelpas la tempon de restartigo. (Vidu atendu por pliaj informoj.)

exp_internal [-f-dosiero] valoro
kaŭzas pliajn ordonojn sendi internajn informojn pri Diagnozo Atendu al stderr se valoro estas ne-nulo. Ĉi tiu eligo estas malŝaltita se valoro estas 0. La diagnozaj informoj inkluzivas ĉiun karakteron ricevitan, kaj ĉiu provo fariĝi kun la aktuala eligo kontraŭ la ŝablonoj.

Se la laŭvola dosiero estas provizata, ĉiu normala kaj elpuriga eligo estas skribita al tiu dosiero (sendepende de valoro de valoro ). Ajna antaŭa diagnoza eliga dosiero estas fermita.

La nula flago kaŭzas rekomence redoni priskribon de la plej lastatempaj ne-informaj argumentoj donitaj.

exp_open [args] [-i spawn_id]
Revenas Tcl-dosier-identigilon, kiu respondas al la origina generilo. La dosier-identigilo povas tiam esti uzata kvazaŭ ĝi malfermiĝis per la malferma komando de Tcl. (La kreita ido ne plu estu uzata. Atendado ne devus esti ekzekutita.

La -leaveopen- flago lasas la generitan idon malfermitan por aliro tra Atendaj komandoj. Atendo devas esti ekzekutita sur la identeco.

exp_pid [-i spawn_id]
redonas la procezon id, kiu respondas al la nunfina procezo. Se la -i- flago estas uzata, la pid revenita respondas al tiu de la donita apartaĵo.

exp_send
estas alias por sendi .

exp_send_error
estas alias por send_error .

exp_send_log
estas alias por send_log .

exp_send_tty
estas alias por send_tty .

exp_send_user
estas alias por send_user .

exp_version [[-exit] versio]
estas utila por certigi, ke la skripto estas kongrua kun la nuna versio de Atendu.

Sen argumentoj, la nuntempa versio de Atendo estas revenita. Ĉi tiu versio tiam povas esti kodita en via skripto. Se vi vere scias, ke vi ne uzas funkciojn de freŝaj versioj, vi povas specifi pli fruan version.

Versioj konsistas el tri nombroj disigitaj per punktoj. Unue estas la plej grava nombro. Skriboj por versioj de Atendu kun malsama grava nombro preskaŭ certe ne funkcios. exp_version redonas eraron se la ĉefaj nombroj ne kongruas.

Dua estas la plej malgranda nombro. Skribitaj skriptoj por versio kun plej malgranda pli malgranda nombro ol la aktuala versio povas dependi de iu nova funkcio kaj eble ne kuri. exp_version redonas eraron se la ĉefaj nombroj kongruas, sed la plej malgranda skripto estas pli granda ol la ekzekuto.

Tria estas nombro, kiu ne partoprenas en la komparo de la versio. Tamen, ĝi pliiĝas kiam la Atendu programaro distribuiĝas laŭ iu ajn maniero, kiel per pliaj dokumentoj aŭ optimumigo. Ĝi estas rekomencita al 0 sur ĉiu nova minora versio.

Kun la -exit flago, Atendu presas eraron kaj eliras se la versio estas sen dato.

atendu [[-opts] pat1 body1] ... [-opts] patn [bodyn]
atendas, ke unu el la ŝablonoj kongruas kun la eligo de sprita procezo, specifita tempa periodo pasis, aŭ fin-dosiero estas vidita. Se la fina korpo estas malplena, ĝi povas esti preterlasita.

Ŝablonoj de la plej freŝa atendu-antaŭa komando estas implicite uzataj antaŭ ajna alia mastro. Ŝablonoj de la plej freŝa atendanta komando estas implicite uzataj post iuj aliaj ŝablonoj.

Se la argumentoj al la tuta atendanta deklaro postulas pli ol unu linion, ĉiuj argumentoj povas esti "riproĉitaj" en unu por eviti fini ĉiun linion kun malaltiĝo. En ĉi tiu kazo, la kutimaj Tcl-anstataŭoj okazos malgraŭ la krampoj.

Se ŝablono estas la ŝlosilvorto, la koresponda korpo estas ekzekutita ĉe fina dosiero. Se ŝablono estas la ŝlosila vorto, la koresponda korpo ekzekutas al tempo. Se ne estas uzata ŝlosila vorto, neebla nula ago estas ekzekutita. La defaŭlta periodo de tempo estas 10 sekundoj sed povas esti agordita, ekzemple al 30, per la komando "set-timeout 30". Senfina trafiko povas esti nomumita per la valoro -1. Se ŝablono estas la ŝlosilvorto defaŭlte , la koresponda korpo estas ekzekutita dum aŭ ajn tempo aŭ fino de dosiero.

Se ŝablono kongruas, tiam la responda korpo estas ekzekutita. atendas redoni la rezulton de la korpo (aŭ la malplena ĉeno se neniu ŝablono egalis). En la okazo ke multnombraj ŝablonoj kongruas, la unua apero estas uzita por elekti korpon.

Ĉiufoje kiam nova eligo alvenas, ĝi komparas al ĉiu ŝablono en la ordo kiun ili estas listigitaj. Tiel, vi povas provi por foresto de matĉo, farante la lastan ŝablonon ion garantiitan, kiel ekzemple rekompenco. En situacioj, kie ne ekzistas pruvo, vi devas uzi tempon (kiel vi volas, se vi interagas permane).

Ŝablonoj estas specifitaj laŭ tri manieroj. Defaŭlte, ŝablonoj estas specifitaj kiel kun la komando de ĉeno de Tcl. (Tiaj ŝablonoj ankaŭ similas al regulaj esprimoj de C-ŝelo kutime nomataj "globaj" ŝablonoj). La-flago eble povas esti uzata por protekti ŝablonojn, kiuj alie povus kunigi atendajn flagojn de tiel fari. Ajna ŝablono komencanta per "-" devus esti protektita ĉi-tien. (Ĉiuj kordoj komencantaj per "-" estas rezervitaj por estontaj opcioj.)

Ekzemple, la sekva fragmento serĉas sukcesan ensaluton. (Notu, ke malpermeso estas supozata kiel proceduro difinita aliloke en la skripto.)

atendu (okupata) okupas; exp_continue} malsukcesis malakcepti "nevalidan pasvorton" forgesi eksterordinaran pasvorton}

Citasĵoj estas necesaj sur la kvara ŝablono, ĉar ĝi enhavas spacon, kiu alie difus la ŝablonon de la ago. Ŝablonoj kun la sama ago (kiel ekzemple la 3a kaj 4a) postulas listigi la agojn denove. Ĉi tio povas eviti per uzado de regexp-stilo (vidu sube). Pli da informoj pri formado de glob-stilaj ŝablonoj troviĝas en la Tcl-manlibro.

Regexp-stilo-ŝablonoj sekvas la sintakson difinitan de la regexp de Tcl (mallonga por "regula esprimo"). Regexp-ŝablonoj estas enkondukitaj kun la flago -re . La antaŭa ekzemplo povas esti reescrita per regexp kiel:

atendu (okupata) okupas; exp_continue} -re "failed | invalid password" abort timeout abort connected}

Ambaŭ tipoj de ŝablonoj estas "unanchoritaj". Ĉi tio signifas, ke ŝablonoj ne devas egali la tutan ĉenon, sed povas komenci kaj fini la matĉon ie ajn en la ĉeno (kondiĉe ke ĉio alia kongruas). Uzu ^ por kongrui la komencon de ĉeno, kaj $ kongrui kun la fino. Rimarku, ke se vi ne atendas la finon de ĉeno, viaj respondoj povas facile finiĝi en la mezo de la ĉeno, ĉar ili estas eĥataj de la generita procezo. Dum daŭre produktas ĝustajn rezultojn, la eligo povas aspekti nesatura. Tiel, uzado de $ estas kuraĝigita se vi povas precize priskribi la karakterojn ĉe la fino de ĉeno.

Rimarku, ke en multaj redaktistoj, la ^ kaj $ kongruas la komencon kaj finon de linioj respektive. Tamen, ĉar atendi ne estas linio orientita, ĉi tiuj signoj kongruas kun la komenco kaj fino de la datumoj (kontraŭe al linioj) nuntempe en la atendanta kogara bufro. (Ankaŭ, vidu la noton sube sur "sistemo indigestión.")

La -exa flago kaŭzas ke la ŝablono estu egalita kiel "ĝusta" ĉeno. Neniu interpreto de *, ^, ktp estas farita (kvankam la kutimaj Tcl-konvencioj ankoraŭ devas esti observitaj). Ĝustaj ŝablonoj ĉiam senkulpiĝas.

La -nocasa flago kaŭzas plej grandajn karakterojn de la eligo por kompari kvazaŭ ili estis minusklaj signoj. La ŝablono ne tuŝas.

Dum leganta eligo, pli ol 2000 bytes povas devigi antaŭajn bajojn esti "forgesitaj". Ĉi tio povas esti ŝanĝita kun la funkcio match_max . (Notu, ke troe grandaj valoroj povas malrapidigi la mastrilon.) Se patlist estas full_buffer , la koresponda korpo estas ekzekutita se match_max bajtoj estis ricevitaj kaj neniu alia ŝablono estis egalita. Ĉu aŭ ne la plena_buffer- ŝlosila vorto estas uzata, la forgesitaj signoj estas skribitaj al expect_out (buffer).

Se patlisto estas la ŝlosilvorto nula , kaj nulaj estas permesitaj (per la komando forigu_nulls ), la responda korpo estas ekzekutita se sola ASCII 0 estas egalita. Ne eblas egali 0 bajtoj per globaj aŭ regexp-ŝablonoj.

Sur kongruaj ŝablonoj (aŭ eof aŭ full_buffer), ĉiu komuna kaj antaŭe nematimita eligo savas en la variablo expect_out (buffer) . Ĝis 9 regexp substring- matĉoj estas konservitaj en la variabloj expect_out (1, kordo) per expect_out (9, kordo) . Se la indico- flago estas uzata antaŭ ŝablono, la indicoj de ekkuro kaj finaĵo (en formo taŭga por lrange ) de la 10 ŝnuroj estas konservitaj en la variabloj expected_out (X, start) kaj expect_out (X, fino) kie X estas cifero, korespondas al la anstataŭa pozicio en la bufro. 0 rilatas al ŝnuroj, kiuj kongruas la tutan ŝablonon kaj estas generitaj por globaj mastroj kaj regexp-ŝablonoj. Ekzemple, se procezo produktis eliron de "abcdefgh \ n", la rezulto de:

atendu "cd"

estas kvazaŭ la jenaj deklaroj ekzekutis:

agordi expect_out (0, kordo) cd-aro expect_out (buffer) abcd

kaj "efgh \ n" estas lasita en la eliga bufro. Se procezo produktis la eliron "abbbcabkkkka \ n", la rezulto de:

atendu -indiĉoj -re "b (b *). * (k +)"

estas kvazaŭ la jenaj deklaroj ekzekutis:

agordi expect_out (0, komenco) 1 aro expect_out (0, fino) 10 aro expect_out (0, ĉeno) bbbcabkkkk aro expect_out (1, komenco) 2 aro expect_out (1, fino) 3 aro expect_out (1, ĉeno) bb starigis expect_out (2, komenco) 10 aro expect_out (2, fino) 10 aro expect_out (2, kordoj) k aro expect_out (buffer) abbbcabkkkk

kaj "a \ n" estas lasita en la eliga bufro. La ŝablono "*" (kaj -re ". *") Plenigos la elpurigan bufro sen legi pli da eligo de la procezo.

Kutime, la egalita eligo estas forĵetita de la internaj bubaloj de Expect. Ĉi tio povas esti malhelpita per prefiksado de ŝablono kun la -notransfer- flago. Ĉi tiu flago estas speciale utila por eksperimentado (kaj povas esti mallongigita al "-not" por komforto dum eksperimentado).

La aparta identeco asociita kun la komuna eligo (aŭ eof aŭ full_buffer) estas konservita en expect_out (spawn_id) .

La -tempa flago kaŭzas ke la nuna atendu komandon uzi la sekvan valoron kiel tempon sen uzi la valoron de la ŝanĝiĝema ŝanĝiĝema tempo.

Defaŭlte, ŝablonoj estas egalitaj kontraŭ eligo de la nuna procezo, tamen la -i- flago deklaras ke la eligo de la nomata spawn_id-listo estas egalita kontraŭ iuj sekvaj ŝablonoj (ĝis la sekva -i ). La listo de spawn_id devus esti unuopa spaco apartigita listo de spawn_ids aŭ variablo referente al tia listo de spawn_ids.

Ekzemple, la sekva ekzemplo atendas "konektita" de la nuna procezo, aŭ "okupata", "malsukcesita" aŭ "nevalida pasvorto" de la spawn_id nomata per $ proc2.

atendu {-i $ proc2 okupata {okupas \ n; exp_continue} -re "failed | invalid password" abort timeout abort connected}

La valoro de la tutmonda variablo any_spawn_id povas esti uzata por kongrui ŝablonojn al iuj spawn_ids, kiuj estas nomitaj per ĉiuj aliaj flagoj en la nuna atendo komando. La spawn_id de -i flago kun neniu asociita ŝablono (tio estas, sekvita tuj per alia -i ) estas havebla al iuj aliaj ŝablonoj samtempe atendante komandon asociita kun any_spawn_id.

La -i- flago ankaŭ povas nomi tutmondan variablon en kies kazo la variablo estas lerta por listo de kreitaj idoj. La variablo ŝanĝas kiam ajn ĝi ŝanĝiĝas. Ĉi tio ebligas ŝanĝi la fonton I / O dum la komando estas en ekzekuto. Ĉi tiuj vortoj estas nomataj "nerektaj".

Agoj kiel rompi kaj daŭrigi kaŭzi regulstrukturojn (te, por , proc ) konduti en la kutima maniero. La komando exp_continue permesas atendi , ke li daŭre ekzekutos anstataŭ reveni kiel ĝi kutime volus.

Ĉi tio utilas por eviti eksplicitajn maŝojn aŭ ripeti atendi deklarojn. La sekva ekzemplo estas parto de fragmento por aŭtomatigi rloginon. La ekskludo evitas, ke oni devas skribi duan atendon (por serĉi la rekomencon) se la rlogino instigas pasvorton.

atendu {Pasvorto: {stty -echo send_user "pasvorto (por $ uzanto) je $ host:" expect_user -re "(. *) \ n" send_user "\ n" send "$ expect_out (1, string) \ r" stty eĥo exp_continue} malĝusta {send_user "nevalida pasvorto aŭ konto \ n" eliro} timeout {send_user "konekto al $ host elsendita \ n" exit} eof {send_user \ "konekto al gastigilo malsukcesis: $ expect_out (buffer)" eliro} - re $ prompt}

Ekzemple, la sekva fragmento povus helpi uzanton gvidi interagon, kiu jam estas tute aŭtomata. En ĉi tiu kazo, la fina stacio estas metita en kruda maniero. Se la uzanto premas "+", variablo pliiĝas. Se "p" estas premata, pluraj rondveturoj estas senditaj al la procezo, eble ŝprucigi ĝin laŭ iu maniero, kaj "i" permesas al la uzanto interagi kun la procezo, efektive ŝteli la kontrolon de la skripto. En ĉiu kazo, la ekskludo permesas al la nuna atendi daŭrigi ŝablononkongruon post ekzekuti la aktualan agon.

stty raw -echo expect_after {-i $ user_spawn_id "p" {send "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interagi; exp_continue} eliro "ellasi"

Defaŭlte, exp_continue restarigas la temporizan tempon. La temporizilo ne estas rekomencita, se exp_continue estas nomita kun la -continue_timer- flago.

expect_after [expect_args]
laboras identike al la atendado antaŭ ol escepte, se ŝablonoj de ambaŭ atendu kaj atendi povas egali, la atendema ŝablono estas uzata. Vidu la atendon antaŭ ol ordonu pli da informoj.

expect_background [expect_args]
prenas la samajn argumentojn kiel atendi , tamen ĝi revenas tuj. Ŝablonoj estas provitaj kiam ajn nova enigo alvenos. La ŝablono tempon kaj defaŭlto estas senzorgaj por atendi_-reto kaj estas silente forĵetitaj. Alie, la atend_background- komando uzas esperajn antaŭdirojn kaj atendojn , kiel oni atendas .

Kiam atendaj reguloj estas taksataj, fona prilaborado por la sama ekspluatado estas blokita. Fona prilaborado malŝaltiĝas kiam la ago kompletigas. Dum fono-prilaborado estas blokita, ĝi eblas fari (foreground) atendi sur la sama generi id.

Ne eblas ekzekuti atendi dum atend_background estas malŝaltita. expect_background por aparta ida ido estas forigita per proklamado de nova expecto-reto kun la sama ekspluatado. Nuligi atendon de malantaŭa kampo sen neniu ŝablono forigas la donita identecon de la kapablo egali ŝablonojn en la fono.

esperas antaŭ ol [atend_args]
prenas la samajn argumentojn kiel atendi , tamen ĝi revenas tuj. Ŝablonaj agoj de la plej lastatempaj atendoj antaŭ ol kun la sama ekspluatado estas implicite aldonitaj al iuj sekvaj atendaj komandoj. Se ŝablono kongruas, ĝi traktas kvazaŭ ĝi estis specifita en la atendanta komando mem, kaj la asociita korpo estas ekzekutita en la kunteksto de atendi komando. Se ŝablonoj de ambaŭ atendu antaŭ ol atendi povas egali, la atendu-antaŭa ŝablono estas uzata.

Se neniu ŝablono estas precizigita, la kreita ido ne estas kontrolita por iu ajn ŝablonoj.

Krom se estas malpermesita per -i- flago, atendu antaŭ ol ŝablonoj kongruas kontraŭ la kreita ido difinita kiam la atendu-antaŭa komando estis ekzekutita (ne kiam ĝia ŝablono estas egalita).

La-flago kaŭzas atendi antaŭ ol la nunaj specifaĵoj de kiaj ŝablonoj kongruos . Defaŭlte, ĝi raportas pri la nuna aparta id. Oni povas doni laŭvolajn specifajn specifikojn por informoj pri tio. Ekzemple

esperas antaŭ ol -info -i $ proc

Plejparte unu specifa identigo povas esti donita. La flago-indirecto subpremas rektajn idojn, kiuj venas nur de nerektaj specifaĵoj.

Anstataŭ generi id-specifikon, la flago "-all" kaŭzos "-info" por raporti pri ĉiuj kreitaj idoj.

La eligo de la nula flago povas esti reutilita kiel la argumento atendi antaŭ ol.

expect_tty [expect_args]
estas kiel atendi, sed ĝi legas karakterojn de / dev / tty (te ŝlosiloj de la uzanto). Defaŭlte, legado estas farita en kuirita reĝimo. Tiel, linioj devas finiĝi kun reveno por atendi vidi ilin. Ĉi tio povas esti ŝanĝita per stty (vidu la stipan komandon sube).

expect_user [expect_args]
estas kiel atendi, sed ĝi legas karakterojn de stdin (te ŝlosiloj de la uzanto). Defaŭlte, legado estas farita en kuirita reĝimo. Tiel, linioj devas finiĝi kun reveno por atendi vidi ilin. Ĉi tio povas esti ŝanĝita per stty (vidu la stipan komandon sube).

forko
kreas novan procezon . La nova procezo estas ĝusta kopio de la nuna Atendprocezo . En sukceso, forko revenas 0 al la nova (infana) procezo kaj redonas la procezan IDon de la infana procezo al la gepatra procezo . En malsukceso (nevarie pro manko de rimedoj, ekz. Swap spaco, memoro), forko revenas -1 al la gepatra procezo , kaj neniu infana procezo estas kreita.

Forkedaj procezoj eliras tra la komando de eliro , same kiel la originala procezo . Forked-procezoj rajtas skribi al la registraj dosieroj. Se vi ne malŝaltas elpurigadon aŭ ensalutadon en la plej multaj el la procezoj, la rezulto povas konfuzi.

Kelkaj legantoj kaj verkistoj, eĉ momente, povas konfuzi iujn implementojn pri pty. Tiel, ĝi estas plej sekura por forko antaŭ kreado de procezoj.

interagi [string1 body1] ... [stringn [bodyn]
donas la kontrolon de la nuna procezo al la uzanto, tiel ke ŝlosiloj estas senditaj al la nuna procezo , kaj la stdout kaj stderr de la nuna procezo estas redonitaj.

String-korpo-paroj povas esti specifitaj kiel argumentoj, en kies kazo la korpo estas ekzekutita kiam la responda ĉeno estas enigita. (Defaŭlte, la kordo ne estas sendita al la nuna procezo .) La interpretisto- komando estas supozita, se la fina korpo mankas.

Se la argumentoj al la tuta interaga deklaro postulas pli ol unu linion, ĉiuj argumentoj povas esti "riproĉitaj" en unu por eviti fini ĉiun linion per malantaŭa. En ĉi tiu kazo, la kutimaj Tcl-anstataŭoj okazos malgraŭ la krampoj.

Ekzemple, la sekva komando kuras interagi kun la sekvaj kordoj-korpo-paroj difinitaj: Kiam ^ Z estas premita, Atendu estas nuligita. (La etendo- flago restarigas la finaĵojn .) Kiam ^ A estas premita, la uzanto vidas "vi tajpis kontrolon-A" kaj la procezo estas sendita ^ A. Kiam $ estas premataj, la uzanto vidas la daton. Kiam ^ C estas premita, Atendu eliroj. Se "foo" estas enirita, la uzanto vidas "trinkejon". Kiam ~~ estas premita, la Atendu- interpretisto kuras interagie.

agordi CTRLZ \ 032 interagi {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "vi tajpis kontrolon-A \ n"; sendu "\ 001"} $ {send_user "La dato estas [formato de horloĝo [sekundoj de horloĝo]."} \ 003 exit foo {send_user "bar"} ~~}

En ŝnuroj-korpaj paroj, kordoj estas egalitaj laŭ la ordo, kiun ili listigas kiel argumentoj. Kordoj kiuj parte koincidas ne estas senditaj al la nuna procezo antaŭ ol la resto venas. Se signoj estas eniritaj tiel, ke tie ne plu povas esti matĉo, nur la parto de la ĉeno estos sendita al la procezo, kiu eble ne povas komenci alian matĉon. Tiel, la ŝnuroj, kiuj submetiĝas al partaj partioj, povas egali poste, se la originalaj ŝnuroj, kiuj provis esti kongruaj, malsukcesas.

Defaŭlte, la kongruaj kordoj estas ĝustaj sen sovaĝaj kartoj . (Kontraŭe, la atendanta komando uzas ŝablonojn de glob-stilo defaŭlte.) La -ex- flago povas esti uzata por protekti ŝablonojn, kiuj alie povus interŝanĝi interagajn flagojn. Ajna ŝablono komencanta per "-" devus esti protektita ĉi-tien. (Ĉiuj kordoj komencantaj per "-" estas rezervitaj por estontaj opcioj.)

La -re flago devigas la ŝnuron esti interpretita kiel regexp-stilo-ŝablono. En ĉi tiu kazo, kongruaj subtekstoj estas konservitaj en la varia interagado- similaj simile al la maniero, ke oni atendas, ke ilia eligo en la variablo expect_out . La -indaj flago estas simile subtenata.

La ŝablono prezentas agon ekzekutatan ĉe fino-dosiero. Alia aparta ŝablono ankaŭ povas sekvi la -output- flagon, en kies kazo ĝi egaligas se eof estas detektita dum skribado de eligo. La defaŭlta ago estas "reveno", por ke interagi simple revenu al iu EOF.

La ŝablono- tempon prezentas tempon de tempo (en sekundoj) kaj agon, kiu estas ekzekutita post kiam neniu signo estis legita dum tempo. La tempa ŝablono aplikiĝas al la plej lastatempe specifita procezo . Ne estas senfina tempo. La speciala variablo "timeout" (uzita de la atendi komando) havas nenian efikon sur ĉi tiu tempo.

Ekzemple, la sekva deklaro povus esti uzata por aŭtomatigi uzantojn, kiuj ne tajpis ion por unu horo, sed kiuj ankoraŭ ricevas oftajn sistemajn mesaĝojn:

interagi -input $ user_spawn_id timeout 3600 return -output \ $ spawn_id

Se la ŝablono estas la ŝlosilvorto nula , kaj nulaj estas permesitaj (per la komando forigi_nulls ), la koresponda korpo estas ekzekutita se sola ASCII 0 estas egalita. Ne eblas egali 0 bajtoj per globaj aŭ regexp-ŝablonoj.

Antaŭparoli mastron kun la flago -iwrite kaŭzas la variablo interactive (spawn_id) esti fiksita al la spawn_id kiu kongruis la ŝablonon (aŭ eof).

Agoj kiel rompi kaj daŭrigi kaŭzi regulstrukturojn (te, por , proc ) konduti en la kutima maniero. Tamen reveno kaŭzas interagi reveni al sia alvokanto, dum inter_returnaj kaŭzoj interagas kaŭzi revenon en sia alvoko. Ekzemple, se "proc foo" vokis interagi, kiu tiam ekzekutis la agon inter_return , proco revenus. (Ĉi tio signifas, ke se interagaj alvokoj de interpretisto interagie tajpanta revenon kaŭzos la interagadon daŭri, dum inter_returnos la interagadon redoni al sia alvokanto).

Dum interagado , kruda maniero estas uzata tiel ke ĉiuj karakteroj povas esti pasitaj al la nuna procezo . Se la nuna procezo ne kaptas laborpostenajn signalojn, ĝi haltos se ĝi sendos haltigan signalon (implicite ^ Z). Por rekomenci ĝin, sendu daŭran signalon (kiel ekzemple "mortigi -CONT"). Se vi vere volas sendi SIGSTOP al tia procezo (per ^ Z), pripensu krei csh unue kaj poste kurante vian programon. Aliflanke, se vi volas sendi SIGSTOP por Atendi mem, unuavoki-interpretilon (eble per uzado de ellasilo), kaj tiam premu ^ Z.

String-korpo-paroj povas esti uzataj kiel taŭga manlibro por eviti devi eniri la interpretiston kaj ekzekuti komandojn interagie. La antaŭa fina stacio estas uzata dum la korpo de kordo-korpo estas ekzekutita.

Por rapido, agoj ekzekutas en malpura maniero defaŭlte. La etendo- flago restarigas la finaĵon al la maniero, kiun ĝi antaŭe ekzekutis, estis ekzekutita (nevarie, kuirita). Rimarku, ke la signoj enigitaj, kiam la moduso estas ŝanĝita, povas esti perdita (malfeliĉa funkcio de la fina stacio ĉe iuj sistemoj). La sola kialo por uzi -reseton estas se via agado dependas de kurado en kuirita reĝimo.

La -eĥa flago sendas signojn, kiuj kunigas la jenan ŝablonon reen al la procezo, kiu generis ilin laŭ ĉiu leganto . Ĉi tio povas esti utila kiam la uzanto bezonas vidi reagojn de parte tajpaj ŝablonoj.

Se ŝablono estas eĥata sed eventuale malsukcesas kunigi, la signoj estas senditaj al la generita procezo . Se la generita procezo tiam eĥos ilin, la uzanto vidos la signojn dufoje. -eĥo verŝajne nur taŭgas en situacioj kie la uzanto estas neprobabla ne kompletigi la ŝablonon. Ekzemple, la sekva ekstrakto estas de rftp, la rekursiva-ftp-skripto, kie la uzanto estas instigita por eniri ~ g, ~ p, aŭ ~ l, akiri, meti, aŭ listigi la nunan dosierujon rekursie. Ĉi tiuj estas tre malproksime de la normalaj ftp-komandoj, ke la uzanto neŝajne tajpas ~ sekvas ion ajn, krom erare, en tiu kazo, ili verŝajne simple ignoros la rezulton ĉie.

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

La -nobuffer- flago sendas signojn, kiuj kunigas la jenan ŝablonon al la eliga procezo, kiel legantoj .

Ĉi tio estas utila kiam vi deziras lasi programon reakiri la ŝablono. Ekzemple, la sekvajxo povus esti uzata por kontroli, kie persono markas (modemo de stilo Hayes). Ĉiufoje "atd" estas vidita la skriptoj-registroj la resto de la linio.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" reveno metas $ log "[formato de horloĝo [sekundoj de horloĝo]: dialed $ interact_out (1, string)"} interact -nobuffer "atd" lognumber

Dum interagado , antaŭa uzo de log_user estas ignorita. En aparta, interagado devigos ĝian rezulton esti ensalutinta (sendita al la norma eligo) ĉar ĝi supozas, ke la uzanto ne volas interagi blinde.

La -a flago faras ke iuj sekvaj ŝlosilaj korpoj estu aplikitaj al la eligo de la nuna procezo . Ĉi tio povas esti utila, ekzemple, kiam oni traktas kun gastigantoj, kiuj sendas nedeziratajn signojn dum telnet-sesio.

Defaŭlte, interagado atendas ke la uzanto estu skribanta stdin kaj leganta stdout de la Atendprocezo mem. La -u- flago (por "uzanto") faras interagadon serĉi la uzanton kiel la procezon nomatan per ĝia argumento (kiu devas esti generita id).

Ĉi tio permesas du ne rilatajn procezojn esti kunigitaj sen uzi eksplicitan buklon. Por helpi pri elpurigado, Atendu ke diagnozoj ĉiam iru al stderr (aŭ stdout por certaj ensalutado kaj elpurigado de informoj). Por la sama kialo, la komandila interpretilo legos interagie de stdin.

Ekzemple, la sekva fragmento kreas ensalutan procezon . Tiam ĝi dials la uzanto (ne montrita), kaj fine kunligas la du kune. Kompreneble, ĉiu procezo povas esti anstataŭigita por ensaluto. Ŝelo, ekzemple, permesus al la uzanto labori sen provizi konton kaj pasvorton.

generi ensaluto ensaluto ensaluto $ spawn_id krei tipmodemo # reklami reen al uzanto # konekti uzanton por ensaluti interagado -u $ ensaluto

Por sendi eliron al multnombraj procezoj, listigu ĉiun liston de identigiloj antaŭformita per -output- flago. Enigo por grupo de eligo-generitaj idoj povas esti difinita per kreita id-listo prefacita per -input- flago. (Ambaŭ -input kaj -output povas preni listojn en la sama formo kiel la -i- flago en la atendanta komando, krom ke any_spawn_id ne signifas interagadon .) Ĉiuj sekvaj flagoj kaj kordoj (aŭ ŝablonoj) apliki al ĉi tiu enigo ĝis alia - enigo aperas. Se neniu -input aperas, -output implicas "-input $ user_spawn_id -output". (Simile, kun ŝablonoj, kiuj ne havas -input .) Se unu -input estas precizigita, ĝi anstataŭigas $ user_spawn_id. Se dua -inputo estas specifita, ĝi anstataŭigas $ spawn_id. Pliaj -inputaj flagoj povas esti specifitaj.

La du implicitaj enmetaj procezoj nepre havas siajn elirojn specifitajn kiel $ spawn_id kaj $ user_spawn_id (en reverso). Se -input- flago aperas kun ne- komputila flago, karakteroj de tiu procezo estas forĵetitaj.

La -i- flago prezentas anstataŭon por la nuna spawn_id kiam neniu alia -input-putotaj flagoj estas uzataj. A -i flago implicas -a flago.

Eblas ŝanĝi la procezojn, kiuj estas interagataj per uzado de nerektajn idojn. (Neprudentaj komercaj idoj estas priskribitaj en la sekcio pri la atendanta komando.) Indirectaj spawn ids povas esti specifitaj per -i, -u, -input, aŭ -output-flagoj.

interpretisto [args]
kaŭzas ke la uzanto estu interaktive instigita por Atendu kaj Tcl-komandoj. La rezulto de ĉiu komando estas presita.

Agoj kiel rompi kaj daŭrigi kaŭzi regulstrukturojn (te, por , proc ) konduti en la kutima maniero. Tamen rondveturo kaŭzas interpretiston por reveni al sia alvokanto, dum inter_returno kaŭzas interpretiston por kaŭzi revenon en sia alvoko. Ekzemple, se "proc foo" vokis interpretisto, kiu tiam ekzekutis la agon inter_return , proco revenus. Ajna alia komando kaŭzas interpretiston por daŭre peti novajn komandojn.

Defaŭlte, la pruvo enhavas du entjerojn. La unua entjero priskribas la profundon de la pritaksado (tio estas, kiom fojoj nomis Tcl_Eval). La dua entjero estas la Tcl-historio-identigilo. La pruvo povas esti difinita per difino de procedo nomita "prompt1" kies reveno valoro fariĝas la sekva rekompenco. Se deklaro havas malfermajn citaĵojn, parencojn, krampojn aŭ krampojn, malĉefa pruvo (defaŭlte "+>") estas sendita al nova linio. La malĉefa programo povas esti difinita per difino de procedo nomita "prompt2".

Dum interpretisto , kuirita reĝimo estas uzata, eĉ se la alvoko uzis krudan modon.

Se stdin estas fermita, la interpretisto revenos, se la flago estas uzata, en kies kazo la sekva argumento estas alvokita.

log_file [args] [[-a] dosiero]
Se dosiernomo estas provizita, log_file registros transskribon de la kunsido (komencante ĉe tiu punkto) en la dosiero. log_file ĉesos registri se neniu argumento estas donita. Ajna antaŭa log-dosiero estas fermita.

Anstataŭ dosiernomo, Tcl-dosier-identigilo povas esti provizita per la -open-leaveopen- flagoj. Ĉi tio estas simila al la germana komando. (Vidu pliboniĝon por pli da informoj.)

La -a flago devigas elsendon esti ensalutita, kiu estis subpremita de la log_user- komando.

Defaŭlte, la komando de log_file apas al malnovaj dosieroj prefere ol detranĉante ilin, por la oportuneco deŝalti ensalutadon kaj multfoje en unu sesio. Por detranĉi dosierojn, uzu la -notendan flagon.

La nuna flago kaŭzas log_file por redoni priskribon de la plej lastatempaj ne-informaj argumentoj donitaj.

log_user -info | 0 | 1
Defaŭlte, la sendo / atendu dialogo estas ensalutinta al stdout (kaj registrilo se ĝi estas malfermita). La ensaluto al stdout estas malebligata per la komando "log_user 0" kaj reenentigita per "log_user 1". Ensaluti al la dosierujo estas senŝanĝa.

La nula flago kaŭzas log_user por redoni priskribon de la plej lastatempaj ne-informaj argumentoj donitaj.

match_max [-d] [-i spawn_id] [grandeco]
difinas la grandecon de la bufro (en bajtoj) uzata interne atendante . Sen argumento de grandeco , la nuna grandeco estas redonita.

Kun la -d flago, la defaŭlta grandeco estas aro. (La komenca defaŭlto estas 2000.) Kun la -i flago, la grandeco estas difinita por la nomo nomita spawn, alie ĝi estas agordita por la nuna procezo .

overlay [- # spawn_id] [- # spawn_id] [...] programo [args]
ekzekutas "programprogramojn " anstataŭ la nuna Atendo- programo, kiu finiĝas. Nuda argumento argumentas fortikaĵon antaŭ la nomo de la komando kvazaŭ ĝi estus ensalutilo. Ĉiuj spawn_ids estas fermitaj krom tiuj, nomataj kiel argumentoj. Ĉi tiuj estas mapitaj al la nomitaj dosier-identigiloj.

Spawn_ids estas mapitaj al dosieraj identigiloj por la nova programo por heredi. Ekzemple, la sekva linio kuras ŝakon kaj permesas ĝin esti kontrolita de la nuna procezo - diru, ŝako majstro.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id ŝako

Ĉi tio estas pli efika ol "interagi -u", tamen, ĝi oferas la kapablon fari programitan interagon, ĉar la Atendprocezo jam ne regas.

Notu, ke neniu kontrola fina stacio estas provizita. Tiel, se vi malŝlosi aŭ remap norma enigo, programoj, kiuj laboras kontrolon (ŝeloj, ensaluto, ktp) ne funkcios konvene.

paridad [-d] [-i spawn_id] [valoro]
difinas ĉu paritato devas esti retenita aŭ forigita de la eligo de naskitaj procezoj. Se valoro estas nulo, paritato estas malŝparita, alie ĝi ne estas forigita. Sen valora argumento, la nuna valoro estas redonita.

Kun la -d flago, la defaŭlta paritato valoro estas aro. (La komenca defaŭlto estas 1, te, la paritato ne estas forigita.) Kun la -i- flago, la valoro de paridad estas difinita por la nomo nomita spawn, alie ĝi estas agordita por la nuna procezo .

remove_nulls [-d] [-i spawn_id] [valoro]
difinas ĉu nulloj estas retenitaj aŭ forigitaj el la eligo de generitaj procezoj antaŭ ŝablono kongruaj aŭ konservantaj en la variablo expect_outinteragado . Se valoro estas 1, nuloj estas forigitaj. Se valoro estas 0, nulaj ne estas forigitaj. Sen valora argumento, la nuna valoro estas redonita.

Kun la -d flago, la defaŭlta valoro estas aro. (La komenca defaŭlto estas 1, te, nulls estas forigitaj.) Kun la -i flago, la valoro estas difinita por la nomata spawn id, alie ĝi estas agordita por la nuna procezo .

Ĉu aŭ ne nuligoj estas forigitaj, Atendu registros nula bytoj al la protokolo kaj stdout.

sendu [-flags] ŝnuron
Sendas ĉenon al la nuna procezo . Ekzemple, la komando

sendu "saluton mondon \ r"

sendas la signojn, helloworld al la nuna procezo . (Tcl inkluzivas printf- simila komando (nomata formato ) kiu povas konstrui arbitre kompleksajn ŝnurojn.)

Karakteroj estas senditaj tuj, kvankam programoj kun linio-bublita enigo ne legos la signojn, ĝis oni sendos rondan karakteron. Revenanta karaktero estas signifita "\ r".

La flago devigas la sekvan argumenton esti interpretita kiel ĉeno anstataŭ flago. Ĉiu ŝnuro povas esti antaŭita per "-" ĉu aŭ ne vere aspektas kiel flago. Ĉi tio provizas fidindan mekanismon por specifi variajn ŝnurojn, sen esti forĵetitaj de tiuj, kiuj hazarde aspektas kiel flagoj. (Ĉiuj kordoj komencantaj per "-" estas rezervitaj por estontaj opcioj.)

La -i- flago deklaras, ke la ĉeno estas sendita al la nomata spawn_id. Se la spawn_id estas user_spawn_id , kaj la fina stacio estas en kruda maniero, novaj linioj en la ĉeno tradukiĝas por reveni-lineaj sekvencoj por ke ili aspektu kvazaŭ la fina stacio estis en kuirita reĝimo. La - flago malŝaltas ĉi tiun tradukon.

La- nula flago sendas nulajn signojn (0 bajtoj). Defaŭlte, unu nula estas sendita. Entjero povas sekvi la -un por indiki kiom da nulaj sendoj .

La -breka flago generas rompiĝon. Ĉi tio nur havas senton, se la generita ido aludas al tty-aparato malfermita per "spawn -open". Se vi kreis procezon kiel tipon, vi devas uzi la konvencion de tipo por generi rompon.

La -s- flago devigas elsendon esti sendita "malrapide", tiel eviti la komunan situacion kie komputila eksterordinara eniga bufro, kiu estis desegnita por homo, kiu neniam elsendus la saman bufro . Ĉi tiu eligo estas kontrolita per la valoro de la variablo "send_slow", kiu prenas du erojn. La unua elemento estas entjero kiu priskribas la nombron de bajtoj por sendi atomike. La dua elemento estas vera nombro, kiu priskribas la nombron de sekundoj per kiuj la atomaj sendoj devas esti apartigitaj. Ekzemple, "aro send_slow {10 .001}" devigus "send -s" sendi kordoj kun 1 milisekono inter ĉiu 10 signoj senditaj.

La -h- flago devigas elsendon (iom) kiel homa fakte tajpanta. Homaj malfruoj aperas inter la signoj. (La algoritmo estas bazita sur distribuo de Weibull, kun modifoj por konveni ĉi aparta apliko.) Ĉi tiu eligo estas kontrolita per la valoro de la variablo "send_human", kiu ricevas liston de kvin elementoj. La du unuaj elementoj estas mezumera interara tempo de karakteroj en sekundoj. La unua estas uzata defaŭlte. La dua estas uzita ĉe vortaj finoj, por simuli la subtilajn paŭzojn, kiuj foje okazas ĉe tiaj transiroj. La tria parametro estas mezuro de variablo kie .1 estas sufiĉe variebla, 1 estas racie variebla, kaj 10 estas sufiĉe variebla. La ekstremoj estas 0 al malfinio. La du lastaj parametroj estas, respektive, minimuma kaj maksimuma interara tempo. La minimuma kaj maksimuma uzo estas lasta kaj "klipo" la fina tempo. La fina mezumo povas esti sufiĉe malsama al la donita mezumo se la minimuma kaj maksimuma klipo sufiĉas valorojn.

Ekzemple, la sekva komando emulatas rapida kaj konsekvenca tipisto:

agordi send_human {.1 .3 1 .05 2} sendu -h "Mi malsatas. Ni tagiĝu."

dum la sekvajxo povus esti pli taŭgaj post pendado:

agordi send_human {.4 .4 .2 .5 100} sendu -h "Goodd party lash night!"

Rimarku, ke eraroj ne estas simulataj, kvankam vi povas agordi erarojn pri korektaj situacioj per enigo de eraroj kaj korektoj en senda argumento.

La flagoj por sendi nulajn signojn, por sendi rompojn, devigi malrapidan rezulton kaj por hom-stilo eligo estas reciproke ekskluzivaj. Nur la unu difinita laste estos uzata. Krome, neniu kadra argumento povas esti specifita per la flagoj por sendi nulajn signojn aŭ rompojn.

Estas bona ideo antaŭi la unuan sendon al procezo atendante . atendu , ke la procezo komenciĝos, dum la sendo ne povas. En aparta, se la unua sendo finiĝas antaŭ ol la procezo komenciĝas kurante, vi kuras la riskon, ke viaj datumoj ignoritaj. En situacioj kie interagaj programoj ofertas neniun komencan promeson, vi povas antaŭen sendi al vi malfruon kiel:

# Por eviti ke la pirantoj konsilas pri kiel eniri, # ĉi tiu sistemo ne pripensas ekstera pasvorto. # Atendu 5 sekundojn por ekzek kompletigi spawn telnet very.secure.gov sleep 5 send password \ r

exp_send estas alias por sendi. Se vi uzas Esperanton aŭ iu alia varianto de Atendu en la Tk-medio, sendo estas difinita de Tk por tute malsama celo. exp_send estas provizita por kongruo inter medioj. Similaj aliasoj estas provizitaj por aliaj komandoj de aliaj Atendaj sendoj.

send_error [-flags] kordo
estas kiel sendo , escepte, ke la eligo estas pli sendita ol la nuna procezo .

send_log [-] kordo
estas kiel sendi , krom ke la ŝnuro nur sendas al la protokolosiero (vidu log_file .) La argumentoj estas ignoritaj se neniu protokolo estas malfermita.

send_tty [-flags] kordo
estas kiel sendi , krom ke la eligo estas sendita al / dev / tty prefere ol la nuna procezo .

send_user [-flags] kordo
estas kiel sendo , krom ke la eligo estas sendita al stdout anstataŭ la nuna procezo .

dormu sekundojn
kaŭzas la skripton dormi pro la donita kvanto da sekundoj. Secondoj povas esti dekuma nombro. Interrompoj (kaj Tk-eventoj, se vi uzas Esperanton) estas procesitaj dum Atendu dormi.

programo [args] programo [args]
kreas novan procezon kurante "programo args". Ĝiaj stdin, stdout kaj stderr estas konektitaj al Atendu, por ke ili estu legataj kaj skribitaj de aliaj Atendaj komandoj. La rilato rompas proksime aŭ se la procezo mem fermas iujn el la dosier-identigiloj.

Kiam procezo komenciĝas per genio , la variablo spawn_id estas difinita al priskribilo, kiu rilatas al tiu procezo . La procezo priskribita de spawn_id konsideras la "nunan procezon ". spawn_id povas esti legita aŭ skribita, efektive provizanta laborpostrolon.

user_spawn_id estas tutmonda variablo enhavanta priskribon, kiu rilatas al la uzanto. Ekzemple, kiam spawn_id estas agordita al ĉi tiu valoro, atendu konduti kiel expect_user .

.I error_spawn_id estas tutmonda variablo enhavanta priskribon, kiu rilatas al la norma eraro. Ekzemple, kiam spawn_id estas agordita al ĉi tiu valoro, sendu kondutojn kiel send_error .

tty_spawn_id estas tutmonda variablo enhavanta priskribon, kiu rilatas al / dev / tty. Se / dev / tty ne ekzistas (kiel ekzemple en cron, ĉe aŭ batch script), tiam tty_spawn_id ne estas difinita. Ĉi tio povas esti provita kiel:

se {[info vars tty_spawn_id]} {# / dev / tty exists} else {# / dev / tty ne ekzistas # probable en cron, grupo, aŭ ĉe skripto}

naskas revenas la UNIU- procezo id. Se neniu procezo estas kreita, 0 estas redonita. La ŝanĝiĝema spawn_out (sklavo, nomo) estas difinita al la nomo de la pty-sklavo-aparato.

Defaŭlte, kreu eĥojn la komandnomon kaj argumentojn. La nuna flago ĉesas sin fari.

La konzolo-flago kaŭzas konzolon-rezulton por esti redirektita al la generita procezo . Ĉi tio ne estas subtenata sur ĉiuj sistemoj.

Interne, spawn uzas pty, komence la saman formon kiel la tty de la uzanto. Ĉi tio estas pli inicialigita tiel ke ĉiuj agordoj estas "senkuraĝaj" (laŭ stty (1)). Se la variablo stty_init estas difinita, ĝi estas interpretita laŭ la stilo de stty-argumentoj kiel pli agordo. Ekzemple, "aro stty_init raw" kaŭzos pliajn terminalojn de naskitaj procezoj por komenci en kruda maniero. -notikopipo saltas la komencaĵon bazita sur la uzanto de tty. -notinite eksaltas la " malplenan " komencaĵon.

Kutime, generi prenas malmultan tempon por ekzekuti. Se vi rimarkas, ke ĝi prenas gravan kvanton da tempo, ĝi verŝajne renkontas ptys, kiuj estas kudritaj. Kelkaj provoj kuras en ptys por eviti entanglements kun errantaj procezoj. (Ĉi tiuj prenas 10 sekundojn per poŝtita pty.) Running Atendu per la -d- opcio montriĝos se Atendu trovos multajn ptys en neparaj ŝtatoj. Se vi ne povas mortigi la procezojn, al kiuj ĉi tiuj ptys estas alfiksitaj, via sola reto povas rekomenci.

Se programo ne sukcese sukcesiĝas, ĉar ekzec (2) malsukcesas (ekz. Kiam programo ne ekzistas), erara mesaĝo estos redonita per la sekva interagadoatendu komandon kvazaŭ programo ekzekutis kaj produktis la eraran mesaĝon kiel eligo. Ĉi tiu konduto estas natura konsekvenco de la efektivigo de genoj . Interne, generitaj forkoj, post kiuj la generita procezo havas neniun manieron komuniki kun la originala Atendprocezo krom per komunikado tra la spawn_id.

La -propa flago kaŭzas la sekvan argumenton esti interpretita kiel Tcl-dosier-identigilo (tio estas, revenita per malferma .) La generita ido povas tiam esti uzata kvazaŭ ĝi estis generita procezo . (La dosier-identigilo ne plu uzu.) Ĉi tio permesas trakti krudajn aparatojn, dosierojn kaj tuberojn kiel generitajn procezojn sen uzi pty. 0 denove indikas, ke ne ekzistas asociita procezo . Kiam la ligo al la generita procezo estas fermita, do estas la identigilo de Tcl-dosiero. La -leaveopen- flago estas simila al -open krom tio, ke -leaveopeno kaŭzas ke la dosier-identigilo restos malfermita eĉ post kiam la aŭtomata ido estas fermita.

La -tita flago kaŭzas ke pty estu malfermita sed neniu procezo kreiĝis. 0 denove indikas, ke ne ekzistas asociita procezo . Spawn_id estas agordita kiel kutime.

La ŝanĝiĝema spawn_out (sklavo, fd) estas fiksita al dosier-identigilo responda al la pty-sklavino. Ĝi povas esti fermita per "fermi-ŝlosi".

La flago- signore nomumas signalon por esti ignorita en la generita procezo . Alie, signaloj ricevas la defaŭltan konduton. Signaloj estas nomataj kiel en la kaptilo , krom ke ĉiu signalo postulas apartan flagon.

Strace-nivelo
kaŭzas sekvajn deklarojn esti presitaj antaŭ esti ekzekutitaj. (Tcl's trace command traces variables.) Nivelo indikas kiom malproksime en la alvoko stack por spuri. Ekzemple, la sekva komando kuras Atendu dum traktado de la unuaj 4 niveloj de alvokoj, sed neniu sub tio.

atendu -c "strace 4" script.exp

La-flago kaŭzas strace por redoni priskribon de la plej lastatempaj ne-informaj argumentoj donitaj.

stty args
Ŝanĝas finaĝajn modojn simile al la eksterordinara komando.

Defaŭlte, la kontrola fina stacio estas alirita. Aliaj fina stacioj povas esti aliritaj per "Aplikoj por statuso reveni ĝin kiel rezulto de la komando. Se neniu statuso estas petita kaj al la kontrola terminalo aliras, la antaŭa statuso de la krudaj kaj eĥaj atributoj estas redonita en formo kiu poste povas esti uzata de la komando.

Ekzemple, la krudajkrudaj argumentoj metas la finaĵon en krudan modon. La argumentoj -ĉukuiritaj metas la finaĵon en kuiritan reĝimon. La argumentoj eĥo kaj -echo metas la finaĵon en eĥon kaj neeĥan reĝimon respektive.

La sekva ekzemplo ilustras kiel temporalmente malebligi eĥon. Ĉi tio povus esti uzata en alie aŭtomataj skriptoj por eviti enmeti pasvortojn en ili. (Vidu pliajn diskutojn ĉi-sube sub EXPECT HINTS sube.)

stty -echo send_user "Pasvorto:" expect_user -re "(. *) \ n" starigis pasvorton $ expect_out (1, string) stty echo

sistemo args
donas args al sh (1) kiel enigo, kvazaŭ ĝi estis tajpita kiel komando de fina stacio. Atendu atendas ĝis la ŝelo finiĝas. La statuso de reveno de sh estas manipulita de la sama maniero, ke ekzek manipulas sian revenon.

Kontraŭe al ekzec, kiu redirektas stdin kaj stdout al la skripto, la sistemo ne redirektas (krom tio, kio estas indikita per la kordo mem). Tiel, ĝi eblas uzi programojn, kiuj devas paroli rekte al / dev / tty. Por la sama kialo, la rezultoj de la sistemo ne estas registritaj en la registro.

timestamp [args]
Revenas tempon. Sen argumentoj, la nombro da sekundoj ekde la tempo estas redonita.

La -formata flago prezentas ĉenon, kiu estas redonita, sed kun anstataŭigoj faritaj laŭ la reguloj de POSIX por strftime. Ekzemple% a estas anstataŭigita per mallongigita labortago (tio estas, Sat). Aliaj estas:

% mallongigita labortago nomo% Plena labortago nomo% b mallongigita monato nomo% B plena monato nomo% c dato-tempo kiel en: Mon Oct 6 11:45:56 1993% d tago de la monato (01-31% H horo (00-23)% I horo (01-12)% j tago (001-366)% m monato (01-12)% M minuto (00-59)% p am aŭ pm% S dua (00-61) % u tago (1-7, lundo estas unua tago de semajno)% U semajno (00-53, unua dimanĉo estas unua tago de semajno unu)% V semajno (01-53, ISO 8601 stilo)% w tago (0- 6)% W semajno (00-53, unua lundo estas unua tago de semajno unu)% x dato-tempo kiel: Wed Oct 6 1993% X kiel en: 23:59:59% jaro (00-99) % Jaro kiel en: 1993% Z timezone (aŭ nenio se ne determinate) %% al nuda procento signo

Aliaj% specifoj estas nedifinitaj. Aliaj gravuloj pasos per senŝanĝaj. Nur la loko de C estas subtenata.

La -sekiga flago enkondukas kelkajn sekundojn ekde la tempo por esti uzita kiel fonto de kiu al formato. Alie, la nuna tempo estas uzata.

La -gmt- flago devigas tempon de tempo por uzi la GMT- horzonon. Sen flago, la loka tempozono estas uzata.

kaptilo [[komando] signaloj]
kaŭzas la donitan komandon esti ekzekutita ĉe estonta ricevo de iu ajn el la donitaj signaloj. La komando estas ekzekutita en la tutmonda medio. Se la komando forestas, la signala ago estas redonita. Se komando estas la ĉeno SIG_IGN, la signaloj estas ignoritaj. Se la komando estas la ŝnuro SIG_DFL, la signaloj estas rezulto al la sistemo defaŭlta. signaloj estas aŭ unu signalo aŭ listo de signaloj. Signaloj povas esti specifitaj nombre aŭ simbole kiel signalo (3). La prefikso "SIG" povas esti preterlasita.

Sen argumentoj (aŭ la argumento - nombro), kaptilo redonas la signalon nombro de la kaptilo-komando nun ekzekutita.

La -kodo- flago uzas la rondan kodon de la komando anstataŭ kia ajn kodo Tcl estis revenonta kiam la komando origine funkciis.

La -interpa flago kaŭzas la komandon esti taksata uzanta la interpretiston aktiva kiam la komando komenciĝis kuŝante prefere ol kiam la kaptilo estis deklarita.

La nomo-flago kaŭzas la kaptilkomandon redoni la signan nomon de la kaptilo-komando nun ekzekutita.

La -max- flago kaŭzas la kaptilkomandon redoni la plej grandan signan numeron, kiu povas esti agordita.

Ekzemple, la komando "kaptilo {send_user" Ouch! "} SIGINT" presos "Ouch!" Ĉiufoje la uzanto premas ^ C.

Defaŭlte, SIGINT (kiu kutime povas esti generita premante ^ C) kaj SIGTERM kaŭzas Atendi eliri. Ĉi tio estas pro la sekva kaptilo, kreita defaŭlte kiam Atendo komenciĝas.

kaptilo elirejo {SIGINT SIGTERM}

Se vi uzas la -D-flagon por komenci la elpurigilon, SIGINT estas redifinita por komenci la interaga elpurigilo. Ĉi tio estas pro la sekva kaptilo:

kaptilo {exp_debug 1} SIGINT

La elpurigilo povas esti ŝanĝita per fiksado de la medio variablo EXPECT_DEBUG_INIT al nova kaptilo-komando.

Vi povas, kompreneble, forĵeti ambaŭ el ĉi tiuj nur aldonante trapkomandojn al via skripto. En aparta, se vi havas vian propran "kaptilon eliri SIGINT", ĉi tio anstataŭos la elpurigilon. Ĉi tio estas utila se vi volas eviti ke la uzantoj tute ne atingas la elpurigilon.

Se vi volas difini vian propran kaptilon sur SIGINT sed ankoraŭ kaptas al la elpurigilo kiam ĝi funkcias, uzu:

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

Alternative, vi povas kapti al la elpurigilo uzante alian signalon.

kaptilo ne lasos vin forĵeti la agon por SIGALRM ĉar ĉi tio estas uzata interne por Atendi . La malkonekti komandaj aroj SIGALRM al SIG_IGN (ignori). Vi povas reenigebligi ĉi tion kondiĉe ke vi malŝaltas ĝin dum postaj komercaj komandoj.

Vidu signalon (3) por pliaj informoj.

atendi [args]
malfruoj ĝis finita procezo (aŭ la nuna procezo, se neniu estas nomata) finiĝas.

atendi normale redonas liston de kvar entjeroj. La unua entjero estas la pid de la procezo atendata. La dua (entjeroj, entjeras) estas la (responda, respektiva) nuna ido La tria entjero estas -1 se okazis operaciuma eraro aŭ 0 alie. Se la tria entjero estis 0, la kvara entjero estas la statuso redonita de la generita procezo . Se la tria entjero estis -1, la kvara entjero estas la valoro de errno difinita per la mastruma sistemo. La tutmonda variablo errorCode ankaŭ estas aro.

Pliaj elementoj aperos ĉe la fino de la rondvaloro de atendo . Laŭvola kvina elemento identigas klason de informoj. Nuntempe, la sola ebla valoro por ĉi tiu elemento estas CHILDKILLED en kies kazo la sekvaj du valoroj estas la signa nomo de C-stilo kaj mallonga teksta priskribo.

La -i- flago deklaras la procezon atendi responda al la nomata spawn_id (NE la procezo id). Ene de SIGCHLD-prilaborado, eblas atendi iun ajn produktitan procezon per uzado de la ido -1.

La nuna flago faras ke la atendo revenu tuj kun la indiko de sukcesa atendo. Kiam la procezo eliras (poste), ĝi aŭtomate malaperos sen neceso de eksplicita atendo.

La atendo komando ankaŭ povas esti uzata atendo por forkita procezo uzante la argumentojn "-i -1". Kontraste kun ĝia uzo kun generitaj procezoj, ĉi tiu komando povas esti ekzekutita iam ajn. Ne estas kontrolo pri kiu procezo rikoltiĝas. Tamen, la ripara valoro povas esti kontrolita por la procezo id.

LIBRAROJ

Atendu aŭtomate pri du korpigitaj bibliotekoj por Atendaj skriptoj. Ĉi tiuj estas difinitaj de la adresaroj nomataj en la variabloj exp_library kaj exp_exec_library. Ambaŭ devas enhavi utilecajn dosierojn, kiuj povas uzi aliajn skriptoj.

exp_library enhavas arkitekturajn sendependajn dosierojn. exp_exec_library enhavas dependajn arkivojn de arkitekturo. Depende de via sistemo, ambaŭ dosierujoj povas esti tute malplenaj. La ekzisto de la dosiero $ exp_exec_library / cat-buffers priskribas ĉu via / bin / cat buffers defaŭlte.

PRETTY-PRINTING

Vida difino estas havebla por belaj-presaj Atendaj skriptoj. Konsiderante la vindan difinon provizitan per la Atendo- distribuado estas ĝuste instalita, vi povas uzi ĝin kiel:

vgrind -lexpect-dosiero

Ekzemploj

Ne multe ŝajnas kiel meti ĉion kune, kion priskribas la paĝo de la homo . Mi instigas vin legi kaj provi la ekzemplojn en la ekzemplo dosierujo de la Atendo- dissendo. Kelkaj el ili estas realaj programoj. Aliaj estas simple ilustraj pri iuj teknikoj, kaj kompreneble, paro estas nur rapidaj hakoj. La INSTALL-dosiero havas rapidan superrigardon de ĉi tiuj programoj.

La Atendaj dokumentoj (vidu SEE ALSO) ankaŭ estas utilaj. Dum iuj artikoloj uzas sintakson respondantan al antaŭaj versioj de Atendo, la akompanaj raciaĵoj ankoraŭ estas valida kaj eniras multe pli da detaloj ol ĉi tiu paĝo.

CAVEATS

Etendoj povas kolizii kun la nomoj de Expect. Ekzemple, sendo estas difinita de Tk por tute malsama celo. Tial, la plej multaj el la Atendaj komandoj ankaŭ estas haveblaj kiel "exp_XXXX". Komandoj kaj variabloj komencantaj per "exp", "inter", "spawn" kaj "timeout" ne havas aliasojn. Uzu la etenditajn komandajn nomojn, se vi bezonos ĉi tiun kongruon inter medioj.

Atendu prenas sufiĉe liberalan vidadon pri skopado. En aparta, variabloj legataj per komandoj specifaj al la Atendprogramo serĉas unue el la loka medio kaj se ne troveblas en la tutmonda medio. Ekzemple, ĉi tio evitas la bezonon meti "tutmondan tempon" en ĉiuj proceduroj, kiujn vi skribas, kiujn vi uzas atendi . Aliflanke, variabloj skribitaj estas ĉiam en la loka medio (krom se "tutmonda komando estis elsendita"). La plej ofta problemo ĉi tiu kaŭzas estas kiam ekzekutado estas ekzekutita en proceduro. Ekstere de la proceduro, spawn_id jam ne ekzistas, do la generita procezo ne plu atingeblas simple pro scopado. Aldoni "tutmondan spawn_id" al tia proceduro.

Se vi ne povas aktivigi la multispanta kapablo (tio estas, via sistemo ne subtenas nek elektitan (BSD *. *), Enketo (SVR> 2), nek io ekvivalenta), Atendu nur povos kontroli unuprokon samtempe. En ĉi tiu kazo, ne provu agordi spawn_id , nek vi devus ekzekuti procezojn per ekzek dum kreita procezo funkcias. Krome, vi ne povos atendi el diversaj procezoj (inkluzive la uzanton kiel unu) samtempe.

Finaraj parametroj povas havi grandan efikon sur skriptoj. Ekzemple, se skripto estas skribita por serĉi eĥon, ĝi misfaŝos se eĥado estas malŝaltita. Tial, Atendu fortigas senfinajn parametrojn de fina stacio. Bedaŭrinde, ĉi tio povas fari aferojn malagrablaj por aliaj programoj. Ekzemple, la emaksa ŝelo volas ŝanĝi la "kutimajn" mapojn: novaj linioj akompanas novajn liniojn anstataŭ kaleŝaj-revenaj novaj linioj, kaj eĥado estas malŝaltita. Ĉi tio ebligas uzi unu emakojn por redakti la enigan linion. Bedaŭrinde, Atendu eble ne povas diveni ĉi tion.

Vi povas peti, ke Atendu, ke vi ne anstataŭigu ĝian defaŭltan agordon de fina staciaj parametroj, sed vi devas esti tre zorga skribi skriptoj por tiaj medioj. En la kazo de emakso, evitu dependi de aferoj kiel eĥado kaj finfinaj mapoj.

La komandoj, kiuj akceptas argumentojn en unuopa listo ( atendas variantojn kaj interagojn ) uzas heurismon por decidi ĉu la listo estas fakte unu argumento aŭ multaj. La heŭristo povas malsukcesi nur en la kazo, kiam la listo efektive reprezentas solan argumenton, kiu havas multajn enigitajn kun nulaj spacaj karakteroj inter ili. Ĉi tio ŝajnas sufiĉe neprobabla, tamen la argumento "-nobrace" povas esti uzata por devigi unu argumenton esti manipulita kiel ununura argumento. Ĉi tio eble povus esti uzata per maŝino generita Atendkodo. Simile, -brace devigas solan argumenton por esti tenata kiel multnombraj ŝablonoj / agoj.

CIMOJ

Ĝi vere klopodis nomi la programon "sekso" (por "Smart EXec" aŭ "Send-Expect"), sed pli bona (aŭ eble nur Puritanismo) triumfis.

En iuj sistemoj, kiam konko estas kreita, ĝi plendas pri ne povi aliri la tty sed kuras de ĉiuj manieroj. Ĉi tio signifas, ke via sistemo havas mekanismon por gajni la kontrolon, kiun Atendo ne scias. Bonvolu ekscii, kio estas, kaj sendu al mi ĉi tiun informon.

Ultrix 4.1 (almenaŭ la plej lastaj versioj ĉi tie) konsideras templojn de pli ol 1000000 por esti ekvivalenta al 0.

Cifereca UNIKSO 4.0A (kaj probable aliaj versioj) rifuzas atribui ptys se vi difinas SIGCHLD-traktilon. Vidu donacitan paĝon por pli da informoj.

IRIX 6.0 ne manipulas pty-permesojn ĝuste por ke se Atendu provas atribui pty antaŭe uzatan de iu alia, ĝi malsukcesas. Ĝisdatigi al IRIX 6.1.

Telnet (kontrolita nur sub SunOS 4.1.2) pendas se TERM ne estas aro. Ĉi tio estas problemo sub cron, ĉe kaj en cgi-skriptoj, kiuj ne difinas TERM. Tiel, vi devas agordi ĝin eksplicite - al kiu tipo kutime estas pala. Ĝi nur devas esti agordita al io! La sekvaj probable suferas por plej multaj kazoj.

agordi env (TERM) vt100

Tip (kontrolita nur sub BSDI BSD / OS 3.1 i386) pendas se SHELL kaj HOME ne estas agorditaj. Ĉi tio estas problemo sub cron , ĉe kaj en cgi- skriptoj, kiuj ne difinas ĉi tiujn mediajn variablojn. Tiel, vi devas agordi ilin eksplicite - al kiu tipo kutime estas pala. Ĝi nur devas esti agordita al io! La sekvaj probable suferas por plej multaj kazoj.

aro env (SHELL) / bin / sh aro env (HOME) / usr / loka / bin

Iuj implementaciones de ptys estas desegnitaj por ke la kerno forĵetas ajnan nelegitan rezulton post 10 ĝis 15 sekundoj (la nuna nombro dependas de la efektivigo) post kiam la procezo fermis la dosieron-priskribilon. Tiel Atendaj programoj kiel

Okazaŭa dormo 20 atendas

malsukcesos. Por eviti tion, alvoku ne-interagajn programojn kun ekzek- prefere ol generi . Dum tiaj situacioj estas koncepteblaj, en la praktiko mi neniam renkontis situacion, en kiu la fina eligo de vere interaga programo perdiĝus pro ĉi tiu konduto.

Aliflanke, Cray UNICOS ptys forĵetas ajnan nelegitan rezulton tuj post kiam la procezo fermis la dosieron-priskribilon. Mi raportis tion al Cray kaj ili laboras pri riparo.

Kelkfoje postulas prokrasto inter rekompenco kaj respondo, kiel kiam tty-interfaco ŝanĝas la agordojn de UART aŭ kongruas kun baud- taksoj serĉante komencajn / haltajn bitojn. Kutime, ĉio tio postulas dormi por dua aŭ du. Pli fortika tekniko devas reeferi ĝis la aparataro pretas ricevi enigon. La sekva ekzemplo uzas ambaŭ strategiojn:

sendu "rapido 9600 \ r"; dormu 1 atendu {timeout {send "\ r"; exp_continue} $ prompt}

kaptilo -kodo ne funkcios per iu ajn komando, kiu sidas en la okazaĵo de Tcl, kiel ekzemple dormo. La problemo estas, ke en la okazaĵo buklo, Tcl forĵetas la revenajn kodojn de async-eventaj manipuladistoj. Funkcio estas agordi flagon en la kaptilo-kodo. Tiam kontrolu la flagon tuj post la komando (te dormu).

La atend_background-komando ignoras -tempajn argumentojn kaj havas neniun koncepton de temploj ĝenerale.

& # 34; EXPEKTAJ HINTS & # 34;

Estas kelkaj aferoj pri Atendo, ke eble ne estas intuicia. Ĉi tiu sekcio provas trakti iujn ĉi tiujn aferojn kun kelkaj sugestoj.

Komuna atendi problemo estas kiel agnoski konkludajn ŝuldojn. Ĉar ĉi tiuj estas personecigitaj malsame de malsamaj homoj kaj malsamaj konkoj, portable aŭtomatigi rloginon povas esti malfacila sen scii la instigon. Ripara konvencio devas havi uzistojn stoki regulan esprimon priskribante sian pruvon (precipe, la finon de ĝi) en la medio variablo EXPECT_PROMPT. Kodo kiel la sekva povas esti uzata. Se EXPECT_PROMPT ne ekzistas, la kodo ankoraŭ havas bonan eblecon funkcii ĝuste.

agordi prompton "(% | # | \\ $) $"; # default prompt catch {set prompt $ env (EXPECT_PROMPT)} atendu -re $ prompt

Mi instigas vin skribi atendi ŝablonojn, kiuj inkluzivas la finon de ĉio, kion vi atendas vidi. Ĉi tio evitas la eblecon respondi demandon antaŭ vidi la tutan aferon. Krome, dum vi bone povas respondi demandojn antaŭ vidi ilin tute, se vi respondos frue, via respondo eble aperos reen en la mezo de la demando. Alivorte, la rezultanta dialogo estos ĝusta, sed aspektiĝos ruliĝita.

Plej multaj instigoj inkluzivas spacan karakteron ĉe la fino. Ekzemple, la pruvo de ftp estas 'f', 't', 'p', '>' kaj. Por egali ĉi tiun promeson, vi devas koncerni ĉiun el ĉi tiuj signoj. Estas komuna eraro ne inkluzivi la malplenan. Metu la malplenan eksplicite.

Se vi uzas ŝablonon de la formo X *, la * kongruos la tutan eliron ricevita de la fino de X al la lasta aĵo ricevita. Ĉi tio sonas intuicia sed povas esti iom malklara pro tio, ke la frazo "lasta ricevita" povas varii laŭ la rapido de la komputilo kaj la prilaborado de I / O ambaŭ per la kerno kaj la aparato-ŝoforo.

En aparta, homoj inklinas vidi programprogramon alvenante en grandegaj punktoj (atomie) kiam fakte la plej multaj programoj produktas produktadon unu linio samtempe. Supozante ĉi tio estas la kazo, la * en la ŝablono de la antaŭa alineo povas nur egali la finon de la nuna linio kvankam ŝajnas esti pli, ĉar en la momento de la matĉo, kiu estis la tuta eliro ricevita.

atendas , ne scias, ke plua eligo venos, se via ŝablono specife pripensas ĝin.

Eĉ dependante de linio-orientita bubado estas neprudenta. Ne nur programoj malofte faras promesojn pri la tipo de bubado, sed la sistemo de senkompateco povas forĵeti elsendajn liniojn por ke la linioj rompiĝu ĉe ŝajne hazarda lokoj. Tiel, se vi povas esprimi la lastajn malmultajn protokolojn kiam vi skribas ŝablonojn, tio estas saĝa fari tion.

Se vi atendas mastron en la lasta eligo de programo kaj la programo elsendas ion alian, vi ne povos detekti tion per la ŝlosila vorto. La kialo estas, ke atendu ne finiĝos - anstataŭe ĝi ricevos iom da indiko. Uzu tion anstataŭe. Eĉ pli bone, uzu ambaŭ. Tiel, se tiu linio iam ajn moviĝos, vi ne devos redakti la linion mem.

Newlines kutime konvertiĝas al kaleŝaj revenoj, lineaj sekvencoj kiam eligo de la fina stacio. Tiel, se vi deziras ŝablonon kiu klare kongruas kun la du linioj, de, diru, printf ("foo \ nbar"), vi devus uzi la mastron "foo \ r \ nbar".

Simila traduko okazas kiam oni legas de la uzanto, per expect_user . En ĉi tiu kazo, kiam vi premas revenon, ĝi estos tradukita al nova linio. Se Atendu, tiam pasas tion al programo, kiu metas sian finaĵon al kruda maniero (kiel telnet), estos problemo, ĉar la programo atendas veran rondveturon. (Kelkaj programoj estas vere pardonantaj, ke ili aŭtomate tradukos novajn liniojn al rondveturoj, sed plejparto ne.) Bedaŭrinde ne ekzistas maniero trovi, ke programo metas sian finaĵon en krudan reĝimon.

Prefere ol anstataŭe anstataŭigi novajn liniojn kun rondveturoj, la solvo estas uzi la komandon "stty raw", kiu haltos la tradukon. Rimarku, tamen, ke tio signifas, ke vi ne plu ricevos la kuiritajn redaktojn.

interagi implicite agordas vian finaĵon al kruda maniero, do ĉi tiu problemo ne ŝprucos tiam.

Ofte estas utila por stoki pasvortojn (aŭ aliajn privatajn informojn) en Atendaj skriptoj. Ĉi tio ne rekomendas, ĉar ĉio, kio estas stokita en komputilo, estas kapabla de aliri al iu ajn. Tiel, interagie proklamante pasvortojn de skripto estas pli klara ideo ol enmeti ilin laŭvorte. Tamen, foje tia enigo estas la sola ebleco.

Bedaŭrinde, la UNIX-dosier-sistemo ne havas rektan manieron krei skriptoj, kiuj estas ekzekuteblaj sed nelegeblaj. Sistemoj, kiuj subtenas fiksajn ŝildajn skriptoj, povas nerekte simuli ĉi tion:

Krei la Atendan skripton (kiu enhavas la sekretajn datumojn) kiel kutime. Faru ĝiajn permesojn 750 (-rwxr-x ---) kaj posedata de fidinda grupo, tio estas, grupo, kiu rajtas legi ĝin. Se necese, kreu novan grupon por ĉi tiu celo. Tuj poste kreu / bin / sh-skripton kun permesoj 2751 (-rwxr-s-x) posedata de la sama grupo kiel antaŭe.

La rezulto estas skripto, kiu povas esti ekzekutita (kaj legita) de iu ajn. Kiam alpreĝita, ĝi regas la Atendan skripton.

& # 34; Vidi ALSO & # 34;

Tcl (3), libexpect (3)
"Esplorante Atendon: Tcl-Based Toolkit for Automating Interactive Programs" de Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly kaj Associates, 1995.
"Atendu: Kuraci tiujn Nekontroligeblajn Trajtojn pri Interactiveco" de Don Libes, Proceedings of the Summer 1990-UNENIX-Konferenco, Anaheim, Kalifornio, la 11-a de junio, 1990.
.I "Uzante atendi Automatigi Sistemministrajn Taskojn" de Don Libes, Procedoj de la Usona Konferenco pri Grandaj Instalaj Sistemoj de 1990, Colorado Springs, Kolorado, oktobro 17-19, 1990.
.I "Tcl: Komprenebla Komandila Lingvo" de John Ousterhout, Proceedings of the Winter 1990-UNENIX-Konferenco, Vaŝingtono, Januaro 22-26, 1990 ... Mi "atendas: Skriptoj por Kontroli Interagajn Programojn" de Don Libes, Komputila Sistemoj , Vol. 4, Ne. 2, Ĵurnaloj de la Universitato de Kalifornio, novembro 1991. Mi "Regression Testing and Conformance Testing Interactive Programs", de Don Libes, Proceedings of the Summer 1992-USENIX Conference, pp. 135-144, San Antonio, TX, Junio ​​12-15, 1992.. Mi "Kibitz - Konektanta Multoblajn Interactivajn Programojn Kune", de Don Libes, Programaro - Praktiko kaj Sperto, John Wiley & Sons, West Sussex, Anglio, Vol.

23, Ne. 5, majo 1993. Mi "Defendanto por Tcl-Aplikoj", de Don Libes, Proceedings de la Tcl / Tk Workshop de 1993, Berkeley, CA, junio 10-11, 1993.

AŬTORO

Don Libes, Nacia Mezlernejo de Normoj kaj Teknologio

Konsideroj

Danke al John Ousterhout por Tcl, kaj Scott Paisley por inspiro. Danke al la kodo de autoconfiguración de Rob Savoye por Expect.

La dosiero de la HISTORIO dokumentas multe de la evoluado de atendi . Ĝi interesas legi kaj povus doni al vi pliajn informojn al ĉi tiu programaro. Danke al la homoj menciitaj en ĝi, kiuj sendis al mi erarojn kaj donis alian helpon.

Dezajno kaj efektivigo de Atendo estis pagita parte fare de la usona registaro kaj sekve estas publika havaĵo. Tamen la aŭtoro kaj NIST ŝatus kredi se ĉi tiu programo kaj dokumentado aŭ partoj de ili estas uzataj.