Linux / Unix komanda gaida

Gaidīt ir programma, kas pārrunā citas interaktīvas programmas saskaņā ar skriptu. Sekojot skriptam, gaidīt zina, ko var sagaidīt no programmas un kādai jābūt pareizai atbildei. Interpretēta valoda nodrošina atzarošanas un augsta līmeņa kontroles struktūras, lai vadītu dialogu. Turklāt, ja nepieciešams, lietotājs var kontrolēt un mijiedarboties tieši, pēc tam atkārtojot kontroli skriptā.

Expectk ir Expect un Tk maisījums. Tā uzvedas tāpat kā Expect un Tk vēlēšanās. Expect arī var izmantot tieši C vai C ++ bez Tcl.

Nosaukums "Expect" nāk no idejas par sūtīt / sagaidīt sekvences, kuras popularizē uucp, kermit un citas modema kontroles programmas. Tomēr atšķirībā no uucp, Expect ir vispārināts, lai to varētu palaist kā lietotāja līmeņa komandu, ņemot vērā jebkuru programmu un uzdevumu. Sagaidiet, ka varat vienlaikus sarunāties ar vairākām programmām.

Ko gaidīt var darīt

Piemēram, šeit ir dažas lietas, ko sagaida komanda:

Ir dažādi iemesli, kāpēc apvalks nevar izpildīt šos uzdevumus. Visi ir iespējami ar Expect.

Parasti Expect ir noderīgs, lai palaistu jebkuru programmu, kas prasa mijiedarbību starp programmu un lietotāju. Viss, kas ir nepieciešams, ir tas, ka mijiedarbību var raksturot programmīgi. Gaidīt var arī atdot kontroli lietotājam, neapturot programmas vadību. Tāpat lietotājs jebkurā laikā var atgriezties pie skripta.

Izmantošana

Expect skan cmdfile komandu izpildei sarakstā. Gaidīt var netieši atsaukties uz sistēmām, kas atbalsta #! apzīmējumu, atzīmējot skriptu kā izpildāmo un padarot pirmo rindiņu skriptā:

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

Protams, ceļam ir precīzi jāapraksta kur gaidīt dzīvību. / usr / local / bin ir tikai piemērs.

K-c karodziņš prefiksē komandu, kas tiek izpildīta pirms jebkura skripta. Komandai jābūt citētai, lai novērstu to, ka to izkliedē čaula. Šo iespēju var izmantot vairākas reizes. Vairākas komandas var izpildīt ar vienu -c, atdalot tos ar semikoloniem. Komandas tiek izpildītas tādā secībā, kādā tās parādās. Lietojot Expectk, šī opcija ir norādīta kā -command.

Ar -d karodziņš ļauj veikt dažus diagnostikas rezultātus, kas galvenokārt norāda komandu iekšējo darbību, piemēram, sagaidīt un mijiedarboties. Šim karodziņam ir tāds pats efekts kā "exp_internal 1" gaidīšanas skripta sākumā, kā arī tiek izdrukāta paredzētā versija.

Ar-D karogs ļauj izveidot interaktīvu atkļūdotāju. Jāizpilda vesels skaitlis. Atkļūdotājs uzņemsies kontroli pirms nākamās Tcl procedūras, ja vērtība nav nulle, vai ja tiek nospiests ^ C vai tiek pārtraukts pārtraukums, vai cita atbilstoša atkļūdotāju komanda parādās skriptā. Izmantojot Expectk, šī opcija ir norādīta kā - Debug.

-f liek prefiksu failu, no kura lasīt komandas. Karogs nav obligāts, jo tas ir noderīgi, tikai izmantojot #! apzīmējumu, lai komandrindā varētu tikt piegādāti citi argumenti. Izmantojot Expectk, šī opcija ir norādīta kā -file.

Pēc noklusējuma komandfails tiek lasīts atmiņā un tiek izpildīts pilnībā. Dažkārt ir vēlams lasīt failus vienā rindā vienlaikus. Lai piespiestu patvaļīgus failus apstrādāt šādā veidā, izmantojiet -b karodziņu. Lietojot Expectk, šī opcija tiek norādīta kā -buffer.

Ja virkne "-" tiek piegādāta kā faila nosaukums, tā vietā tiek nolasīta standarta ievade. Izmantojiet "./-", lai lasītu no faila, kura patiešām tiek nosaukta "-".

-i karodziņš izraisa Gaidīt interaktīvi uzaicināt komandas, nevis lasīt tās no faila. Uzvedne tiek pārtraukta, izmantojot izejas komandu vai EOF. Paraugs -i tiek pieņemts, ja neizmanto ne komandu failu, ne-c. Izmantojot Expectk, šī opcija ir norādīta kā -interaktīvā.

- var izmantot, lai nošķirtu opciju beigas. Tas ir noderīgi, ja vēlaties skriptam pārsūtīt variantu līdzīgu argumentu, to neinterpretējot ar Expect. To var ērti ievietot #! lai izvairītos no jebkura laba interpretācija ar Expect. Piemēram, tālāk tekstā argumenti mainīs sākotnējos argumentus, tostarp skripta nosaukumu.

#! / usr / local / bin / expect -

Ņemiet vērā, ka pievienojot argumentus #! Ir jāievēro parastās getopt (3) un execve (2) konvencijas. līnija

Fails $ exp_library / expect.rc automātiski tiek iegūts, ja ir, ja nav izmantots -N karodziņš. (Izmantojot Expectk, šī opcija tiek norādīta kā -NORC.) Tūlīt pēc tam fails ~ / .expect.rc tiek iegūts automātiski, ja vien nav izmantots -n karodziņš. Ja vides mainīgais DOTDIR ir definēts, tas tiek uzskatīts par direktoriju un no. Lasāms .expect.rc. Izmantojot Expectk, šī opcija ir norādīta kā -ncorc. Šī iegūšana notiek tikai pēc jebkura-c karodziņu izpildes.

-v cēloņi Paredzēt drukas versijas numuru un iziet. Atbilstošais karogs Expectk, kas izmanto garus karogu nosaukumus, ir -versions.

Neobligātie args tiek izveidoti sarakstā un saglabāti mainīgā ar nosaukumu argv un. argc tiek inicializēts ar argv garumu.

Argv0 tiek definēts kā skripta vai bināro nosaukumu, ja nav izmantots neviens skripts. Piemēram, šādi izdrukā skripta nosaukumu un pirmos trīs argumentus:

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

Komandas

Gaidīt izmanto rīku komandu valodu. Tcl nodrošina kontroles plūsmu (ja tiek pārtraukta), izteiksmes novērtējumam un vairākām citām funkcijām, piemēram, rekuperācijas un procedūras definēšanai. Komandas, kas šeit tiek izmantotas, bet nav definētas (set, if, exec), ir Tcl komandas. Expect atbalsta papildu komandas. Ja vien nav noteikts citādi, komandas atdod tukšu stīgu.

Komandas ir uzskaitītas alfabētiskā secībā, lai tās varētu ātri atrast. Tomēr jaunajiem lietotājiem var būt vieglāk sākt, lasot nārsta, nosūtīšanas, sagaidīšanas un mijiedarbības aprakstus šādā secībā.

aizvērt [-slavas] [-onexec 0 | 1] [-i spawn_id]

aizver savienojumu ar pašreizējo procesu . Lielākā daļa interaktīvo programmu atklāt EOF par to stdin un izejas; Līdz ar to parasti ir pietiekami, lai nogalinātu procesu . -i karogs paziņo, ka aizvēršanas process atbilst nosauktajam spawn_id.

Gan sagaida, gan mijiedarbosies, atklāsies, kad pašreizējais process beigsies un netieši tuvināsies, bet, ja jūs nogalināsiet procesu , teiksim, piemēram, "exec kill $ pid", jums ir nepieciešams skaidri izsaukt tuvu .

"-onexec" karodziņš nosaka, vai nūjošanas ID ir aizvērts jebkurā jaunā procesā, kas radīts, vai ja process ir pārklāts. Lai atstātu nārstojošo ID atvērtu, izmantojiet vērtību 0. Nulles vesela skaitļa vērtība padara nārstošanos aizvērtu jebkurā jaunā procesā.

Vakances karogs aizver vergu, kas saistīts ar nārsta ID. Kad savienojums ir aizvērts, pakārtotā ierīce tiek automātiski aizvērta, ja tā joprojām ir atvērta.

Neatkarīgi no tā, vai savienojums ir netieši vai nepārprotami aizvērts, jums vajadzētu piezvanīt uzgaidīt, lai notīrītu attiecīgo kodola procesa slotu. Aizvērtā komanda neuzklikšķina uz "jāgaida", jo nav garantijas, ka procesa savienojuma aizvēršana izraisīs tā izeju.

atkļūdošana [[-now] 0 | 1]

kontrolē Tcl atkļūdotāju, kas ļauj jums soli pa paziņojumiem un noteikt pārtraukuma punktus.

Bez argumentiem 1 tiek atgriezts, ja atkļūdotājs nedarbojas, pretējā gadījumā tiek atgriezts 0.

Ar vienu argumentu, atkļūdotājs ir sākts. Ar 0 argumentu atkļūdotājs tiek apturēts. Ja pirms 1 argumenta iezīmē jauno karodziņu, atkļūdotājs tiek sākts nekavējoties. Pretējā gadījumā atkļūdotājs tiek palaists nākamajā Tcl paziņojumā.

Atkļūdošanas komanda neizmaina nekādus slazdus. Salīdziniet to ar sākuma Expect ar -D karogu.

Atvienošanas komanda no termināla atvieno noformējumu. Tas turpina darboties fonā. Procesam tiek dota sava procesa grupa. Standarta I / O tiek novirzīts uz / dev / null .

Šāds fragments izmanto atvienošanu, lai turpinātu skripta darbību fonā.

ja {[fork]! = 0} iziet no savienojuma. . .

Šāds skripts nolasa paroli un pēc tam katru stundu palaiž programmu, kas prasa paroli katru reizi, kad tā tiek palaista. Skripts piegādā paroli tā, lai to ievadītu tikai vienu reizi.

send_user "parole? \" expect_user -re "(. *) \ n" par {} 1 {} {if {[fork]! = 0} {miegs 3600; turpināt} atvienot nerunāt priv_prog gaidīt Parole: sūtīt "$ expect_out 1, virkne) \ r ". . . Izeja }

Priekšrocība, kā izmantot atvienošanu no apvalka asinhronās procesa funkcijas (&), ir tā, ka Expect var saglabāt termināļa parametrus pirms atvienošanas un vēlāk tos pielietot jauniem ptys. Izmantojot &, Expect nav iespēju nolasīt termināļa parametrus, jo terminālis jau ir atvienots, kad laiks, ko gaidīt saņem kontroli.

iziet [-opts] [statuss]

izraisa gaidīt iziet vai citādi sagatavoties to darīt.

The- onexit karodziņš liek nākamajam argumentam izmantot kā izejas apstrādātāju. Bez argumentiem tiek atgriezts pašreizējais izejas apstrādātājs.

Izslēgts karodziņš izraisa sagaidīt sagatavoties iziešanai, bet vairs nekontrolē faktisko kontroles atgriešanos operētājsistēmā. Lietotāja definēts izejas apstrādātājs tiek palaists, kā arī Expect paša iekšējie apstrādātāji. Nav vairs Gaidīt komandas būtu jāizpilda. Tas ir noderīgi, ja jūs izmantojat Expect ar citiem Tcl paplašinājumiem. Pašreizējais tulks (un galvenais logs Tk vidē) paliek tādā veidā, ka citi Tcl paplašinājumi var iztīrīt. Ja Expect iziešana tiek izsaukta atkārtoti (tomēr tas var notikt), apstrādātāji netiek atkārtoti palaisti.

Pēc iziešanas visi savienojumi ar radītajiem procesiem ir slēgti. Slēgšana tiks atklāta kā EOF, ko radījuši procesi. izeja neveic citas darbības, kas pārsniedz parasto _exit (2) procedūru. Tādējādi turpinās darboties radītie procesi, kas nekontrolē EOF. (Dažādi nosacījumi ir svarīgi, lai noteiktu, piemēram, kādi signāli parādīs izveidoto procesu, bet tie ir atkarīgi no sistēmas, kas parasti tiek dokumentēti saskaņā ar izeju (3).) Nerādītos procesus, kas turpina darboties, mantos init.

statuss (vai 0, ja nav norādīts) tiek atgriezts kā Expect statusa izejas statuss. izeja ir netieši izpildīta, ja tiek sasniegts skripta beigas.

exp_uzturēt [-continue_timer]
Komanda exp_continue ļauj gaidīt, ka pati turpinās izpildīt, nevis atgriezīsies, kā parasti. Pēc noklusējuma exp_continue atiestatīšanas taimeris. Karodziņš -continue_timer aizkavē taimera restartēšanu. (Sk. Gaidīt vairāk informācijas.)

exp_internal [-f faila] vērtība
izraisa papildu komandas nosūtīt diagnostikas informāciju iekšējai informācijai Expect uz stderr, ja vērtība nav nulle. Šī izeja ir atspējota, ja vērtība ir 0. Diagnostikas informācija ietver katru saņemto rakstzīmi un visus mēģinājumus saskaņot pašreizējo izvadi ar šabloniem.

Ja tiek piegādāts izvēles fails , visam normālam un atkļūdošanas produktam tiek rakstīts šis fails (neatkarīgi no vērtības vērtības ). Jebkura iepriekšējā diagnostikas izejas fails ir aizvērts.

Informācijas karogs izraisa exp_internal, lai atgrieztu jaunāko ne-info argumentu aprakstu.

exp_open [args] [-i spawn_id]
atgriež Tcl faila identifikatoru, kas atbilst oriģinālajam nārstojošajam ID. Tad faila identifikatoru var izmantot tā, it kā to atvērtu, izmantojot Tcl atvērto komandu. (Nevajadzētu izmantot nārstojošo id. Nevajadzētu izpildīt gaidīšanu .

Atlikušais karodziņš atstāj ielūguma ID, kas ir atvērts piekļuvei, izmantojot Expect komandas. Laukums ir jāizpilda uz nārsta ID.

exp_pid [-i spawn_id]
atgriež process id, kas atbilst pašreiz izveidotajam procesam. Ja tiek izmantots -i karodziņš, tad pid atsauce atbilst attiecīgā nerūsnas id.

exp_send
ir pseidonīms nosūtīšanai .

exp_send_error
ir pseidonīms send_error .

exp_send_log
ir pseidonīms send_log .

exp_send_tty
ir pseidonīms send_tty .

exp_send_user
ir pseidonīms send_user .

exp_version [[-izvērt] versija]
ir noderīgi, lai nodrošinātu, ka skripts ir saderīgs ar pašreizējo Expect versiju.

Bez argumentiem tiek atjaunota pašreizējā Expect versija. Šo versiju pēc tam var kodēt jūsu skriptā. Ja jūs faktiski zināt, ka jūs neizmantojat jaunāko versiju funkcijas, varat norādīt agrāku versiju.

Versijas sastāv no trim numuriem, kas atdalīti ar punktiem. Pirmais ir lielākais numurs. Scripts, kas rakstīti versijām Expect ar citu lielu skaitu, gandrīz noteikti nedarbosies. exp_version atgriež kļūdu, ja galvenie numuri nesakrīt.

Otrais ir mazais numurs. Skripti, kas rakstīti versijai ar lielāku nelielu skaitu nekā pašreizējā versija, var būt atkarīgi no dažām jaunām funkcijām un, iespējams, nedarbosies. exp_version atgriež kļūdu, ja galvenie skaitļi sakrīt, bet skripta mazais numurs ir lielāks nekā rādītā Expect .

Trešais ir skaitlis, kas versijā salīdzinājumā nav saistošs. Tomēr tas tiek palielināts, kad tiek prognozēts, ka Programmatūras izplatīšana jebkādā veidā tiek mainīta, piemēram, ar papildu dokumentāciju vai optimizāciju. Katram jaunajam papildu versijai tas tiek atiestatīts uz 0.

Ar izejas karti , Expect ( Iziet) izdrukā kļūdu un iziet, ja versija ir novecojusi.

gaidīt [[-opts] pat1 body1] ... [-opts] patn [bodyn]
gaida, kamēr viens no modeļiem neatbilst izveidotā procesa rezultātam, ir pagājis noteiktais laika periods vai redzams faila beigas. Ja pēdējā iestāde ir tukša, to var izlaist.

Raksti no pēdējās expect_before komandas tiek netieši izmantoti pirms jebkuru citu modeli. Modeļi no visjaunākās hop_after komandas tiek netieši izmantoti pēc jebkura cita modeļa.

Ja arguments visam sagaidāmajam apgalvojumam prasa vairāk nekā vienu rindiņu, visi argumenti var tikt "piespiesti" vienā, lai izvairītos no katras rindas pārtraukšanas ar atpakaļejošo rāmi. Šajā vienā gadījumā parastās Tcl aizvietošanas notiks, neraugoties uz breketēm.

Ja modelis ir atslēgvārds eof , attiecīgais ķermenis tiek izpildīts pēc faila beigām. Ja modelis ir atslēgvārda taimauts , atbilstošā iestāde tiek izpildīta pēc taimauta. Ja nav izmantots taimautu atslēgvārds, pēc netiešās null darbības tiek izpildīts pēc taimauta. Noklusējuma beigu laiks ir 10 sekundes, bet to var iestatīt, piemēram, 30, ar komandu "set timeout 30". Bezgalīgu taimautu var norādīt ar vērtību -1. Ja modelis ir atslēgvārds noklusējuma , attiecīgais ķermenis tiek izpildīts pēc datuma vai beigu datuma.

Ja paraugs sakrīt, tad tiek izpildīts atbilstošais ķermenis. gaidiet, ka tiek atgriezts ķermeņa rezultāts (vai tukša virkne, ja nav atbilstoša parauga). Gadījumā, ja ir vairāki modeļi, pirmais, kas parādās pirmais, tiek izmantots, lai atlasītu ķermeni.

Katru reizi, kad tiek parādīta jauna izlaide, to salīdzina ar katru modeli secībā, kādā tie ir uzskaitīti. Tādējādi jūs varat pārbaudīt, vai nav spēles, padarot pēdējo modeli kaut ko garantētu parādīties, piemēram, ātru. Situācijās, kad nav tūlītējas darbības, jums jāizmanto taimauts (tāpat kā jūs, ja jūs mijiedarbojat manuāli).

Raksti ir norādīti trīs veidos. Pēc noklusējuma modeļi ir norādīti kā ar Tcl komandas virknes atbilstību . (Šādi modeļi ir līdzīgi C-shell regulārajām izteiksmēm, ko parasti sauc par "glob" modeļiem). -gl karogu var izmantot, lai aizsargātu modeļus, kas citādi varētu atbilst vilcieniem . Jebkurš raksts, kas sākas ar "-", ir jāaizsargā šādā veidā. (Visas rindas, kas sākas ar "-", ir rezervētas turpmākajām opcijām.)

Piemēram, sekojošais fragments meklē veiksmīgu pieteikšanos. (Ņemiet vērā, ka pārtraukt tiek uzskatīts par procedūru, kas noteikta citur skriptā.)

sagaidīt {aizņemts {ielieciet aizņemts \ n; exp_continue} neizdevās pārtraukt "nederīgu paroli" pārtraukt taimautu pārtraukt savienojumu}

Ceturtajā modelī ir nepieciešami citāti, jo tajā ir atstarpe, kas citādi varētu atšķirt modeli no darbības. Modeļi ar vienu un to pašu darbību (piemēram, 3. un 4. vieta) prasa vēlreiz uzskaitīt darbības. To var izvairīties, izmantojot regexp stila modeļus (skatiet zemāk). Plašāku informāciju par glob stila modeļu veidošanu var atrast Tcl rokasgrāmatā.

Regexp stila modeļi atbilst sintaksei, ko nosaka Tcl regexp (īss vārds "regular expression") komandai. regexp modeļi tiek ieviesti ar karodziņu -re . Iepriekšējo piemēru var pārrakstīt, izmantojot regexp kā:

sagaidīt {aizņemts {ielieciet aizņemts \ n; exp_continue} -re "neizdevās | nederīga parole" pārtraukt taimautu pārtraukt savienojumu}

Abi modeļu tipi ir "nesaskaņoti". Tas nozīmē, ka modeļiem nav jāatbilst visai virknei, taču var sākt un beigt spēli jebkurā virknē (tik ilgi, kamēr viss pārējais sakrīt). Izmantojiet ^, lai atbilstu virknes sākumam, un $, lai tas atbilstu beigām. Ņemiet vērā, ka, ja jūs negaidīsiet virknes beigas, jūsu atbildes var viegli nokļūt virknes vidū, jo tās tiek atdalītas no izveidotā procesa. Kamēr tiek iegūti pareizi rezultāti, izlaide var izskatīties nedabiska. Tādējādi ieteicams izmantot $, ja jūs varat precīzi aprakstīt rakstzīmes virknes beigās.

Ņemiet vērā, ka daudzos redaktoros ^ un $ atbilst līniju sākumam un beigām. Tomēr, tā kā paredzams, ka tas nav orientēts uz līniju, šīs rakstzīmes atbilst datu sākumam un beigām (atšķirībā no rindām), kas pašlaik ir sagaidāmajā atbilstošajā buferšķīdumā. (Skatīt arī tālāk sniegto piezīmi par "sistēmas gremošanas traucējumiem.")

Ar -ex karodziņu modelis tiek saskaņots kā "precīzs" virkne. Netika veikta *, ^, utt. Interpretācija (lai gan parasti jāievēro parastās Tcl konvencijas). Precīzi modeļi vienmēr ir vienoti.

Nokavējuma karodziņš izraugās izvades lielos burtus, lai salīdzinātu, it kā tie būtu mazo burtu simboli. Paraugs netiek ietekmēts.

Lasot produkciju, vairāk nekā 2000 baitu var piespiest agrāk baitus par "aizmirst". To var mainīt ar funkciju match_max . (Ņemiet vērā, ka pārlieku lielas vērtības var palēnināt modelēšanas matricu .) Ja patlist ir full_buffer , tiek izpildīts atbilstošais ķermenis, ja ir saņemti match_max baiti un nav citu paraugu. Neatkarīgi no tā, vai tiek izmantots full_buffer atslēgvārds, aizmirstās rakstzīmes tiek rakstītas ar expect_out (buferšķīdumu).

Ja patlistam ir atslēgvārds nulle , un nulls ir atļauti (izmantojot komandu remove_nulls ), tiek izpildīts atbilstošais ķermenis, ja tiek saskaņota viena ASCII 0. Nav iespējams saskaņot 0 bitus ar glob vai regexp modeļiem.

Saskaņojot modeli (vai eof vai full_buffer), jebkura saskaņošana un iepriekš nesaskaņota izlaide tiek saglabāta mainīgajā expect_out (buferšķīdumā) . Līdz pat 9 regexp substring atbilstības tiek saglabāti mainīgie expect_out (1, string), izmantojot expect_out (9, string) . Ja indeksu karogs tiek izmantots pirms parauga, sākuma un beigu indeksi (formā, kas piemērots lange ) no 10 stīgām tiek saglabāti mainīgajos expect_out (X, start) un expect_out (X, end), kur X ir cipars, atbilst bufera apakšvirknes pozīcijai. 0 attiecas uz virknes, kas atbilst visam paraugam un tiek ģenerētas glob modeļiem, kā arī regexp modeļiem. Piemēram, ja process ir radījis "abcdefgh \ n" produkciju, rezultāts:

sagaidīt "cd"

it kā būtu izpildīti šādi apgalvojumi:

set expec_out (0, string) cd set expec_out (buffer) abcd

un "efgh \ n" paliek izvades buferī. Ja process radīja izvadi "abbbcabkkkka \ n", rezultāts:

gaidīt -indeksus -re "b (b *). * (k +)"

it kā būtu izpildīti šādi apgalvojumi:

set expec_out (0, start) 1 set expec_out (0, end) 10 set expec_out (0, string) bbbcabkkkk set expec_out (1, start) 2 set expec_out (1, end) 3 set expec_out (1, string) bb set expec_out (2, starts) 10 set expec_out (2, end) 10 set expec_out (2, string) k set expec_out (buffer) abbbcabkkkk

un "a \ n" ir atstāts izvades buferī. Veidne "*" (un -re ". *") Izlauzās izvades buferi, neizlasot procesa rezultātus.

Parasti saskaņotais izvads tiek noraidīts no Expect iekšējiem buferiem. To var novērst, prefiksējot modeli ar -notransfer flag. Šis karodziņš ir īpaši noderīgs eksperimentējot (un, eksperimentējot, to var saīsināti ar "-not").

Nepareizs ID, kas saistīts ar atbilstošo izvadi (vai eof vai full_buffer) tiek saglabāts expect_out (spawn_id) .

Apstiprinājuma karodziņš liek pašreizējā sagaidāmajai komandai izmantot šādu vērtību kā taimautu, nevis izmantot termināla mainīgā lielumu.

Pēc noklusējuma modeļi tiek salīdzināti ar pašreizējā procesa izvadi, taču -i karodziņš paziņo, ka iznākums no nosauktā spawn_id saraksta ir jāsakrīt ar jebkuru šādu shēmu (līdz nākamajam -i ). "Spawn_id" sarakstam vajadzētu būt vai nu atstarpes atstarpes sarakstam spawn_ids, vai arī mainīgajam, kas attiecas uz šādu spawn_ids sarakstu.

Piemēram, nākamais piemērs gaida no $ proc2 nosaukta spawn_id, kas saistīts ar pašreizējo procesu vai "aizņemts", "neizdevās" vai "nederīga parole".

sagaidīt {-i $ proc2 aizņemts {aizņemts \ n; exp_continue} -re "neizdevās | nederīga parole" pārtraukt taimautu pārtraukt savienojumu}

Globālā mainīgā jebkura_spawn_id vērtību var izmantot, lai saskaņotu modeļus ar visiem spawn_ids, kas nosaukti ar visiem citiem -i karodziņiem pašreizējā sagaidāmajā komandā. "Spawn_id" no -i karoga, kuram nav saistīta modeļa (ti, tūlīt pēc tam pievienojis cits -i ), ir pieejams jebkuram citam viena sagaidāmās komandas modelim, kas saistīts ar any_spawn_id.

Ar -i karogs var arī apzīmēt globālo mainīgo, tādā gadījumā mainīgais tiek lasīts nerūsējošo identifikatoru sarakstam. Mainīgais mainās katru reizi, kad tas mainās. Tas nodrošina veidu, kā mainīt I / O avotu, kamēr komanda izpildīta. Šādi veidotos nāves ID tiek saukti par "netiešiem" nūjiņu ID.

Tādas darbības kā pārtraukums un turpinājums rada kontroles struktūras (ti, proc ), kas rīkojas parastajā veidā. Komanda exp_continue ļauj gaidīt, ka pati turpinās izpildīt, nevis atgriezīsies, kā parasti.

Tas ir noderīgi, lai izvairītos no nepārprotamas cilpas vai atkārtotiem sagaidāmajiem apgalvojumiem. Šis piemērs ir fragmenta daļa, lai automatizētu rlogin. Exp_continue izvairās no tā, ka būtu jāraksta otrais sagaidāmais paziņojums (atkārtot meklēšanu), ja rlogin parāda paroli.

\ n "send_user" \ n "sūtīt" $ expect_out (1, string) \ r "stty" {{parole: {stty -echo send_user "parole ($ user) uz $ host:" expect_user -re " echo exp_continue} nepareiza {send_user} nepareiza parole vai konta \ n "exit" timeout {send_user savienojums ar $ hosts ir beidzies \ n "exit} eof {send_user" savienojums ar saimniekdatoru neizdevās: $ expec_out (buferšķīdums) "exit} atkārtoti $}

Piemēram, šāds fragments varētu palīdzēt lietotāja rokasgrāmatai izveidot mijiedarbību, kas jau ir pilnīgi automatizēta. Šajā gadījumā terminālis tiek ievietots izejvielu režīmā. Ja lietotājs nospiež "+", mainīgais tiek palielināts. Ja tiek nospiests "p", procesam tiek nosūtīti vairāki atgriešanas gadījumi, iespējams, kaut kādā veidā to pievilkt, un "i" ļauj lietotājam mijiedarboties ar procesu, efektīvi iztukšot kontroli no skripta. Katrā gadījumā turpinājums exp_continue ļauj pašreizējam sagaidīt pēc strukturālās saskaņošanas pēc pašreizējās darbības izpildes.

stty neapstrādāts-ne-expect_after {-i $ user_spawn_id "p" (nosūtīt "\ r \ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {mijiedarboties; exp_continue} "iziet" no izejas)

Pēc noklusējuma exp_continue atiestatīšanas taimeris. Taimeris netiek restartēts, ja turpina izsaukt exp_continue ar karti -continue_timer .

gaidīt pēc [expect_args]
darbojas vienādi ar expect_before, izņemot to, ja, ja abi modeļi no abiem gaidāmajiem un expect_after var atbilst, sagaidāmais modelis tiek izmantots. Lai iegūtu vairāk informācijas, skatiet komandu expect_before .

expect_background [expect_args]
pieņem tos pašus argumentus, ko gaidīs , tomēr tas nekavējoties atgriezīsies. Modeļus pārbauda ikreiz, kad tiek saņemta jauna ieeja. Parastais taimauts un noklusējums ir bezjēdzīgi, lai expect_background un tie tiek mēmi izmesti. Pretējā gadījumā expect_background komanda izmanto expect_before un expect_after modeļus tāpat kā gaida .

Kad tiek gaidīts, ka expect_background darbības tiek novērtētas, fona apstrāde par vienu un to pašu nārstojošo ID tiek bloķēta. Fona apstrāde tiek atbloķēta, kad darbība tiek pabeigta. Kaut arī fona apstrāde ir bloķēta, ir iespējams izdarīt (priekšplāna) cerēt uz to pašu nārsta ID.

Nevar izpildīt sagaidīt, bet expect_background ir atbloķēts. expect_background par konkrētu nārstojošo id tiek dzēsts, paziņojot jaunu expect_background ar tādu pašu nārstojošo id. Deklarējot expect_background bez raksta, noņemto norādīto nārsta ID no spējas saskaņot modeļus fonā.

gaidīt pirms [expect_args]
pieņem tos pašus argumentus, ko gaidīs , tomēr tas nekavējoties atgriezīsies. Modeļa darbības pāri no pēdējā expect_before ar tādu pašu nārstojošo id tiek netieši pievienoti sekojošām sagaidāmajām komandām. Ja modelis sakrīt, tiek uzskatīts, ka tas bija norādīts sagaidāmajā komandā, un saistītā iestāde tiek izpildīta gaidīšanas komandas kontekstā. Ja modeļi no abiem gaidītajiem un iepriekš gaidītiem rezultātiem var atbilst, tiek izmantots simbols expect_before .

Ja nav norādīts neviens modelis, nevienu modeli nekonstatē nārsta ID.

Ja vien nav ignorēts -i karogs, expect_before paraugi sakrīt ar nārsta ID, kas noteikts laikā, kad komanda expect_before tika izpildīta (nevis tad, kad tās modelis ir saskaņots).

Informācijas karogs izraisa sagaidāmo_before, lai atjaunotu pašreizējās specifikācijas par to, kādus modeļus tas atbilst. Pēc noklusējuma tiek ziņots par pašreizējo nārsta ID. Informācija par nārstojošo id var būt pieejama pēc izvēles. Piemēram

expect_before -info-i $ proc

Ne vairāk kā vienu nāves id specifikāciju var dot. Neatkarīgs karodziņš aizkavē tiešos nārstojošo ID, kas nāk no tikai netiešām specifikācijām.

Instead of nesting id specification, karodziņš "-all" izraisīs "-info", lai ziņotu par visiem nūjiņu ID.

Informācijas par karodziņu izvadi var atkārtoti izmantot kā argumentu, ko gaidīt iepriekš.

expect_tty [expect_args]
ir kā gaidīt, bet tas skan rakstzīmes no / dev / tty (ti, lietotāja taustiņsitienus). Pēc noklusējuma lasīšana tiek veikta vārītajā režīmā. Tādējādi līnijām ir jābeidzas ar atgriešanos, lai varētu tos sagaidīt . To var mainīt, izmantojot stty (sk. Komandu stty zemāk).

expect_user [expect_args]
ir kā gaidīt, bet tas skan rakstzīmes no stdin (ti, lietotāja taustiņsitienus). Pēc noklusējuma lasīšana tiek veikta vārītajā režīmā. Tādējādi līnijām ir jābeidzas ar atgriešanos, lai varētu tos sagaidīt . To var mainīt, izmantojot stty (sk. Komandu stty zemāk).

dakša
rada jaunu procesu . Jaunais process ir precīzs pašreizējā paredzamā procesa eksemplārs. Veiksmīgi dakša atgriež 0 līdz jaunajam (bērna) procesam un atgriež procesa ID bērna procesā vecāku procesā . Ja kļūme (vienmēr tāpēc, ka trūkst resursu, piemēram, mijmaiņas vietas, atmiņas), dakša atgriež -1 vecāku procesā un netiek izveidots neviens bērna process .

Forked procesi iziet caur izejas komandu, tāpat kā sākotnējo procesu . Forked procesiem ir atļauts rakstīt log failos. Ja neesat atspējojis atkļūdošanu vai piesakās lielākajā daļā procesu, rezultāts var būt mulsinošs.

Dažus pty implementācijas var sajaukt vairāki lasītāji un rakstnieki, pat īslaicīgi. Tādējādi drošāk ir dakša pirms nārsta procesiem.

mijiedarboties [string1 body1] ... [stringn [bodyn]]
dod lietotājam pašreizējā procesa kontroli, lai taustiņsitienus nosūtītu uz pašreizējo procesu , un tiek atjaunoti pašreizējā procesa stdout un stderr.

Stīgu ķermeņa pāri var norādīt kā argumentus, un šādā gadījumā ķermenis tiek izpildīts, kad tiek ievadīta attiecīgā stīgu. (Pēc noklusējuma virkne netiek nosūtīta uz pašreizējo procesu .) Pieņemot tulka komandu, ja trūkst galīgā ķermeņa.

Ja arguments visam mijiedarbības paziņojumam prasa vairāk nekā vienu rindiņu, visi argumenti var tikt piesaistīti vienam, lai izvairītos no katras rindiņas apgriešanas ar gruntsrāmu. Šajā vienā gadījumā parastās Tcl aizvietošanas notiks, neraugoties uz breketēm.

Piemēram, šī komanda izpilda mijiedarbību ar šādiem virknes ķermeņa pāra definītiem: Kad ir nospiests ^ Z, tiek apturēts Expect . (Atjauno terminālu režīmus -reset .) Kad tiek nospiests ^ A, lietotājs redz "jūs ierakstījāt control-A", un process tiek nosūtīts ^ A. Kad tiek nospiests $, lietotājs redz datumu. Kad ir nospiests ^ C, sagaidiet izejas. Ja tiek ievadīts "foo", lietotājs redz "bar". Kad tiek nospiests ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ .

set CTRLZ \ 032 interact {-rezet $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user 'jūs ierakstījāt control-A \ n "; nosūtiet "\ 001"} $ {send_user "Datums ir [pulksteņa formāts [pulksteņa sekundes]]."} \ 003 izejas foo {send_user "bārs"} ~~}

Virkņu ķermeņa pāros stīgas tiek saskaņotas tādā secībā, ka tās ir uzskaitītas kā argumenti. Daļēji saskaņotās rindiņas netiek sūtītas uz pašreizējo procesu , gaidot nākamo atlikumu. Ja pēc tam tiek ievadītas rakstzīmes tādā veidā, ka vairs nevar būt spēles, tikai procesa daļa tiks nosūtīta procesam, kas nevar sākt citu spēli. Tādējādi, virknes, kas ir daļējas atbilstības apakšvirknes, var sakrist vēlāk, ja sākotnējās virknes, kuras mēģināja būt, galu galā neizdodas.

Pēc noklusējuma virknes atbilstība ir precīza, bez savvaļas kartēm . (Pretēji tam sagaidāmais komandu pēc noklusējuma izmanto glob stila modeļus.) -ex karodziņu var izmantot, lai aizsargātu modeļus, kas citādi varētu atbilst mapju sakariem, to darot. Jebkurš raksts, kas sākas ar "-", ir jāaizsargā šādā veidā. (Visas rindas, kas sākas ar "-", ir rezervētas turpmākajām opcijām.)

Ar -re karogs liek virkni interpretēt kā regexp stila modeli. Šajā gadījumā atbilstošie apakšstrāvi tiek glabāti mainīgajā interact_out līdzīgi kā gaidīts saglabā produkcijas izlaidi mainīgajā expect_out . Līdzīgi tiek atbalstīts arī indeksu karodziņš.

Modelis eof ievieš darbību, kas tiek izpildīta faila beigās. Atsevišķs eof- modelis var arī sekot izejmateriāla karodziņam, tādā gadījumā tas tiek saskaņots, ja, rakstot izvadi, tiek konstatēts eof. Noklusējuma eof darbība ir "atgriešanās", lai mijiedarboties vienkārši atgriežas pie jebkura EOF.

Modeļa taimauts ievada taimautu (sekundēs) un darbību, kas tiek izpildīta pēc tam, kad noteiktā laikā nav lasītas rakstzīmes. Timeout modelis attiecas uz pēdējo norādīto procesu . Nav noklusējuma taimauts. Īpašais mainīgais "timeout" (ko izmanto sagaidīt komandu) neietekmē šo laika nobīdi.

Piemēram, šādu paziņojumu var izmantot, lai autologizētu lietotājus, kuri stundu nav ievadījuši, bet kuri joprojām saņem bieži sistēmas ziņojumus:

mijiedarboties - ievadiet $ user_spawn_id taimauts 3600 return-output \ $ nerwn_id

Ja modelis ir atslēgvārds nulle , un nulls ir atļauti (izmantojot komandu remove_nulls ), attiecīgais ķermenis tiek izpildīts, ja tiek saskaņota viena ASCII 0. Nav iespējams saskaņot 0 bitus ar glob vai regexp modeļiem.

Iezīmējot paraugu ar karodziņu, izraisa mainīgo interact_out (spawn_id) iestatīšanu uz spawn_id, kas atbilst modelim (vai eof).

Tādas darbības kā pārtraukums un turpinājums rada kontroles struktūras (ti, proc ), kas rīkojas parastajā veidā. Tomēr atgriešanās cēloņi mijiedarbojas, lai atgrieztos zvanītājam, bet inter_return izraisa mijiedarbību, lai izraisītu atgriešanos savā zvanītājā. Piemēram, ja "proc foo" sauc par mijiedarbību, kas tad izpildīja darbību inter_return , proc foo atgriezīsies. (Tas nozīmē, ka, ja mijiedarbojas ar zvaniem tulka, interaktīvi ievadot atgriešanos , mijiedarbība turpināsies, bet inter_return izraisīs mijiedarbību, lai atgrieztos zvanītājam.)

Mijiedarbības laikā tiek izmantots neapstrādāts režīms, lai visas rakstzīmes varētu tikt nodotas pašreizējam procesam . Ja pašreizējais process nesaņem darba vadības signālus, tas apstāsies, ja sūtīs stop signālu (pēc noklusējuma ^ Z). Lai to atsāktu, nosūtiet turpinājuma signālu (piemēram, ar "nogalināt -CONT"). Ja jūs patiešām vēlaties nosūtīt SIGSTOP šādam procesam (ar ^ Z), vispirms apsveriet csh nestīšanu un pēc tam palaidiet savu programmu. No otras puses, ja vēlaties sūtīt SIGSTOP uz sevi, gaidiet pirmo tulkotāju (iespējams, izmantojot escape rakstzīmi) un pēc tam nospiediet ^ Z.

Stringa ķermeņa pāri var izmantot kā stenogrāfiju, lai izvairītos no tulka ievadīšanas un komandu izpildes interaktīvā veidā. Iepriekšējais termināla režīms tiek izmantots, kamēr notiek ķēdes pāra ķermeņa izpildīšana.

Ātrāk, darbības pēc neapstrādātas darbības tiek izpildītas. Ar -reset karodziņš tiek atiestatīts terminālis režīmam, kāds tam bija pirms mijiedarbības, tika izpildīts (vienmēr, pagatavots režīms). Ievērojiet, ka rakstzīmes, kas ievadītas režīma pārslēgšanas laikā, var tikt zaudētas (dažas sistēmas terminālu draiveris ir neapmierinoša). Vienīgais iemesls, kā lietot -reset, ir tas, vai jūsu darbība ir atkarīga no tā, kā darbojas vārīts režīms.

Apzīmējums -echo nosūta simbolus, kas atbilst šādam modelim, atpakaļ procesā, kas tos ģenerēja, lasot katru rakstzīmi. Tas var būt noderīgs, ja lietotājam jāredz atsauksmes no daļēji ierakstītiem paraugiem.

Ja modelis tiek atkārtots, bet galu galā nesaskan, rakstzīmes tiek sūtītas uz izveidoto procesu . Ja izveidotais process tos atkārtojas, lietotājs divas reizes redzēs rakstzīmes. -echo, iespējams, ir piemērots tikai situācijās, kad lietotājs, visticamāk, nepildīs modeli. Piemēram, šāds izvilkums ir no rftp, rekursīvā ftp skripta, kur lietotājam tiek prasīts ievadīt ~ g, ~ p vai ~ l, lai rekursīvi iegūtu, izveidotu vai uzskaitītu pašreizējo direktoriju. Tās ir tik tālu no parastajām ftp komandām, ka lietotājs visticamāk nevarēs ievadīt ~, kam seko kaut kas cits, izņemot kļūdaini, tādā gadījumā viņi, iespējams, vienkārši ignorēs rezultātu.

mijiedarboties {-echo ~ g (getcurdirectory 1) -echo ~ l (getcurdirectory 0) -echo ~ p (putcurdkeyory)}

Apzīmējums -nobuffer nosūta rakstzīmes, kas atbilst tālāk norādītajam paraugam, izejas procesam, kad rakstzīmes tiek lasītas.

Tas ir noderīgi, ja vēlaties ļaut programmai atsaukt modeli. Piemēram, šādi var izmantot, lai uzraudzītu, kur persona zvana (Hayes stila modems). Katru reizi, kad ir redzams "ATD", skripts reģistrē pārējo rindiņu.

proc lognumber {} {interaktīvs -nobuffer -re "(. *)" atgriešanās liek $ log "[pulksteņa formāts [pulksteņa sekundes]]: sastādīts $ interact_out (1, string)" interact -nobuffer "atd" lognumber

Mijiedarbības laikā iepriekš ignorē log_user lietošanu. Jo īpaši, mijiedarbojoties, būs jāreģistrē tā produkcija (jānosūta uz standarta izvadi), jo tiek pieņemts, ka lietotājs nevēlas aklot mijiedarboties.

-o karodziņš izraisa sekojošo atslēgu ķermeņa pāri, kas jāpiemēro pašreizējā procesa izejai. Tas var būt noderīgs, piemēram, darbojoties ar saimniekiem, kuri sūta nevēlamus rakstzīmes telnet sesijas laikā.

Pēc noklusējuma mijiedarboties sagaida, ka lietotājs raksta stdin un nolasa stdout par gaidīto procesu . -u karogs (attiecībā uz "lietotāju") mijiedarbojas, lai meklētu lietotāju kā procesu, kas minēts tā argumentā (kam jābūt izveidotajam ID).

Tas ļauj apvienot divus nesaistītos procesus, neizmantojot skaidru cilpu. Lai atvieglotu atkļūdošanu, sagaidiet, ka diagnostika vienmēr iet uz stderr (vai stdout noteiktai informācijai par mežizstrādi un atkļūdošanu). Tā paša iemesla dēļ tulka komandu interaktīvi izlasīs no stdin.

Piemēram, šāds fragments izveido pieteikšanās procesu . Pēc tam tas izsauc lietotāju (nav parādīts) un beidzot savieno abus kopā. Protams, jebkurš process var tikt aizstāts ar pieteikšanos. Piemēram, apvalks ļautu lietotājam strādāt bez konta un paroles piegādes.

Nerādīt pieteikšanās set login $ spawn_id nārstīt tip modems # atdalīt atpakaļ lietotājam # savienot lietotāju, lai pieteiktos, sazināties -u $ login

Lai sūtītu izvadi vairākiem procesiem, uzskaitīt katru nulles indeksu sarakstu, kuru iepriekš norādījis izejmateriāla karodziņš. Ienākumu par izlaides nārsta vietņu ID grupu var noteikt nulles indeksu sarakstā, ko ievada ar ieejas karogu. (Gan ievades, gan izejmateriālu saraksti var būt tādā pašā formā kā -i karogs sagaidāmajā komandā, izņemot to, ka any_spawn_id mijiedarbībā nav jēgpilnu.) Visi šādi karodziņi un virknes (vai modeļi) attiecas uz šo ievadi, kamēr otra - parādās ievades karodziņš. Ja parādās ne-input, -output nozīmē "-input $ user_spawn_id -output". (Tāpat ar modeļiem, kuriem nav ieejas .) Ja ir norādīts viens -input, tas ignorē $ user_spawn_id. Ja ir norādīts otrais ievade, tas ignorē $ spawn_id. Papildu ieejas karogi var tikt norādīti.

Abas implicētās ievades procesi pēc noklusējuma ir tādi, kuru izvadi ir norādīti kā $ spawn_id un $ user_spawn_id (reverse). Ja tiek parādīts ievades karodziņš bez izejmateriāla karoga, rakstzīmes no šī procesa tiek noraidītas.

-i karodziņš ievieš pašreizējā spawn_id aizstājēju, ja netiek izmantoti citi ieejas vai izejas karodziņi. -i karogs nozīmē -o karodziņu.

Ir iespējams mainīt procesus, ar kuriem tiek mijiedarbojas, izmantojot netiešās nārstošanas ID. (Netiešie nārstošanas ID ir aprakstīti sagaidīšanas komandas sadaļā.) Netiešās nārstošanās ID var norādīt ar -i, -u, -input vai -output flags.

tulks [args]
liek lietotājam interaktīvi uzaicināt komandu Expect un Tcl. Katras komandas rezultāts tiek izdrukāts.

Tādas darbības kā pārtraukums un turpinājums rada kontroles struktūras (ti, proc ), kas rīkojas parastajā veidā. Tomēr atgriešanās liek tulkam atgriezties savā zvanītājam, bet inter_return liek tulkam izraisīt atgriešanos savā zvanītājā. Piemēram, ja "proc foo" sauc par tulku, kurš pēc tam izpildīja darbību inter_return , proc foo atgriezīsies. Jebkura cita komanda liek tulkam turpināt piedāvāt jaunas komandas.

Pēc noklusējuma uzvedne satur divus veselus skaitļus. Pirmais vesels skaitlis apraksta novērtēšanas kaudzes dziļumu (ti, cik reizes Tcl_Eval ir izsaukts). Otrais vesels skaitlis ir Tcl vēstures identifikators. Uzdevumu var iestatīt, nosakot procedūru ar nosaukumu "prompt1", kura atgriešanās vērtība kļūst par nākamo uzvedni. Ja paziņojumam ir atvērtas pēdiņas, parens, breketes vai kronšteini, sekundārais uzvednes (pēc noklusējuma "+>") tiek izdots pēc jaunas līnijas. Sekundāro uzvedni var iestatīt, nosakot procedūru ar nosaukumu "prompt2".

Tulka laikā tiek izmantots vārīts režīms, pat ja tā zvanītājs izmanto neapstrādātu režīmu.

Ja stdin ir aizvērts, tulks atgriezīsies, ja vien nav izmantots karodziņš, un šādā gadījumā tiks izmantots nākamais arguments.

log_file [args] [[-a] fails]
Ja ir norādīts faila nosaukums, log_file failā ieraksta sesijas stenogrammu (sākot no tā paša punkta). Log_file pārtrauks ierakstu, ja nav norādīts neviens arguments. Jebkurš iepriekšējais žurnāla fails ir slēgts.

Faila nosaukuma vietā var tikt nodrošināts Tcl faila identifikators, izmantojot flip-opens vai -leaveopen . Tas ir līdzīgs pavairošanas komandai. (Skatīt vairāk, lai iegūtu vairāk informācijas.)

-a karoga spēks izslēdzas, kas jāreģistrē , ko nomāca komandā log_user .

Pēc noklusējuma komandu log_file pievieno veciem failiem, nevis tos saīsina, lai ērtāk varētu izslēgt noņemšanu un vairākas reizes vienā sesijā. Lai saīsinātu failus, izmantojiet -noappend karodziņu.

Informācijas karodziņš izraisa log_file, lai atgrieztu jaunāko ne-info argumentu aprakstu.

log_user -info | 0 | 1
Pēc noklusējuma sūtīt / gaidīt dialogu ieraksta stdout (un logfile, ja tas ir atvērts). Komandu "stdout" atspējo komanda "log_user 0" un atkārtoti aktivizē "log_user 1". Reģistrēšanās logfailā nav mainīta.

Informācijas karogs liek log_user atsaukt jaunāko ne-info argumentu aprakstu.

match_max [-d] [-i spawn_id] [izmērs]
nosaka bufera izmēru (baitos), ko iekšēji izmanto, sagaidot . Ja nav lieluma argumenta, pašreizējais izmērs tiek atgriezts.

Ar -d karogu tiek iestatīts noklusējuma lielums. (Sākotnējais noklusējums ir 2000.) Ar -i karti lielums tiek iestatīts nosauktajam nārstošanas ID, pretējā gadījumā tas tiek iestatīts pašreizējam procesam .

pārklājums [- # spawn_id] [- # spawn_id] [...] programma [args]
izpilda "programmas args" pašreizējās Expect programmas vietā, kas beidzas. Liektais defisma arguments piespiež defisu komandas nosaukuma priekšā, it kā tas būtu pieteikšanās čaula. Visi spawn_ids ir slēgti, izņemot tos, kas nosaukti kā argumenti. Tie ir piesaistīti nosauktajiem failu identifikatoriem.

Spawn_ids ir saistītas ar faila identifikatoriem jaunai mantošanas programmai. Piemēram, sekojošā rindiņā darbojas šahs un to var kontrolēt ar pašreizējo procesu - teiksim, šaha meistaru.

pārklājums -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id šahs

Tas ir efektīvāks nekā "mijiedarbojas ar -u", taču tā ziedo spēju veikt programmētu mijiedarbību, jo paredzamais process vairs nav kontrolējams.

Ievērojiet, ka nav paredzēts kontrolējošais terminālis. Tādējādi, ja jūs atvienojat vai pārveidojat standarta ievadi, programmas, kas veic darba kontroli (apvalki, pieteikšanās utt.) Nedarbosies pareizi.

paritāte [-d] [-i spawn_id] [vērtība]
nosaka, vai paritāte jāsaglabā vai jānoņem no iegūto procesu rezultāta. Ja vērtība ir nulle, paritāte tiek attīrīta, pretējā gadījumā to neizmanto. Neatbilstošs arguments, pašreizējā vērtība tiek atgriezta.

Ar -d karogu tiek iestatīta noklusējuma paritātes vērtība. (Sākotnējais noklusējums ir 1, ti, paritāte nav noķerta.) Ar -i karti, paritātes vērtība tiek iestatīta nosauktajam nārstošanas ID, pretējā gadījumā tas tiek iestatīts pašreizējam procesam .

remove_nulls [-d] [-i spawn_id] [vērtība]
nosaka, vai nulles tiek saglabātas vai noņemtas no radīto procesu izlaides, pirms modelis tiek saskaņots vai saglabāts mainīgajā expect_out vai interact_out . Ja vērtība ir 1, nulles tiek noņemtas. Ja vērtība ir 0, nulles netiek noņemtas. Neatbilstošs arguments, pašreizējā vērtība tiek atgriezta.

Ar -d karogu tiek iestatīta noklusējuma vērtība. (Sākotnējais noklusējums ir 1, ti, nulles tiek noņemtas.) Ar -i karogu vērtība tiek iestatīta nosauktajam nārstošanas ID, pretējā gadījumā tas tiek iestatīts pašreizējam procesam .

Neatkarīgi no tā, vai ir noņemtas nulles, gaidiet, lai logs un stdout ierakstu nulles bitus.

nosūtiet [-flags] virkni
Sūta virkni uz pašreizējo procesu . Piemēram, komanda

nosūtiet "sveika pasaule"

sūta rakstzīmes helloworld uz pašreizējo procesu . (Tcl ietver printf- like komandu (saukto formātu ), kas var veidot patvaļīgi sarežģītas virknes.)

Rakstzīmes tiek nosūtītas uzreiz, lai gan programmas ar līnijas buferētās ieejas rakstzīmēm netiek lasītas, līdz tiek nosūtīts atbildes raksturs. Atgriešanās raksturs ir apzīmēts ar "\ r".

Ar - karogu nākamais arguments tiek interpretēts kā virkne, nevis karogs. Pirms jebkura virkne var būt "-", vai tas tiešām izskatās kā karodziņš. Tas nodrošina drošu mehānismu, lai norādītu mainīgās virknes, netiktu uzlauzti tie, kas nejauši izskatās kā karodziņi. (Visas rindas, kas sākas ar "-", ir rezervētas turpmākajām opcijām.)

-i karogs paziņo, ka virkne tiek nosūtīta uz nosaukumu spawn_id. Ja spawn_id ir user_spawn_id , un termināls ir neapstrādātā režīmā, virknes jaunās līnijas tiek pārtulkotas uz return-newline secībām, lai tās parādās tā, it kā terminālis būtu gatavots. Karoga burts atspējo šo tulkojumu.

Nulles karogs nosūta nulles rakstzīmes (0 baiti). Pēc noklusējuma tiek nosūtīts viens nulle. Lai parādītu, cik nulles ir jānosūta, vesels skaitlis var sekot -null .

Nožūšanas karogs rada pārtraukuma stāvokli. Tas ir jēga tikai tad, ja nūjošanas ID norāda uz tty ierīci, kas atvērta, izmantojot "spawn -open". Ja esat radījis procesu, piemēram, galu, jums vajadzētu izmantot tip's konvenciju, lai radītu pārtraukumu.

" -i" karoga spēks izvadi tiek nosūtīts "lēnām", tādējādi izvairoties no kopējas situācijas, kad dators izslēdz ieejas buferi, kas ir domāts cilvēkam, kas nekad neizmantotu to pašu buferi . Šo produkciju kontrolē mainīgā vērtība "send_slow", kas ņem divu elementu sarakstu. Pirmais elements ir vesels skaitlis, kas apraksta baitu skaitu, lai nosūtītu atomu. Otrais elements ir reāls skaitlis, kas apraksta, cik sekundes ir jāatdala atomu nosūtītās. Piemēram, "set send_slow (10 .001)" piespiestu "send -s" nosūtīt virknes ar 1 milisekuntu starp katrām 10 sūtītām rakstzīmēm.

-h karoga spēks izvadi tiek nosūtīts (nedaudz), piemēram, cilvēks faktiski mašīnrakstīšanu. Cilvēks līdzīgs aizkavēšanās parādās starp rakstzīmēm. (Algoritms ir balstīts uz Weibull izplatīšanu ar modifikācijām, kas piemērotas šim konkrētajam lietojumam.) Šo produkciju kontrolē mainīgā vērtība "send_human", kas ņem piecu elementu sarakstu. Pirmie divi elementi ir vidējais rakstzīmju intervāls starp sekundēm. Pirmais tiek izmantots pēc noklusējuma. Otrais tiek izmantots vārdu galotnēs, lai simulētu smalkās pauzes, kas reizēm rodas šādās pārejās. Trešais parametrs ir mainīgums, ja .1 ir diezgan mainīgs, 1 ir pamatoti mainīgs un 10 ir diezgan nemainīgs. Galēji ir 0 līdz bezgalībai. Pēdējie divi parametri ir attiecīgi minimālais un maksimālais interlaika laiks. Minimālais un maksimālais tiek izmantoti pēdējā un "klipu" pēdējā laikā. Galīgais vidējais rādītājs var būt diezgan atšķirīgs no vidējā, ja minimālais un maksimālais klips ir pietiekami liels.

Piemēram, šāda komanda atdala ātru un konsekventu mašīnrakstītāju:

set send_human (.1 .3 1 .05 2) nosūtīt -h "Es esmu izsalcis. Padosies pusdienās."

bet pēc paģirām var būt piemērotāki:

set send_human {.4 .4 .2 .5 100} sūtīt -h "Goodd party lash night!"

Ņemiet vērā, ka kļūdas netiek simulētas, lai gan varat pašam iestatīt kļūdu labošanas situācijas, ievietojot sūtīšanas argumentus par kļūdām un labojumiem.

Nulles rakstzīmju nosūtīšanas karodziņi pārtraukumu nosūtīšanai, lēnas jaudas piespiešanai un cilvēka veida iznākšanai ir savstarpēji izslēdzoši. Tiks izmantots tikai pēdējais norādītais. Turklāt nevienu virknes argumentu nevar norādīt ar karodziņiem nulles rakstzīmju vai pārtraukumu nosūtīšanai.

Ieteicams pirms pirmā sūtīt procesu, ko sagaida . gaidīsies, kamēr process sāksies, bet sūtījums to nevarēs. Jo īpaši, ja pirmā sūtīšana tiek pabeigta pirms procesa sākuma, jūs riskējat, ka jūsu dati tiek ignorēti. Situācijās, kad interaktīvās programmas nesniedz tūlītēju uzvedni, pirms nosūtīšanas varat sūtīt ar aizkavēšanos, kā:

# Lai izvairītos no tā, ka hakeriem tiek sniegti padomi, kā ielauzties, šī sistēma neatbalsta ārēju paroli. # Pagaidiet 5 sekundes, lai izpildītu pabeigt neskatoties uz Telnet ļoti.secure.gov gulēt 5 sūtīt paroli

exp_send ir sūtītas pseidonīms . Ja Tk vidē izmantojat Expectk vai kādu citu Expect variantu, sūtījumu Tk definē pilnīgi citam mērķim. Tiek nodrošināta sadarbspēju starp vidēm, izmantojot exp_send . Līdzīgas aliases ir paredzētas citām Expect citu sūtīšanas komandām.

send_error [-flags] string
ir, piemēram, nosūtīt , izņemot to, ka produkcija tiek nosūtīta uz stderr nevis pašreizējo procesu .

send_log [-] virkne
ir tāds pats kā nosūtīt , izņemot to, ka virkne tiek nosūtīta tikai žurnāla failam (sk. log_file .) Argumenti tiek ignorēti, ja neviens žurnāla fails nav atvērts.

send_tty [-flags] string
ir, piemēram, nosūtīt , izņemot to, ka produkcija tiek nosūtīta uz / dev / tty nevis pašreizējo procesu .

send_user [-flags] virkne
ir, piemēram, nosūtīt , izņemot to, ka produkcija tiek nosūtīta uz stdout, nevis uz pašreizējo procesu .

miega sekundes
liek skriptam gulēt par noteiktu sekundes skaitu. Sekundes var būt decimāls skaitlis. Pārtrauc (un Tk notikumus, ja jūs izmantojat Expectk) tiek apstrādāti, kamēr tiek gaidīti guļ.

neruns [args] programma [args]
izveido jaunu procesu, kurā darbojas "programma args". Tās stdin, stdout un stderr ir savienoti ar Expect, lai tos varētu lasīt un rakstīt ar citām Expect komandām. Savienojums tiek bojāts, aizverot vai arī process pats aizver jebkuru faila identifikatoru.

Ja process sākas ar nerunu , mainīgais spawn_id ir iestatīts uz deskriptoru, kas attiecas uz šo procesu . Process, ko apraksta spawn_id, tiek uzskatīts par "pašreizējo procesu ". spawn_id var lasīt vai rakstīt, faktiski nodrošinot darba kontroli.

user_spawn_id ir globāls mainīgais, kas satur deskriptoru, kas attiecas uz lietotāju. Piemēram, ja spawn_id ir iestatīts uz šo vērtību, sagaida , ka tā darbojas kā expect_user .

.I error_spawn_id ir globāls mainīgais, kas satur deskriptoru, kas attiecas uz standarta kļūdu. Piemēram, ja spawn_id ir iestatīts uz šo vērtību, sūtījums uzvedas tāpat kā send_error .

tty_spawn_id ir globāls mainīgais, kas satur deskriptoru, kas attiecas uz / dev / tty. Ja / dev / tty nepastāv (piemēram, cron, pie vai partijas skripts), tad tty_spawn_id nav definēts. To var pārbaudīt kā:

ja {[info vars tty_spawn_id]} {# / dev / tty pastāv} else {# / dev / tty neeksistē #, iespējams, cron, partijā vai skriptā}

spawn atgriež UNIX procesa ID. Ja process netiek radīts, tiek atgriezts 0. Mainīgais spawn_out (vergs, nosaukums) ir iestatīts pty vergu ierīces nosaukumā.

Pēc noklusējuma virskārta atgādina komandas nosaukumu un argumentus. No- neo karogs pārtrauc to darīt.

Konsole atzīmē rada konsoļu izvadi, kas tiek novirzīta uz izveidoto procesu . Tas netiek atbalstīts visās sistēmās.

Iekšā nārsta izmanto pty, inicializēta tāpat kā lietotāja tty. Tas tiek inicializēts tā, lai visi iestatījumi būtu "normāli" (saskaņā ar stty (1)). Ja mainīgais stty_init ir definēts, tas tiek interpretēts stty argumenti kā papildu konfigurācija. Piemēram, "iestatīt stty_init neapstrādātu" radīs papildu radīto procesu termināļus, lai sāktu neapstrādātu režīmu. -nottiopija lēkā inicializāciju, pamatojoties uz lietotāja tty. -notityinit izlaiž "normālu" inicializāciju.

Parasti nārstošana aizņem maz laika, lai izpildītu. Ja jūs pamanāt, ka nārstot, ņemot vērā ievērojamu laiku, iespējams, ir sastopami pūtīši, kas ir saspiesti. Daudzi testi tiek veikti uz ptys, lai izvairītos no satricinājumiem ar nepareiziem procesiem. (Tie prasa 10 sekundes par katru ievilkto pty.) Running Expect ar -d opciju parādīsies, ja Expect sastopas ar daudziem ptys nepāra stāvokļos. Ja jūs nevarat nogalināt procesus, uz kuriem šie ptys ir pievienoti, jūsu vienīgais risinājums var būt atsāknēšana.

Ja programmu neizdodas veiksmīgi, jo neizdodas exec (2) (piemēram, kad programma nepastāv), nākamā mijiedarbojas vai sagaidīs komandu, kļūdas ziņojums tiks parādīts tā, it kā programma būtu palaista un kļūdaini parādītu kā izeju. Šī uzvedība ir dabiskas nārsta ieviešanas sekas. Iekšā nārstojošās dakšiņas, pēc kuras izveidotajam procesam nav iespējas sazināties ar sākotnējo gaidāmo procesu, izņemot saziņu, izmantojot spawn_id.

Atvērtajam karodziņam nākamais arguments tiek interpretēts kā Tcl faila identifikators (ti, atgriezts ar atvērtu .) Pēc tam nārstojošo ID var izmantot tā, it kā tas būtu radīts process . (Faila identifikatoru vairs neizmanto.) Tas ļauj apstrādāt neapstrādātas ierīces, failus un cauruļvadus kā radītos procesus, neizmantojot pty. 0 ir atgriezts, lai norādītu, ka nav saistīta procesa . Ja savienojums ar izveidoto procesu ir slēgts, tas ir arī Tcl faila identifikators. Apzīmējums -leaveopen ir līdzīgs -open, izņemot to, ka -leaveopen liek atvērt faila identifikatoru pat tad, kad nulles indekss ir aizvērts.

Ar pogu karti tiek atvērts pty, bet process nav izveidots. 0 ir atgriezts, lai norādītu, ka nav saistīta procesa . Spawn_id ir iestatīts kā parasti.

Mainīgais spawn_out (slave, fd) ir iestatīts uz faila identifikatoru, kas atbilst pty slave. To var aizvērt, izmantojot "close-slave".

Nozīmētais karodziņš norāda signālu, kas tiek ignorēts izveidotajā procesā . Pretējā gadījumā signāli saņem noklusējuma darbību. Signāli tiek nosaukti kā slazdošanas komandā, izņemot to, ka katram signālam nepieciešams atsevišķs karodziņš.

Strace līmenis
izraisa sekojošus apgalvojumus, kas jāizdrukā pirms to izpildīšanas. (Tcl izsekošanas komandu izsekojamie mainīgie.) Līmenis norāda, cik izsvītrota izsaukuma kaudze. Piemēram, sekojošā komandā tiek aktivizēts Expect , izsekojot pirmajiem četriem zvanu līmeņiem, bet ne zemāk par to.

gaidīt-c "strace 4" script.exp

Informācijas karodziņš izraisa strace, lai atgrieztu jaunāko ne-info argumentu aprakstu.

stty args
maina termināla režīmus līdzīgi ārējai stty komandai.

Pēc noklusējuma ir pieejams vadības pults. Citus terminālus var piekļūt, pievienojot statusa statusa pieprasījumu, kuru atgriež kā komandas rezultātu. Ja statuss netiek pieprasīts un ir pieejams kontrolējošais terminālis, neapstrādāto echo atribūtu iepriekšējais statuss tiek atgriezts tādā formā, kuru var vēlāk ko izmanto komanda.

Piemēram, argumenti neapstrādāti vai -cooked likt terminālu neapstrādātu režīmā. Parametri -raw vai vārīti pārveido termināli gatavā režīmā. Argumenti echo un -echo ievieto terminālu attiecīgi echo un noecho režīmā.

Sekojošais piemērs parāda, kā īslaicīgi atspējot atbalsi. To var izmantot citādi automātiskos skriptus, lai izvairītos no to paroļu iekļaušanas. (Skatiet plašāku diskusiju par to zem sadaļas EXPECT HINTS.)

stty -echo send_user "Parole:" expect_user -re "(. *) \ n" iestatīt paroli $ expect_out (1, string) stty echo

sistēma args
dod args uz sh (1) kā ievadi, tāpat kā tas būtu drukāts kā komandu no termināla. Gaidīt, kamēr apvalks beidzas. Atgriešanās statuss no sh tiek apstrādāts tādā pašā veidā, kā exec apstrādā tā atgriešanās statusu.

Pretstatā exec, kas novirza skriptu stdin un stdout, sistēma neveic novirzīšanu (izņemot to, ko norāda virkne). Tādējādi ir iespējams izmantot programmas, kurām ir jākonsultējas tieši ar / dev / tty. Tā paša iemesla dēļ sistēmas rezultāti netiek reģistrēti žurnālā.

laikspiedols [args]
atgriež laika zīmogu. Bez argumentiem, sekundes skaits kopš epas ir atdots.

Formatēšanas karodziņš ievada virkni, kas tiek atgriezta, bet ar aizvietojumiem, kas veikti saskaņā ar POSTML noteikumiem strftime. Piemēram,% a tiek aizstāts ar īslaicīgu nedēļas nosaukumu (ti, S). Citi ir:

% a saīsinātais nedēļas nosaukums% Pilna nedēļas nosaukums% b saīsinātais mēnesis nosaukums% B pilna mēneša nosaukums% c datuma laiks kā: Wed Oct 6 11:45:56 1993% d mēneša diena (01-31% H stunda (00-23)% I stunda (01-12)% j dienā (001-366)% m mēnesis (01-12)% M minūte (00-59)% p am vai pm% S sekundē (00-61) % u diena (1-7, pirmdiena ir pirmā nedēļas diena)% U nedēļa (00-53, pirmā svētdiena ir pirmā pirmā nedēļas diena)% V ned. (01-53, ISO 8601 stils)% w diena (0- 6)% W nedēļa (00-53, pirmais pirmdiena ir pirmā pirmā nedēļas diena)% x datuma laiks kā: Wed Oct 6 1993% X laiks kā: 23:59:59% y gadā (00-99) % Y gads kā: 1993% Z laika josla (vai neko, ja nav nosakāma) %% bezprocenta zīme

Citas% specifikācijas ir nenoteiktas. Citas rakstzīmes tiks nodotas netraucēti. Atbalsta tikai C lokalizāciju.

Atsevišķu karodziņš ievada vairākas sekundes, jo laikposms tiek izmantots kā avots, no kura formatēt. Pretējā gadījumā tiek izmantots pašreizējais laiks.

-gmt karogs izsniedz laika spiedienu, lai izmantotu GMT laika zonu . Bez karoga tiek izmantots vietējais laika josla.

lamatas [[komandu] signāli]
izraisa šo komandu izpildi pēc tam, kad tiek saņemts kāds no norādītajiem signāliem. Komandu izpilda globālā mērogā. Ja komanda nav, signāla darbība tiek atgriezta. Ja komanda ir virkne SIG_IGN, signāli tiek ignorēti. Ja komanda ir virkne SIG_DFL, signāli ir sistēmas noklusējuma rezultāts. signāli ir vai nu viens signāls, vai signālu saraksts. Signālus var norādīt skaitliski vai simboliski kā signālu (3). "SIG" prefiksu var izlaist.

Nesaturot argumentus (vai argumentu -numuru), lamatas atgriež pašreiz notiekošā lamatas komandas signāla numuru.

Kodas karogs izmanto komandas atgriešanas kodu vietā, kādu kodu Tcl gatavoja atgriezties, kad komanda sākotnēji sāka darboties.

-interp karodziņš izraisa komandas novērtēšanu, izmantojot tulku, kurš ir aktīvs laikā, kad komanda sāka darboties, nevis tad, kad slazds tika deklarēts.

Vārds -paraugs norāda, ka slazdošanas komanda atgriež pašreizējā slazdošanas komandas signāla nosaukumu.

Lielais karodziņš lūku komandu atgriež lielāko iespējamo signāla numuru.

Piemēram, komanda "trap {send_user" Ouch! "} SIGINT izdrukās" Ouch! " katru reizi, kad lietotājs nospiež ^ C.

Pēc noklusējuma SIGINT (ko parasti var ģenerēt, nospiežot ^ C) un SIGTERM izraisīt Gaidīt iziet. Tas ir saistīts ar sekojošo slazdu, kas izveidots pēc noklusējuma, kad Expect starts.

slazdošanas nobraukums {SIGINT SIGTERM}

Ja jūs izmantojat -D karogu, lai palaistu atkļūdotāju, SIGINT tiek no jauna definēts, lai palaistu interaktīvo atkļūdotāju. Tas ir saistīts ar šādu lamatu:

lamatas {exp_debug 1} SIGINT

Atkļūdotāju slazdus var mainīt, iestatot vides mainīgo EXPECT_DEBUG_INIT uz jaunu slazdošanas komandu.

Jūs, protams, varat ignorēt abus, vienkārši pievienojot skriptam slazdošanas komandas. Jo īpaši, ja jums ir sava "slazdošanas izejas SIGINT", tas ignorēs atkļūdotāju slazdus. Tas ir noderīgi, ja vēlaties novērst lietotāju piekļuvi atkļūdotājam.

Ja jūs vēlaties definēt savu slazdu SIGINT, bet joprojām slēpjas atkļūdotājs, kad tas darbojas, izmantojiet:

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

Varat arī slazt atkļūdotāju, izmantojot kādu citu signālu.

lamatas neļaus jums ignorēt SIGALRM darbību, jo tā tiek izmantota iekšēji, lai gaidītu . Atvienošanas komanda nosaka SIGALRM uz SIG_IGN (ignorēt). Jūs to varat atkārtoti iespējot tik ilgi, kamēr to atspējosiet nākamo nerunu komandu laikā.

Lai iegūtu vairāk informācijas, skatiet signālu (3).

gaidīt [args]
kavēšanās, kamēr nav izveidots process (vai pašreizējais process, ja neviens nav nosaukts) beidzas.

parasti gaidiet četru veselu skaitļu sarakstu. Pirmais vesels skaitlis ir process, kas tika gaidīts pid. Otrais veselais skaitlis ir atbilstošais nārsta ID. Trešais veselais skaitlis ir -1, ja radās operētājsistēmas kļūda vai 0 citādi. Ja trešais vesels skaitlis bija 0, ceturtais veselais skaitlis ir statuss, kuru atgriezīs izveidotais process . Ja trešais vesels skaitlis bija -1, ceturtais vesels skaitlis ir operētājsistēmas iestatītā errno vērtība. Ir iestatīta arī globālā mainīgā kļūdas kods.

Papildu elementi var parādīties atgriešanās vērtības beigās, sākot ar gaidīšanu . Fakultatīvs piektais elements identificē informācijas klasi. Pašlaik šī elementa vienīgā iespējamā vērtība ir CHILDKILLED, tādā gadījumā nākamās divas vērtības ir C stila signāla nosaukums un īss teksta apraksts.

-i karogs paziņo, ka process jāgaida atbilstoši nosauktajam spawn_id (ne procesa ID). SIGCHLD apdarinātāja iekšpusē ir iespējams gaidīt jebkuru radīto procesu , izmantojot nārstojošo id -1.

-Nowait karodziņš liek gaidīt, lai atgrieztos tūlīt, norādot uz veiksmīgu gaidīšanu. Kad process iziet (vēlāk), tas automātiski izzudīs, nepieprasot precīzu gaidīšanu.

Gaidīšanas komandu var arī izmantot, pagaidot dakšu procesu, izmantojot argumentus "-i -1". Atšķirībā no tā izmantošanas ar radītajiem procesiem, šo komandu var izpildīt jebkurā laikā. Nepārbauda, ​​kurš process tiek izmantots. Tomēr atgriezenisko vērtību var pārbaudīt procesa id.

BIBLIOTĒKAS

Sagaidiet, ka automātiski zina par divām iebūvētām bibliotēkām paredzamajiem skriptiem. Tos nosaka katalogi, kas nosaukti mainīgos exp_library un exp_exec_library. Abas ir domātas, lai saturētu lietderības failus, kurus var izmantot citi skripti.

exp_library satur arhitektūras neatkarīgus failus. exp_exec_library satur no arhitektūras atkarīgus failus. Atkarībā no jūsu sistēmas abi katalogi var būt pilnīgi tukši. Faila $ exp_exec_library / cat-buffers esamība apraksta, vai jūsu / bin / cat buferi pēc noklusējuma.

PRETTY-PRINTING

Vigrinda definīcija ir pieejama diezgan drukāšanai. Sagaidiet skriptus. Pieņemot, ka vgrind definīcija, kas piegādāta kopā ar Expect izplatīšanu, ir pareizi instalēta, to varat izmantot kā:

vgrind - atvērt failu

PIEMĒRI

Daudzi nav redzami, kā visu kopā salikt, ko apraksta cilvēka lapa. Es aicinu jūs izlasīt un izmēģināt piemērus, kas ir paredzētā izplatīšanas piemēra direktorijā. Dažas no tām ir reālas programmas. Citi vienkārši ilustrē dažus paņēmienus, un, protams, pāris ir tikai ātrs hacks. INSTALL failā ir ātrs pārskats par šīm programmām.

Paredzamie dokumenti (sk. SKATĪT arī) ir noderīgi. Lai gan dažos dokumentos tiek izmantots sintakse, kas atbilst iepriekšējām Expect versijām, pievienotie pamatojumi joprojām ir derīgi un sniedz daudz detalizētāku informāciju nekā šī cilvēka lapa.

CAVEATS

Paplašinājumi var sadurties ar Expect komandu nosaukumiem. Piemēram, nosūtīt tiek definēts ar Tk pilnīgi citam nolūkam. Šī iemesla dēļ lielākā daļa Expect komandu ir pieejami arī kā "exp_XXXX". Komandām un mainīgajiem, kas sākas ar "exp", "inter", "spawn" un "timeout", nav pseidonīmu. Izmantojiet paplašinātos komandu nosaukumus, ja jums nepieciešama šī saderība starp vidi.

Gaidiet, ka diezgan liberāls skatījums uz apgabalu. Jo īpaši mainīgie, kas tiek nolasīti ar komandu palīdzību, kas ir raksturīgi programmam Expect, vispirms tiks meklēti no vietējās darbības jomas, un, ja tā netiks atrasta, globālā mērogā. Piemēram, tas novērš nepieciešamību novietot "globālo taimautu" ikreiz, kad jūs rakstāt, ko sagaida . No otras puses, rakstītie mainīgie vienmēr ir vietējā mērogā (ja vien nav izdota "globāla" komanda). Visbiežāk sastopamā problēma, ko tas rada, ir tad, kad nārstošana tiek izpildīta procedūrā. Ārpus procedūras, spawn_id vairs nepastāv, tāpēc izveidotais process vairs nav pieejams tikai tāpēc, ka ir noteikts apgabals. Šādai procedūrai pievienojiet "globālo spawn_id".

Ja jūs nevarat iespējot daudzpakāpju funkcionalitāti (ti, jūsu sistēma neatbalsta ne atlasīto (BSD *. *), Gan aptauju (SVR> 2), ne kaut ko līdzīgu), gaidiet , ka vienlaikus varēs kontrolēt tikai vienu procesu . Šajā gadījumā nemēģiniet iestatīt spawn_id , kā arī nevajadzētu izpildīt procesus, izmantojot izpildi, kamēr notiek izveidotais process . Turklāt jūs nevarēsiet sagaidīt no vairākiem procesiem (ieskaitot lietotāju kā vienu) vienlaikus.

Termināla parametriem var būt liela ietekme uz skriptiem. Piemēram, ja skripts ir rakstīts, lai meklētu atbalsi, tas kļūdās, ja echoing ir izslēgts. Šī iemesla dēļ, Expect, pēc noklusējuma spēlē saprātīgus termināļa parametrus. Diemžēl tas var padarīt lietas par nepatīkamām citām programmām. Piemēram, emacs čaula vēlas mainīt "parasto" kartēšanu: jaunās līnijas tiek piesaistītas jaunajām līnijām, nevis novirzīšanas un atgriešanas līnijām, un atbalss ir atspējots. Tas ļauj lietotājam izmantot emacs, lai rediģētu ievades līniju. Diemžēl Expect nevar to uzminēt.

Jūs varat pieprasīt, lai Gaidītais netiktu ignorēts tā noklusējuma iestatījums termināļa parametriem, bet tad jums jābūt ļoti piesardzīgiem, rakstot skriptus šādām vidēm. Emacu gadījumā izvairieties atkarībā no tādām lietām kā atbalsi un beigas-line uzlikšanas.

Komandas, kas pieņēma argumentus, kuri tika apvienoti vienā sarakstā ( sagaidāmais variants un mijiedarbojas ), izmanto heirismu, lai izlemtu, vai saraksts patiesībā ir viens arguments vai daudzi. Heiristiskais var neizdoties tikai tad, ja saraksts patiešām ir viens arguments, kuram ir vairāki iegulti \ n ar ne-atstarpes rakstzīmes no tām. Tas šķiet pietiekami neticami, tomēr argumentu "-nobrace" var izmantot, lai piespiestu vienu argumentu rīkoties kā vienu argumentu. Iespējams, ka to var izmantot ar mašīnas ģenerētu gaidāmo kodu. Līdzīgi, -brace spēka vienīgais arguments tiek apstrādāts kā vairāki modeļi / darbības.

KĻŪDAS

Patiešām vilinoši bija nosaukt programmu "sekss" (vai nu "Smart EXec", vai "Send-EXpect"), bet dominēja laba sajūta (vai varbūt tikai puritānisms).

Dažās sistēmās, kad tiek veidots korpuss, tā sūdzas, ka nevar piekļūt tty, bet jebkurā gadījumā darbojas. Tas nozīmē, ka jūsu sistēmai ir mehānisms, lai iegūtu kontrolējošo tty, kuru Expect nezina. Lūdzu, uzzināt, kas tas ir, un nosūtiet šo informāciju atpakaļ pie manis.

Ultrix 4.1 (vismaz jaunākās versijas šeit) uzskata, ka laika ierobežojums virs 1000000 ir ekvivalents 0.

Digital UNIX 4.0A (un, iespējams, arī citas versijas) atsakās piešķirt ptys, ja jūs definējat SIGCHLD apstrādātāju. Lai iegūtu plašāku informāciju, skatiet granta lapu.

IRIX 6.0 nepārstrādā pty atļaujas pareizi, tāpēc, ka, ja Expect mēģina piešķirt pty, ko kādreiz izmantoja kāds cits, tas neizdodas. Jauniniet uz IRIX 6.1.

Telnet (pārbaudīts tikai saskaņā ar SunOS 4.1.2) karājas, ja TERM nav iestatīts. Šī ir problēma zem Cron, CGI un CGI skriptos, kas nenosaka TERM. Tādējādi jums tas jādefinē skaidri - kādam tipam parasti nav nozīmes. Tam vienkārši ir jāpieskaita kaut kas! Šāds, iespējams, ir pietiekams vairumā gadījumu.

iestatīt env (TERM) vt100

Padoms (pārbaudīts tikai saskaņā ar BSDI BSD / OS 3.1 i386) karājas, ja nav iestatīti SHELL un HOME. Šī ir problēma saskaņā ar cron , CGI un CGI skriptiem, kuri nenosaka šos vides mainīgos. Tādējādi jums ir jānosaka tie skaidri - kāda veida parasti nav nozīmes. Tam vienkārši ir jāpieskaita kaut kas! Šāds, iespējams, ir pietiekams vairumā gadījumu.

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

Daži ptys ieviešana ir izstrādāta tā, lai kodols pēc 10 līdz 15 sekundēm izmestu jebkuru nelasīto izvadi (faktiskais numurs ir atkarīgs no implementācijas) pēc tam, kad process ir slēgts faila deskriptors. Tādējādi sagaidīt tādas programmas kā

nāves datums miegs 20 gaidīt

neizdosies. Lai to izvairītos, izmantojiet neinteraktīvas programmas ar izpildi, nevis uz nulles . Lai gan šādas situācijas ir iedomājamas, praksē es nekad neesmu saskāries ar situāciju, kurā patiesi interaktīvās programmas galīgā izlaide tiktu zaudēta šīs uzvedības dēļ.

No otras puses, Cray UNICOS izslēdz jebkuru nelasītu izlaidi tūlīt pēc tam, kad process ir slēgts faila deskriptors. Es to ziņoju Cray, un viņi strādā pie labošanas.

Dažreiz starp uzvedni un atbildi ir nepieciešama kavēšanās, piemēram, ja tty interfeiss maina UART iestatījumus vai atbilstošos bodu ātrumus, meklējot starta / stop bitus. Parasti viss tas ir nepieciešams, ir gulēt uz otro vai diviem. Pareizāka metode ir mēģināt vēlreiz, kamēr aparatūra nav gatava ievadīšanai. Šajā piemērā tiek izmantotas abas stratēģijas:

nosūtīt "ātrumu 9600"; gulēt 1 gaidīt {timeout (nosūtīt "\ r"; exp_continue} $ prompt}

slazdošanas kods nedarbosies ar jebkuru komandu, kas atrodas Tcl notikumu ciklā, piemēram, gulēt. Problēma ir tā, ka notikuma cilpa gadījumā Tcl atmet atpakaļnosūtīšanas kodus no async notikumu apstrādātājiem. Risinājums ir iestatīt karodziņu lamatas kodā. Tad pārbaudiet karodziņu uzreiz pēc komandas (ti, gulēt).

Gaida_background komandu ignorē-bez argumentiem, un tam nav termiņu vispār.

& # 34; EXPECT HINTS & # 34;

Ir pāris lietas par Gaidīt, kas var nebūt intuitīvs. Šajā sadaļā mēģināts risināt dažas no šīm lietām ar pāris ieteikumiem.

Parasti sagaidāma problēma ir tas, kā atpazīt čaulas uzvednes. Tā kā tos dažādi pielāgo dažādi cilvēki un dažādi čaulas, portatīvi automatizējot rlogin var būt grūti, nezinot nekavējoties. Pareiza vienošanās ir nodrošināt, lai lietotāji saglabātu regulāro izteiksmi, kas apraksta viņu tūlītēju (jo īpaši tā beigas) vides mainīgo EXPECT_PROMPT. Var izmantot šādu kodu. Ja EXPECT_PROMPT nepastāv, šim kodam joprojām ir labas iespējas pareizi darboties.

set prompt "(% | # | \\ $) $"; # noklusējuma ātrais uztvērējs {set prompt $ env (EXPECT_PROMPT)} expect -re $ prompt

Es aicinu jūs rakstīt gaidīt modeļus, kas ietver beigas, ko jūs gaidāt redzēt. Tas novērš iespēju atbildēt uz jautājumu pirms redzēt visu lietu. Turklāt, lai arī jūs varētu labi atbildēt uz jautājumiem pirms to pilnīgas pārskatīšanas, ja jūs atbildat agri, jūsu atbilde var tikt atkārtota jautājuma vidū. Citiem vārdiem sakot, radītais dialogs būs pareizs, bet izskatīsies kodēts.

Lielākā daļa uzvedņu beigās ietver atstarpes rakstzīmi. Piemēram, ftp uzvedne ir 'f', 't', 'p', '>' un. Lai atbilstu šai uzvednei, jums jāuzskaita katra no šīm rakstzīmēm. Tā ir izplatīta kļūda neiekļaut tukšu. Ievietojiet tukšo tekstu skaidri.

Ja jūs izmantojat veidlapu X *, * atbilst visām izejām, kas saņemtas no X beigām, līdz pēdējai saņemtajai lietai. Tas izklausās intuitīvi, bet tas var būt nedaudz mulsinošs, jo frāze "pēdējā lieta, kas saņemta" var mainīties atkarībā no datora ātruma un I / O apstrādes gan kodola, gan ierīces draivera dēļ.

Jo īpaši cilvēki mēdz redzēt programmas izlaidi, kas nonāk milzīgos gabalos (atomeļi), kad patiesībā lielākā daļa programmu rada vienu rindiņu vienā reizē. Pieņemot, ka tas tā ir, * iepriekšējā rindkopā var atbilst tikai pašreizējās līnijas beigām, lai gan šķiet, ka tas ir vairāk, jo spēles laikā tas bija viss, kas tika saņemts.

ka nav iespējams uzzināt, ka turpmāka izlaide nāk, ja vien jūsu modelis to tieši nenorāda.

Pat atkarībā no līnijām orientētā buferizācija nav gudra. Programmas ne tikai paver solījumus par buferizācijas veidu, ko tās dara, bet sistēmas gremošanas traucējumi var pārtraukt izvades līnijas, lai līnijas pārtrauktos šķietami izlases vietās. Tādējādi, ja jūs varat izteikt pēdējo rakstzīmi prompt rakstot modeļus, tas ir prātīgi to darīt.

Ja gaidāt modeli pēdējā programmas izlaidumā, un programma to vietā izstaro kaut ko citu, to nevarēs noteikt ar timeout atslēgvārdu. Iemesls ir tas, ka sagaidā , ka nebūs laika nobīdi - tā vietā saņems eof indikāciju. Izmantojiet to vietā. Pat labāk, izmantojiet abus. Tādā veidā, ja šī līnija tiek pārvietota, jums vairs nebūs jāreģistrē pati lente.

Jaunas līnijas parasti konvertē uz vagonu atgriešanu, līnijas padeves sekvences, kad termināļa draiveris izdara izvadi. Tādējādi, ja vēlaties modeli, kas tieši savieno abas līnijas, no, teiksim, printf ("foo \ nbar"), jums vajadzētu izmantot modeli "foo \ r \ nbar".

Līdzīgs tulkojums rodas, lasot no lietotāja, izmantojot expect_user . Šajā gadījumā, nospiežot atgriešanos, tas tiks pārtulkots uz jaunu līniju. Ja Expect, tad iet uz programmu, kas nosaka termināli neapstrādātai režīmā (piemēram, telnet), būs problēma, jo programma sagaida patiesu atdevi. (Dažas programmas patiešām piedod, jo tās automātiski tulko jaunas līnijas uz atgriešanos, bet lielākā daļa to nedara.) Diemžēl nav iespējams noskaidrot, vai programma novieto terminālu neapstrādātā režīmā.

Tā vietā, lai manuāli aizstātu jaunās līnijas ar atgriezenisko saiti, risinājums ir izmantot komandu "stty raw", kas pārtrauks tulkojumu. Ņemiet vērā, ka tas nozīmē, ka jūs vairs nesaņemsiet gatavās līnijas rediģēšanas funkcijas.

mijiedarbojas, netieši nosaka jūsu termināla neapstrādātu režīmu, lai šī problēma nerastos tad.

Parasti (vai kāda cita privāta informācija) bieži tiek glabāta programmā Expect scripts (Paredzamie skripti). Tas nav ieteicams, jo jebkas, kas tiek glabāts datorā, ir jutīgs pret jebkuru piekļuvi. Tādējādi, interaktīvi liekot paroles no skripta, ir saprātīgāka ideja nekā burtiski iekļaut. Tomēr dažreiz šāda iegulšana ir vienīgā iespēja.

Diemžēl UNIX failu sistēmai nav tiešu veidu, kā izveidot izpildāmus, bet neizlasāmus skriptus. Sistēmas, kas atbalsta setgid čaulas skriptus, var to netieši imitēt šādi:

Izveidojiet paredzēto skriptu (kas satur slepenos datus) kā parasti. Piešķirt savas atļaujas 750 (-rwxr-x ---) un pieder uzticamai grupai, ti, grupai, kurai ir atļauts to izlasīt. Ja nepieciešams, izveidojiet jaunu grupu šim nolūkam. Pēc tam izveidojiet / bin / sh skriptu ar atļaujām 2751 (-rwxr-s-x), kas pieder tai pašai grupai, kā iepriekš.

Rezultāts ir skripts, kuru ikviens var izpildīt (un lasīt). Ja tiek aktivizēts, tas darbojas Expect script.

& # 34; SKAT. & # 34;

Tcl (3), libexpect (3)
"Izpētot cerēt: uz Tcl balstīts rīkkopa interaktīvo programmu automatizēšanai" , Don Libes, 602. lpp., ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"Gaidīt: Konservēšana tiem nekontrolējamiem interaktivitātes elementiem" Don Libes, ASV 1990. gada vasaras 1990. gada USENIX konferences Anaheima, Kalifornija, 1990. gada 11.-15.jūnijs.
. "Izmantojot gaidīto automatizēt sistēmas administrēšanas uzdevumus", ko veica Don Libes, 1990. gada USENIX Lielo instalāciju sistēmu administrēšanas konferences Kolorādospringsas (Colorado Springs, Colorado) 1990. gada 17.-19.
. I "Tcl: Embedable komandu valoda", ko John Ousterhout, Ziemassvētku 1990 USENIX konferencē, Vašingtonā, DC, janvāris 22-26, 1990. Manis "gaidīt: skripti interaktīvu programmu kontroli", ko Don Libes, Computing Systems , Vol. 4, Nr. 2, Kalifornijas Universitātes preses žurnāli, 1991. gada novembris. "Interaktīvo programmu regresijas testēšana un atbilstības testēšana", Don Libes, 1992. gada Vasaras 1992. gada USENIX konferences materiāls, San Antonio, TX, 135-144. June 12-15, 1992. I "Kibitz - Connecting Multiple Interactive Programs Together", Don Libes, programmatūra - prakse un pieredze, John Wiley & Sons, West Sussex, England, Vol.

23, Nr. 5, 1993. g., 1993. gads. "Ieraksts par Tcl lietojumprogrammu atkļūdotāju", Don Libes, 1993. gada Tcl / Tk seminārs, Berkeley, CA, 1993. gada 10.-11. Jūnijs.

AUTHOR

Don Libes, Nacionālais standartu un tehnoloģiju institūts

PIEPRASĪJUMI

Paldies John Ousterhout par Tcl un Scott Paisley par iedvesmu. Pateicoties Rob Savoye par Expect autokonfigurācijas kodu.

HISTORY fails dokumentē lielāko daļu gaidītās attīstības. Tas padara interesantu lasīšanu un var sniegt jums plašāku ieskatu par šo programmatūru. Pateicamies tajā minētajiem cilvēkiem, kas mani nosūtīja kļūdu labojumus un sniedza citu palīdzību.

Daļēji ASV valdība daļēji ir apmaksājusi un īstenojusi Expect, un tādēļ tā ir publiski pieejama. Tomēr autors un NIST vēlas saņemt kredītu, ja tiek izmantota šī programma un dokumentācija vai to daļas.