Skip to main content

Espereu Instruccions i exemples d'ordres de Linux / Unix

Taula de continguts:

Anonim

Expect és un programa que parla amb altres programes interactius d'acord amb un script. Després del guió, Expect sap què es pot esperar d'un programa i quina hauria de ser la resposta correcta. Un llenguatge interpretat proporciona branques i estructures de control d'alt nivell per dirigir el diàleg. A més, l'usuari pot prendre el control i interactuar directament quan ho desitgeu, després retornar el control al script.

Expectk és una barreja de Expect i Tk. Es comporta com Expect i el desig de Tk. Esperar també es pot utilitzar directament en C o C + + sense Tcl.

El nom "Esperar" prové de la idea d'enviar / esperar seqüències popularitzades per uucp, kermit i altres programes de control de mòdem. Tanmateix, a diferència de uucp, Expect es generalitza perquè es pugui executar com a comandament a nivell d'usuari amb qualsevol programa i tasca en ment. Podeu parlar amb diversos programes al mateix temps.

Què es pot esperar?

Per exemple, aquí teniu algunes coses que l'ordre d'espera pot fer:

  • Causa que l'equip torni a marcar, de manera que pugui iniciar sessió sense pagar la trucada.
  • Comenceu un joc i, si la configuració òptima no apareix, torneu-la a reiniciar una i altra vegada) fins que ho faci, i després us lliuri el control.
  • Executeu fsck i, en resposta a les seves preguntes, responeu "sí" o "no" o regaleu-vos el control, segons criteris predeterminats.
  • Connecteu-vos a una altra xarxa i recupereu automàticament el vostre correu perquè aparegui com si s'hagués enviat originalment al vostre sistema local.
  • Porteu variables d'entorn, directori actual o qualsevol tipus d'informació a rlogin, telnet, tip, su o chgrp

Hi ha diversos motius pels quals la closca no pot dur a terme aquestes tasques. Tot és possible amb Esperar.

En general, Esperar és útil per executar qualsevol programa que requereixi una interacció entre el programa i l'usuari. Tot el que cal és que la interacció es pugui caracteritzar mitjançant programació. Esperar també pot retornar el control a l'usuari sense detenir el control del programa. De la mateixa manera, l'usuari pot tornar el control a l'script en qualsevol moment.

Ús

Espereu llegir cmdfile per obtenir una llista d'ordres per executar. Es pot invocar implicit implícitament en sistemes que suportin el #! notació marcant el script com a executable i fent la primera línia en el script:

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

Per descomptat, el camí ha de descriure amb precisió on viu la vida. / usr / local / bin és només un exemple.

El -c flag preveu una ordre que s'executarà abans que qualsevol en el script. S'haurà de citar l'ordre per evitar que la shell es trenqui. Aquesta opció es pot utilitzar diverses vegades. Es poden executar diverses ordres amb un sol -c separant-les amb punt i coma. Les ordres s'executen en l'ordre en què apareixen. Quan s'utilitza Expectk, aquesta opció s'especifica com -command.

L'indicador -d permet una sortida de diagnòstic, que principalment informa l'activitat interna de les ordres tals com esperar i interactuar. Aquesta bandera té el mateix efecte que "exp_internal 1" al començament d'un script d'Expect, a més s'imprimeix la versió de Expect.

La marca -D permet un depurador interactiu. Cal seguir un valor sencer. El depurador es farà càrrec abans del següent procediment de Tcl si el valor no és zero o si es prem un ^ C o es produeix un punt d'interrupció o si apareix un altre comandament de depurador adequat al script. Quan s'utilitza Expectk, aquesta opció s'especifica com -Depuració.

La bandera -f prefereix un fitxer des del qual llegir comandes. La bandera en si és opcional, ja que només és útil quan s'utilitza el #! notació, de manera que es puguin proporcionar altres arguments a la línia d'ordres. Quan s'utilitza Expectk, aquesta opció s'especifica com a fitxer.

Per defecte, el fitxer de comandes es llegeix a la memòria i s'executa en la seva totalitat. De vegades és desitjable llegir fitxers d'una línia alhora. Per obligar els arxius arbitraris a tractar d'aquesta manera, utilitzeu l'indicador -b. Quan s'utilitza Expectk, aquesta opció s'especifica com a variable.

Si la cadena "-" es proporciona com un nom de fitxer, es llegeix l'entrada estàndard. Utilitzeu "./-" per llegir des d'un fitxer anomenat "-".

La marca -i provoca que s'espera que les ordres interactives en lloc de llegir-les des d'un fitxer. S'acaba el missatge mitjançant l'ordre de sortida o en EOF. S'assumeix la bandera -i si no s'utilitza cap fitxer de comandament ni -c. Quan s'utilitza Expectk, aquesta opció s'especifica com -interactiva.

- es pot utilitzar per delimitar el final de les opcions. Això és útil si voleu passar un argument com a opció al vostre script sense que això sigui interpretat per Expect. Això es pot col·locar de manera útil a la #! línia per evitar qualsevol interpretació flagrant per Expect. Per exemple, el següent deixarà els arguments originals incloent el nom del script en la variable argv .

#! / usr / local / bin / expect -

Tingueu en compte que les convencions usuals getopt (3) i execve (2) s'han d'observar quan s'afegeixen arguments al #! línia

El fitxer $ exp_library / expect.rc s'origina automàticament si està present, tret que s'utilitzi la bandera -N. (Quan s'utilitza Expectk, aquesta opció s'especifica com -NORC.) Immediatament després d'això, el fitxer ~ / .expect.rc s'origina automàticament, tret que s'utilitzi la bandera -n. Si es defineix la variable d'entorn DOTDIR, es tracta com un directori i es llegeix .expect.rc. Quan s'utilitza Expectk, aquesta opció s'especifica com -norc.Aquesta font d'accés només es produeix després d'executar tots els indicadors -c.

-v causes Espereu imprimir el vostre número de versió i sortiu. La bandera corresponent a Expectk, que utilitza noms de bandera llargs, és -version.

Els args opcionals es construeixen en una llista i s'emmagatzemen a la variable anomenada argv i. argc s'inicialitza a la longitud de argv.

Argv0 es defineix com el nom del script o binari si no s'utilitza cap script. Per exemple, els següents imprimeix el nom de l'script i els tres primers arguments:

send_user "$ argv0 lrange $ argv 0 2 n"

Ordres

Espereu que utilitzeu l'idioma d'ordres d'eines. Tcl proporciona un flux de control (si, per, trenca), l'avaluació de l'expressió i diverses altres funcions, com ara la recursió i la definició de procediments. Les ordres que s'utilitzen aquí, però no definides (set, if, exec) són ordres Tcl. Espereu que admet comandes addicionals. A menys que s'especifiqui el contrari, les ordres retornen la cadena buida.

Els comandaments s'enumeren alfabèticament perquè puguin localitzar-se ràpidament. Tanmateix, els nous usuaris poden trobar més fàcil començar per llegir les descripcions de generar, enviar, esperar i interactuar, en aquest ordre.

tancar -slave -exec 0 | 1 -i spawn_id

tanca la connexió amb el procés actual. La majoria de programes interactius detectaran EOF en el seu stdin i surten; així a prop sol ser suficient per matar el procés també. La bandera -i declara que el procés es tanca corresponent a l'spawn_id anomenat.

Tots dos esperen i interactuen detectaran quan el procés actual surt i implícitament es tanqui, però si mata el procés, digueu "exec kill $ pid", heu de trucar explícitament a prop.

La marca -execució determina si l'id de generació es tanca en qualsevol procés generat o si el procés està superposat. Per deixar un spawn id obert, utilitzeu el valor 0. Un valor sencer de zero que obliga a la generació tancada en qualsevol procés nou.

L'indicador -slave tanca l'esclau associat amb l'id. De generació. Quan es tanca la connexió, l'esclau també es tanca automàticament si encara està obert.

Independentment de si la connexió es tanca implícita o explícitament, haureu de trucar a esperar per netejar la ranura corresponent del procés del nucli. L'ordre de tancament no crida a esperar ja que no hi ha cap garantia que tancar una connexió de procés provocarà la sortida.

depuració -now 0 | 1

controla un depurador de Tcl que permet passar declaracions i establir punts d'interrupció.

Sense arguments, es torna un 1 si el depurador no s'està executant, en cas contrari es retornarà un 0.

Amb un argument 1, el depurador s'inicia. Amb un argument 0, el depurador es deté. Si un argument 1 és precedit pel -now flag, el depurador s'inicia immediatament. En cas contrari, el depurador s'inicia amb el següent extracte de Tcl.

L'ordre de depuració no canvia cap tramvia. Compareu-ho amb l'esperança de començar amb el pavelló -D.

L'ordre de desconexió desconecta un procés bifurcat del terminal. Continua funcionant en segon pla. El procés es lliura al seu propi grup de processos. Les E / S estàndard es redirigeixen a / dev / null.

El següent fragment utilitza la desconnexió per continuar executant l'script en segon pla.

si {fork! = 0} sortiu de la desconnexió. . .

El següent script llegeix una contrasenya i executa un programa cada hora que requereix una contrasenya cada vegada que s'executa. El script proporciona la contrasenya perquè només hàgiu d'escriure una vegada.

enviar_usuari "contrasenya? " expect_user -re "(. *) n" per {} 1 {) {if {fork! = 0} (sleep 3600; continue) desconnectar spawn priv_prog esperar Contrasenya: enviar "$ expect_out ( 1, cadena) r ". . . sortir}

L'avantatge d'utilitzar la desconnexió en la funció de procés asíncron de la carcassa (&) és que Expect pot guardar els paràmetres del terminal abans de la desconnexió i, més tard, aplicar-los a nous ptys. Amb &, Expect no té la possibilitat de llegir els paràmetres del terminal ja que el terminal ja està desconnectat en el moment que Expect rep el control.

sortir -opts estatus

causa que s'espera sortir o d'alguna manera preparar-se per fer-ho.

El -explicació La bandera fa que el següent argument s'utilitzi com a controlador de sortida. Sense un argument, es torna el controlador de sortida actual.

El -noexit la bandera provoca Esperar per preparar-se per sortir però no deixar de tornar el control del sistema operatiu. El controlador de sortida definit per l'usuari s'executa així com els controladors interns de Expect mateixos. No s'haurien d'executar més comandaments Expect. Això és útil si esteu executant Expect amb altres extensions de Tcl. L'intèrpret actual (i la finestra principal si en l'entorn Tk) romanen de manera que altres extensions de Tcl es puguin netejar. Si s'espera sortir es torna a trucar (això pot passar), els controladors no es tornen a executar.

Al sortir, es tanquen totes les connexions als processos generats. El tancament es detectarà com un EOF per processos generats. sortir no pren cap altra acció més enllà del que fa el procediment normal (2). Per tant, els processos generats que no comproven EOF poden continuar funcionant. (Una varietat de condicions són importants per determinar, per exemple, quins senyals generarà un procés generat, però aquests són dependents del sistema, generalment documentats a la sortida (3)). Els processos generats que continuen funcionant seran heretats per init.

estat (o 0 si no s'especifica) es retorna com a estat de sortida de Esperar . sortir s'executa implícitament si s'aconsegueix el final de l'script.

exp_continue -continue_timer

L'ordre exp_continueu permet espera per continuar executant en comptes de tornar com normalment ho faria. Per defecte exp_continueu restaura el temporitzador de temps d'espera. El -continue_timer La bandera evita que el temporitzador es reiniciï. (Veure espera per obtenir més informació.)

exp_internal -f fitxer valor

fa que altres comandaments enviïn informació interna de diagnòstic Esperar a stderr si valor no és zero. Aquesta sortida està desactivada si valor és 0. La informació de diagnòstic inclou tots els caràcters rebuts i tots els intents realitzats per a que coincideixi amb la sortida actual amb els patrons.

Si és opcional dossier es proporciona, tot el normal i la sortida de depuració s'escriu en aquest fitxer (independentment del valor de valor ). Qualsevol fitxer anterior de sortida de diagnòstic està tancat.

El -info la bandera provoca exp_internal per tornar una descripció dels arguments no informatius més recents donats.

exp_open args -i spawn_id

torna un identificador de fitxer Tcl que correspon a l'id. de generació original. L'identificador de fitxer es pot utilitzar com si estigués obert per Tcl's obert comandament. (L'identificador spawn ja no s'hauria d'utilitzar espera no s'ha d'executar.

El -leaveopen la bandera deixa que l'obertura es pugui accedir per comandaments Expect. A espera s'ha d'executar a l'id. de spawn.

exp_pid -i spawn_id

retorna la id de procés corresponent al procés actual generat. Si el -i S'utilitza la bandera, el missatge retornat correspon a aquell de l'identificador de generació donat.

exp_send

és un àlies per a enviar .

exp_send_error

és un àlies per a send_error .

exp_send_log

és un àlies per a send_log .

exp_send_tty

és un àlies per a enviar_tty .

exp_send_user

és un àlies per a send_user .

exp_version -exit version

és útil per assegurar que el script és compatible amb la versió actual de Expect.

Sense arguments, la versió actual de Esperar es torna. Aquesta versió es pot codificar al vostre script. Si realment sap que no està utilitzant característiques de versions recents, podeu especificar una versió anterior.

Les versions consisteixen en tres números separats per punts. Primer és el nombre més important. Scripts escrits per a versions de Esperar amb un nombre major diferent, segurament no funcionarà. exp_version retorna un error si els nombres principals no coincideixen.

El segon és el nombre menor. Les seqüències d'ordres escrites per a una versió amb un menor nombre menor que la versió actual poden dependre d'una funció nova i no es pugui executar. exp_version retorna un error si els nombres principals coincideixen, però el número menor de seqüència de comandaments és major que el del corrent Esperar .

Tercer és un nombre que no té cap part en la comparació de versions. No obstant això, s'incrementa quan el Esperar la distribució de programari es canvia de qualsevol manera, com ara documentació addicional o optimització. Es reinicia a 0 en cada nova versió menor.

Amb el -exit bandera, Esperar Imprimeix un error i surt si la versió no està actualitzada.

espera -opts pat1 body1 … -opts patn bodyn

espera fins que un dels patrons coincideixi amb la sortida d'un procés generat, un període de temps especificat ha passat o es veu un fi de fitxer. Si el cos final està buit, es pot ometre.

Patrons del més recent Esperar abans La comanda s'utilitza implícitament abans de qualsevol altre patró. Patrons del més recent expect_after La comanda s'utilitza implícitament després d'altres patrons.

Si els arguments a tot espera la instrucció requereix més d'una línia, tots els arguments es poden "integrar" en un d'ells per tal d'evitar la finalització de cada línia amb una barra invertida. En aquest cas, es produiran les substitucions habituals de Tcl malgrat les claus.

Si un patró és la paraula clau eof , el cos corresponent s'executa al final de fitxer. Si un patró és la paraula clau temps d'espera , el cos corresponent s'executa amb el temps d'espera. Si no s'utilitza cap paraula clau de temps d'espera, s'executa una acció nul·la implícita en el temps d'espera. El període de temps d'espera predeterminat és de 10 segons, però es pot establir, per exemple, a 30, mitjançant l'ordre "set timeout 30". Es pot designar un temps d'espera infinit pel valor -1. Si un patró és la paraula clau per defecte , el cos corresponent s'executa amb el temps d'espera o final de fitxer.

Si un patró coincideix, s'executa el cos corresponent. espera retorna el resultat del cos (o la cadena buida si no coincideix cap patró). En cas que coincideixin diversos patrons, el que apareix primer s'utilitza per seleccionar un cos.

Cada vegada que arriba la sortida nova, es compara amb cada patró en l'ordre en què s'enumeren. Per tant, podeu provar l'absència d'una coincidència fent que l'últim patró sigui garantit per aparèixer, com ara un indicador. En situacions on no hi ha cap indicació, heu d'utilitzar temps d'espera (igual que ho faria si interaccionés manualment).

Els patrons s'especifiquen de tres maneres. Per defecte, els patrons s'especifiquen com amb els de Tcl cadena de coincidència comandament. (Aquests patrons també són semblants a les expressions regulars de la C-shell normalment denominades patrons de "glob"). El -gl La bandera pot utilitzar-se per protegir patrons que d'una altra manera puguin correspondre espera banderes de fer-ho. Qualsevol patró que comenci amb un "-" ha de ser protegit d'aquesta manera. (Totes les cadenes que comencen per "-" estan reservades per a futures opcions.)

Per exemple, el següent fragment busca un inici de sessió reeixit. (Tingues en compte que avortar es presumeix que es tracta d'un procediment definit en un altre lloc del guió).

espera {ocupat {posa ocupat n; exp_continue} ha fallat en avortar "contrasenya no vàlida" abortar el temps d'espera avortat connectat}

Les quotes són necessàries en el quart patró ja que conté un espai que, d'altra manera, separaria el patró de l'acció.Els patrons amb la mateixa acció (com el 3 i 4) requereixen tornar a incloure les accions. Això es pot evitar utilitzant patrons d'estil regexp (vegeu a continuació). Podeu trobar més informació sobre la formació de patrons d'estil globus al manual de Tcl.

Els patrons d'estil de Regexp segueixen la sintaxi definida per Tcl's regexp (abreviatura de "expressió regular") comanda. Els patrons de regexp s'introdueixen amb la bandera -re . L'exemple anterior es pot reescriure utilitzant un regexp com:

espera {ocupat {posa ocupat n; exp_continue} -re "fallat | contrasenya no vàlida" abort timeout abort connectat}

Tots dos tipus de patrons són "sense coincidències". Això vol dir que els patrons no han de coincidir amb la cadena sencera, però pot començar i acabar la coincidència en qualsevol lloc de la cadena (sempre que la resta coincideixi). Utilitzeu ^ perquè coincideixi amb l'inici d'una cadena i $ coincideixi amb el final. Tingueu en compte que si no espereu el final d'una cadena, les vostres respostes poden acabar fàcilment al centre de la cadena, ja que es fan ressons del procés generat. Tot i que encara produeix resultats correctes, la sortida pot semblar antinatural. D'aquesta manera, s'utilitza l'ús de $ si es pot descriure exactament els caràcters al final d'una cadena.

Tingueu en compte que, en molts editors, els ^ i $ coincideixen amb el principi i el final de les línies, respectivament. Tanmateix, com que esperar no està orientat a la línia, aquests caràcters coincideixen amb el principi i el final de les dades (a diferència de les línies) actualment a la memòria intermèdia esperada. (A més, vegeu la nota de sota sobre "indigestió del sistema").

El -ex La marca fa que el patró sigui igualat com una cadena "exacta". No es fa cap interpretació de *, ^, etc. (tot i que encara cal observar les convencions habituals de Tcl). Els patrons exactes sempre són incorrectes.

El -nocase La marca fa que els caràcters majúsculs de la sortida es comparin com si fossin caràcters en minúscules. El patró no es veu afectat.

Mentre es llegeix la sortida, més de 2000 bytes poden forçar els bytes anteriors a ser "oblidats". Això es pot canviar amb la funció match_max . (Tingueu en compte que els valors excessivament grans poden alentir el patró de patrons). Si patlist és full_buffer , s'executa el cos corresponent si match_max S'han rebut bytes i no s'han trobat cap altre patró. Ja sigui o no full_buffer la paraula clau s'utilitza, els caràcters oblidats s'escriuen a expect_out (buffer).

Si patlist és la paraula clau nul , i es permeten nul · les (a través de la remove_nulls ordre), el cos corresponent s'executa si un ASCII 0 és igual. No és possible fer coincidir 0 bytes a través de patrons globus o regexp.

En fer coincidir un patró (o eof o full_buffer), es guarda qualsevol sortida coincident i prèviament incomparable a la variable expect_out (buffer) . Es poden guardar fins a 9 coincidències de subcadenes de regexp a les variables expect_out (1, cadena) a través expect_out (9, cadena) . Si el -indices La bandera s'utilitza abans d'un patró, els índexs d'inici i final (en una forma adequada per a estrany ) de les 10 cadenes s'emmagatzemen en les variables expect_out (X, inici) i expect_out (X, final) on X és un dígit, correspon a la posició de subcadena a la memòria intermèdia. 0 es refereix a cadenes que coincideixen amb el patró sencer i es generen per als patrons glob, així com els patrons de regexp. Per exemple, si un procés ha produït una sortida de "abcdefgh n", el resultat de:

espera "cd"

és com si s'haguessin executat les següents afirmacions:

establir expect_out (0, cadena) cd set expect_out (buffer) abcd

i "efgh n" queda al buffer de sortida. Si un procés produïa la sortida "abbbcabkkkka n", el resultat de:

espera -indices -re "b (b *). * (k +)"

és com si s'haguessin executat les següents afirmacions:

establir expect_out (0, start) 1 set expect_out (0, end) set set expect_out (0, string) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, end) set set expect_out (1, string) set set expect_out (2, inici) set set expect_out (2, final) set set expect_out (2, string) k set expect_out (buffer) abbbcabkkkk

i "a n" queda al buffer de sortida. El patró "*" (i -re ". *") Eliminarà el buffer de sortida sense llegir cap sortida del procés.

Normalment, la sortida coincident es descarta dels buffers interns de Expect. Això es pot prevenir prefixant un patró amb el -Notransferència bandera Aquesta bandera és especialment útil a l'hora d'experimentar (i es pot abreviar a "-not" per a la seva conveniència mentre s'està experimentant).

L'identificador spawn associat amb la sortida coincident (o eof o full_buffer) s'emmagatzema a expect_out (spawn_id) .

El -temporada La marca fa que l'ordre esperada actual utilitzi el valor següent com a temps d'espera en comptes d'utilitzar el valor de la variable de temps d'espera.

De manera predeterminada, els patrons es combinen amb la sortida del procés actual, però la -i L'indicador declara que la sortida de la llista spawn_id anomenada es compara amb els patrons següents (fins al següent -i ). La llista spawn_id ha de ser una llista separada d'espai spawn_ids o una variable que faci referència a aquesta llista de spawn_id.

Per exemple, el següent exemple espera "connectat" del procés actual, o "ocupat", "fallat" o "contrasenya no vàlida" de la spawn_id anomenada per $ proc2.

espera {-i $ proc2 ocupat {posa ocupat n; exp_continue} -re "fallat | contrasenya no vàlida" abort timeout abort connectat}

El valor de la variable global any_spawn_id es pot utilitzar per combinar els patrons amb qualsevol spawn_ids que es nomeni amb tots els altres -i banderes al corrent espera comandament. El spawn_id de a -i bandera sense patró associat (és a dir, seguit immediatament per un altre) -i ) està disponible per a qualsevol altre patró en el mateix espera comanda associada amb any_spawn_id.

El -i la bandera també pot nomenar una variable global, en aquest cas la variable es llegeix per obtenir una llista d'identitats generades. La variable es rellegirà cada vegada que canvia. Això proporciona una manera de canviar la font d'E / S mentre la comanda està en execució. Els identificadors de spawn proporcionats d'aquesta manera es diuen com a identificadors de generació "indirectes".

Accions com ara trencar i continueu provoquen estructures de control (és a dir, per a , Proc ) per comportar-se de la manera habitual. L'ordre exp_continueu permet espera per continuar executant en comptes de tornar com normalment ho faria.

Això és útil per evitar bucles explícits o declaracions de expectatives repetides. El següent exemple forma part d'un fragment per automatitzar el rlogin. El exp_continueu evita haver d'escriure un segon espera (per buscar l'indicatiu de nou) si el rlogin demana una contrasenya.

Espero {Password: (stty -echo send_user "password (per $ user) a $ host:" expect_user -re "(. *) n" send_user " n" enviar "$ expect_out (1, cadena) r" stty echo exp_continue} incorrecta {send_user "contrasenya o compte no vàlida n" exit} timeout {send_user "connexió a $ host ha caducat n" exit} eof {send_user "connexió a host fallat: $ expect_out (buffer)" exit) - missatge re $)

Per exemple, el següent fragment podria ajudar a un usuari a guiar una interacció que ja està totalment automatitzada. En aquest cas, el terminal es posa en mode brut. Si l'usuari premeu "+", s'incrementa una variable. Si es prem la tecla "p", es enviaran diverses devolucions al procés, potser per fer-ho d'alguna manera i "i" permet que l'usuari interactuï amb el procés, estalviant de manera efectiva el control del script. En cada cas, el exp_continueu permet el corrent espera per continuar la coincidència del patró després d'executar l'acció actual.

stty raw -echo expect_after {-i $ user_spawn_id "p" {enviar " r r r"; exp_continue} "+" {incr foo; exp_continue} "i" {interactueu; exp_continue} "deixar" sortir

Per defecte, exp_continueu restaura el temporitzador de temps d'espera. El temporitzador no es reinicia, si exp_continueu es diu amb el -continue_timer bandera

expect_after expect_args

funciona de manera idèntica a la Esperar abans excepte si hi ha patrons de tots dos espera i expect_after pot coincidir, el espera S'utilitza un patró. Vegeu el Esperar abans comanda per obtenir més informació.

expect_background expect_args

pren els mateixos arguments queespera , però torna immediatament. Els patrons es comproven cada vegada que arriba una nova entrada. El patrótemps d'espera iper defecte no tenen sentitespera_de_cerca i es rebutgen en silenci. En cas contrari, elespera_de_cerca usos d'ordresEsperar abans iexpect_after patrons igual queespera ho fa.

Quanespera_de_cerca S'estan avaluant les accions, es bloqueja el processament de fons per a la mateixa identificació de spawn. El procés de fons es desbloqueja quan s'acaba l'acció. Si bé el blocatge de fons està bloquejat, és possible fer un (primer pla)espera a la mateixa identitat de generació.

No es pot executar unespera mentre que unespera_de_cerca està desbloquejat.espera_de_cerca per a un identificador genètic concret s'elimina declarant un nou expect_background amb la mateixa id. de generació. Declarantespera_de_cerca sense patró, elimina l'identificador de generació donat de la possibilitat de combinar patrons en segon pla.

espera_prevés expect_args

pren els mateixos arguments queespera , però torna immediatament. Parells de patrons d'acció dels més recentsEsperar abans amb el mateix id. generador s'afegeixen implícitament a qualsevol seguimentespera ordres. Si un patró coincideix, es tracta com si s'hagués especificat a la finestraespera el comandament propi i el cos associat s'executa en el context de laespera comandament. Si els patrons d'ambdósEsperar abans iespera pot coincidir, elEsperar abans S'utilitza un patró.

Si no s'especifica cap patró, l'id de generació no està marcada per cap patró.

A menys que s'hagi anul·lat per a-i bandera,Esperar abans Els patrons coincideixen amb l'id. de spawn definida en el moment que elEsperar abans S'ha executat l'ordre (no quan el patró coincideix).

El flag -info causaEsperar abans per tornar les especificacions actuals de quins patrons concordarà. De manera predeterminada, informa sobre l'id. Actual de generació. Es pot donar una especificació opcional d'identificació de generació per obtenir informació sobre l'id. Per exemple

expect_before -info -i $ proc

Com a màxim es pot donar una especificació de generació d'identificació. L'indicador flag-suppresses suprimeix ids de generació directa que només provenen de les especificacions indirectes.

En lloc d'especificar un identificador de spawn, la bandera "-tot" farà que "-info" informi sobre tots els identificadors de spawn.

La sortida de la marca -info pot ser reutilitzada com a argument a esperar_vaure.

expect_tty expect_args

és comespera però llegeix els caràcters de / dev / tty (és a dir, les pulsacions de teclat de l'usuari). Per defecte, la lectura es realitza en mode cuinat. Per tant, les línies han d'acabar amb una devolució per fer-hoespera per veure'ls. Això es pot canviar a través deStty (vegeu elStty ordre següent).

expect_user expect_args

és comespera però llegeix els caràcters de stdin (és a dir, les pulsacions de teclat de l'usuari). Per defecte, la lectura es realitza en mode cuinat. Per tant, les línies han d'acabar amb una devolució per fer-hoespera per veure'ls.Això es pot canviar a través deStty (vegeu elStty ordre següent).

forquilla

crea un nou procés. El nou procés és una còpia exacta del correntEsperar procés Amb èxit,forquilla retorna 0 al procés nou (secundari) i retorna l'ID del procés del procés secundari al procés primari. El fracàs (invariablement per falta de recursos, p. Ex., Espai d'intercanvi, memòria),forquilla retorna -1 al procés primari i no es crea cap procés secundari.

Els processos de bifurcació surten a través de lasortir comandament, igual que el procés original. Es permet escriure als fitxers de registre els processos de bifurcació. Si no inhabiliteu la depuració o el registre de la majoria de processos, el resultat pot ser confús.

Alguns desenvolupaments de pty poden ser confosos per diversos lectors i escriptors, fins i tot momentàniament. Per tant, és més segur per aforquilla abans dels processos de generació.

interactueu string1 body1 … stringn bodyn

dóna el control del procés actual a l'usuari, de manera que les pulsacions de tecles s'envien al procés actual i es tornen els processos actuals i estndards del procés actual.

Els parells de cos de cadena es poden especificar com a arguments, en aquest cas el cos s'executa quan s'introdueix la cadena corresponent. (De manera predeterminada, la cadena no s'envia al procés actual)intèrpret S'assumeix l'ordre, si falta el cos final.

Si els arguments a totinteractuar la instrucció requereix més d'una línia, tots els arguments es poden "integrar" en un d'ells per tal d'evitar la finalització de cada línia amb una barra invertida. En aquest cas, es produiran les substitucions habituals de Tcl malgrat les claus.

Per exemple, la següent comanda s'executa amb els següents parells de cos de cordes definits: Quan ^ Z es pressiona,Esperar està suspès. (The-resta la bandera restaura els modes de terminal.) Quan ^ A es pressiona, l'usuari veu "heu teclejat un control-A" i el procés s'envia a ^ A. Quan es pressiona $, l'usuari veu la data. Quan es pressiona ^ C,Esperar sortides. Si s'introdueix "foo", l'usuari veu la "barra". Quan es pressiona ~~, elEsperar l'intèrpret executa de manera interactiva.

configureu CTRLZ 032 interactueu {-reset $ CTRLZ {exec kill -STOP pid} 001 {send_user "heu teclejat un control-A n"; enviar " 001"} $ {send_user "La data és format de rellotge segells de rellotge.}} 003 sortir foo {send_user" bar "} ~~}

En els parells de cadenes de cos, les cadenes coincideixen en l'ordre en què es classifiquen com a arguments. Les cadenes que coincideixen parcialment no s'envien al procés actual amb vista a la resta. Si els caràcters s'introdueixen de manera que ja no pot ser una coincidència, només s'enviarà la part de la cadena al procés que possiblement no pugui començar una altra coincidència. D'aquesta manera, les cadenes que són subcadenes de coincidències parcials poden coincidir més endavant, si les cadenes originals que intentava ser coincidència fracassen en última instància.

Per defecte, la combinació de cadenes és exacta, sense targetes salvatges. (En canvi, elespera L'ordre usa patrons d'estil global de manera predeterminada.) The-ex La bandera es pot utilitzar per protegir els patrons que d'una altra manera podrien coincidirinteractuar banderes de fer-ho. Qualsevol patró que comenci amb un "-" ha de ser protegit d'aquesta manera. (Totes les cadenes que comencen per "-" estan reservades per a futures opcions.)

El-re La bandera obliga a la cadena a interpretar-se com un patró d'estil regexp. En aquest cas, les subcadenes coincidents s'emmagatzemen a la variable interact_out de manera similar al camíespera emmagatzema la seva sortida a la variableexpect_out . El-indices La bandera és igualment compatible.

El patróeof introdueix una acció que s'executa al final de fitxer. Un separateof El patró també pot seguir el-output marca en aquest cas es combina si es detecta una eof mentre s'escriu la sortida. El valor per defecteeof L'acció és "tornar", de manera queinteractuar simplement torna sobre qualsevol EOF.

El patrótemps d'espera introdueix un temps d'espera (en segons) i una acció que s'executa després que no s'hagi llegit cap caràcter durant un temps determinat. Eltemps d'espera El patró s'aplica al procés especificat més recentment. No hi ha un temps d'espera predeterminat. La variable especial "timeout" (utilitzada per laespera comanda) no té cap incidència en aquest temps d'espera.

Per exemple, es podria utilitzar la següent instrucció per autologout usuaris que no hagin escrit res durant una hora, però que encara reben missatges freqüents del sistema:

interactuar-entrada $ user_spawn_id timeout 3600 return -output $ spawn_id

Si el patró és la paraula claunul , i es permeten nul · les (a través de laremove_nulls ordre), el cos corresponent s'executa si un ASCII 0 és igual. No és possible fer coincidir 0 bytes a través de patrons globus o regexp.

Predicació d'un patró amb la bandera-jo escric causa la variable interact_out (spawn_id) per configurar-lo a spawn_id que coincideix amb el patró (o eof).

Accions com aratrencar icontinueu provoquen estructures de control (és a dir,per a , Proc ) per comportar-se de la manera habitual. malgrat aixòtornada fa que interactuï per tornar al seu interlocutor, mentre queinter_return causesinteractuar per provocar un retorn a la persona que truca. Per exemple, si es diu "proc foo"interactuar que després va executar l'accióinter_return , proc foo tornaria. (Això significa que siinteractuar trucadesintèrpret mecanografia interactivatornada farà que la interacció continuï, mentre queinter_return farà que l'interacció torni a la seva persona que truca.)

Durantinteractuar , el mode en brut s'utilitza perquè tots els caràcters es puguin passar al procés actual.Si el procés actual no capta senyals de control de treball, s'aturarà si s'envia un senyal de parada (per defecte ^ Z). Per reiniciar-lo, envieu un senyal de continuar (com per exemple "kill -CONT"). Si realment voleu enviar un SIGSTOP a un procés d'aquest tipus (per ^ Z), considereu primer la generació de csh i després executeu el vostre programa. D'altra banda, si voleu enviar un SIGSTOP aEsperar sí mateix, intèrpret de primera trucada (potser usant un personatge d'escapament) i, a continuació, premeu ^ Z.

Els parells de cos de cordes es poden utilitzar com a taquigrafia per evitar haver d'entrar al intèrpret i executar comandaments interactivament. El mode de terminal anterior s'utilitza mentre s'executa el cos d'un parell de cos de cadena.

Per a la velocitat, les accions s'executen en mode sense processar de manera predeterminada. El-resta la bandera restablirà el terminal a la manera que tenia abansinteractuar Es va executar (invariablement, mode cuinat). Tingueu en compte que els caràcters que es van introduir quan es commou el mode es poden perdre (una característica desafortunada del controlador de terminal en alguns sistemes). L'única raó per utilitzar-resta és si la vostra acció depèn de córrer en mode cuinat.

El-echo l'indicador envia caràcters que coincideixen amb el següent patró al procés que els generava a mesura que es llegeix cada caràcter. Això pot ser útil quan l'usuari necessita veure comentaris des dels patrons que s'utilitzen parcialment.

Si un patró es fa ressò però eventualment no coincideix, els caràcters s'envien al procés generat. Si el procés generat els fa ressò, l'usuari veurà els caràcters dues vegades.-echo probablement només sigui apropiat en situacions en què l'usuari no pugui completar el patró. Per exemple, el següent extracte és de rftp, l'script recursive-ftp, on es demana a l'usuari que introdueixi ~ g, ~ p, o ~ l, per obtenir, posar o llistar el directori actual recursivament. Aquests estan tan allunyats de les ordres ftp normals, que és poc probable que l'usuari escrigui ~ seguit d'una altra cosa, excepte per error, en aquest cas, probablement simplement ignorareu el resultat de totes maneres.

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

El-nobuffer L'indicador envia caràcters que coincideixen amb el següent patró al procés de sortida a mesura que es llegeixen els caràcters.

Això és útil quan voleu que un programa faci retrocedir el patró. Per exemple, es pot utilitzar el següent per controlar on està marcant una persona (un mòdem d'estil Hayes). Cada vegada que es veu "atd", el script registra la resta de la línia.

proc lognumber {} {interact -nobuffer -re "(. *) r" return posa $ log "format de rellotge segells de rellotge: marcats $ interact_out (1, cadena)"} interactuen -nobuffer "atd" lognumber

Durantinteractuar , ús previ delog_user s'ignora. En particular,interactuar obligarà a la seva sortida a ser registrada (enviada a la sortida estàndard) ja que es presumeix que l'usuari no vol interactuar cegament.

El-o La bandera fa que s'apliquin els següents parells de tecles i cos a la sortida del procés actual. Això pot ser útil, per exemple, quan es tracta de màquines que envien caràcters no desitjats durant una sessió de telnet.

Per defecte,interactuar espera que l 'usuari estigui escrivint stdin i que llegeixi el codi obertEsperar procés mateix. El-u marca (per "usuari") fainteractuar Busqueu a l'usuari com el procés anomenat pel seu argument (que ha de ser un id generat).

Això permet unir dos processos no relacionats sense utilitzar un bucle explícit. Per ajudar a la depuració, esperar que els diagnòstics sempre passin a stderr (o estanc per a certa informació de registre i depuració). Per la mateixa raó, laintèrpret L'ordre es llegirà de forma interactiva des de stdin.

Per exemple, el fragment següent crea un procés d'inici de sessió. A continuació, marca l'usuari (no es mostra) i, finalment, connecta els dos junts. Per descomptat, qualsevol procés pot ser substituït per iniciar sessió. Un intèrpret d'ordres, per exemple, permetria a l'usuari treballar sense subministrar un compte i contrasenya.

engega l'inici de sessió d'inici de sessió $ spawn_id spawn tip modem # marcar de nou a l'usuari # connectar l'usuari per iniciar la sessió interactua -u $ login

Per enviar una sortida a diversos processos, enumereu cada llista d'identificació de generació prèvia per a-output bandera L'entrada per a un grup d'identificadors de generació de sortida pot ser determinada per una llista d'identificació de spawn prefabricada per aentrada bandera (Tots dosentrada i-output pot prendre llistes de la mateixa forma que la-i bandera a laespera ordre, excepte que qualsevol_spawn_id no té sentitinteractuar ). Tots els següents banderins i cadenes (o patrons) s'apliquen a aquesta entrada fins que aparegui un altre indicador d'entrada. Si noentrada apareix,-output implica "-input $ user_spawn_id -output". (De la mateixa manera, amb patrons que no tenenentrada .) Si n'hi haentrada s'especifica, invalida $ user_spawn_id. Si un segonentrada s'especifica, invalida $ spawn_id. Addicionalentrada es poden especificar banderes.

Els dos processos d'entrada implicats per defecte tenen les seves sortides especificades com $ spawn_id i $ user_spawn_id (en reversa). Si aentrada la bandera apareix amb el no-output bandera, els caràcters d'aquest procés es descarten.

El-i l'indicador introdueix un reemplaçament per a l'spawn_id actual quan no hi ha cap altreentrada o-output s'utilitzen banderes. Una bandera -i implica una bandera-o.

És possible canviar els processos que s'estan interactuant amb els identificadors indirectes de generació. (Els identificadors de spawn indirecte es descriuen a la secció de la comanda expect.) Els identificadors indirectes de spawn es poden especificar amb els indicadors -i, -u, -input o -output.

intèrpret args

fa que l'usuari es demani de manera interactivaEsperar i ordres Tcl. S'imprimeix el resultat de cada comanda.

Accions com aratrencar icontinueu provoquen estructures de control (és a dir,per a , Proc ) per comportar-se de la manera habitual. malgrat aixòtornada fa que l'intèrpret torni al seu interlocutor, mentre queinter_return causesintèrpret per provocar un retorn a la persona que truca. Per exemple, si es diu "proc foo"intèrpret que després va executar l'accióinter_return , proc foo tornaria. Comença qualsevol altra ordreintèrpret per seguir demanant nous comandaments.

Per defecte, l'indicatiu conté dos enters. El primer enter descriu la profunditat de la pila d'avaluació (és a dir, quantes vegades s'ha anomenat Tcl_Eval). El segon enter és l'identificador de la història de Tcl. L'indicatiu es pot definir mitjançant la definició d'un procediment anomenat "prompt1", el valor de devolució es converteix en el següent indicador. Si una declaració té cometes obertes, parèntesis, claudàtors o claudàtors, un indicador secundari (per defecte "+>") s'emet a la nova línia. L'indicador secundari es pot definir mitjançant la definició d'un procediment anomenat "prompt2".

Durantintèrpret , s'utilitza el mode cuit, fins i tot si la seva persona que truca estava utilitzant el mode en brut.

Si stdin està tancat,intèrpret tornarà a menys que el-eof s'utilitza la bandera, en aquest cas es invoca l'argument posterior.

log_file args -a fitxer

Si es proporciona un nom de fitxer,registre_filo registrarà una transcripció de la sessió (començant en aquest punt) en el fitxer.registre_filo deixarà de gravar si no es dóna cap argument. Qualsevol fitxer de registre anterior està tancat.

En lloc d'un nom de fitxer, es pot proporcionar un identificador de fitxer Tcl usant el-open o-leaveopen banderes. Això és similar algenera comandament. (Veuregenera per obtenir més informació.)

El-a L'indicador força la sortida que s'ha de registrar que ha estat suprimit per lalog_user comandament.

Per defecte, elregistre_filo comandament afegeix a arxius antics en lloc de truncar-los, per la comoditat de poder activar el registre i en diverses ocasions en una sessió. Per truncar fitxers, utilitzeu el-noappend bandera

El-info La marca fa que log_file retorni una descripció dels arguments no informatius més recents donats.

log_user-info | 0 | 1

Per defecte, el diàleg enviar / esperar es registra a stdout (i un fitxer de registre si està obert). El registre a l'estoc està desactivat per l'ordre "log_user 0" i es torna a activar per "log_user 1". El registre al fitxer de registre no canvia.

El-info La marca fa que log_user retorni una descripció dels arguments no informatius més recents donats.

match_max -d -i spawn_id size

defineix la mida del buffer (en bytes) usat internament perespera . Sense mida argument, es torna la mida actual.

Amb el-d marca, s'estableix la mida predeterminada. (El valor predeterminat inicial és 2000). Amb el-i bandera, la mida s'estableix per a l'identificador de generació de generació, en cas contrari s'estableix per al procés actual.

superposició - # spawn_id - # spawn_id … programa args

s'executa "programa args "en lloc del correntEsperar programa que finalitza. Un argument de guions nets obliga a un guionet al davant del nom de l'ordre com si es tractés d'un intèrpret d'ordres d'inici de sessió. Tots els spawn_ids estan tancats excepte els anomenats arguments. Aquests es mapegen en els identificadors de fitxers amb nom.

Spawn_ids està mapejat per identificar els identificadors del nou programa per heretar. Per exemple, la següent línia executa escacs i permet controlar-la pel procés actual, per exemple, un mestre d'escacs.

superposició -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id escacs

Això és més eficient que "interactuar-u", però, sacrifica la capacitat de fer la interacció programada des de laEsperar el procés ja no està en control.

Tingueu en compte que no es proporciona cap terminal de control. D'aquesta manera, si desconnecta o reapareix l'entrada estàndard, els programes que fan el control del treball (petxines, inici de sessió, etc.) no funcionaran correctament.

paritat -d -i spawn_id valor

defineix si la paritat s'ha de conservar o eliminar de la sortida dels processos generats. Si valor és zero, la paritat és desposseïda, en cas contrari no es desconeix. Sense valor argument, es torna el valor actual.

Amb el-d bandera, s'estableix el valor de paritat predeterminat. (El valor predeterminat inicial és 1, és a dir, la paritat no es desposseeix)-i bandera, el valor de la paritat s'estableix per a l'identificador de generació de generació, si no, s'estableix per al procés actual.

remove_nulls -d -i spawn_id value

defineix si els nul·les es mantenen o s'eliminen de la sortida dels processos generats abans de la concordança de patrons o de l'emmagatzematge a la variable expect_out o interact_out . Si valor és 1, els nuls són eliminats. Si valor és 0, els nuls no s'eliminen. Sense valor argument, es torna el valor actual.

Amb el-d bandera, el valor predeterminat està establert. (El valor predeterminat inicial és 1, és a dir, els nuls són eliminats). Amb el-i marca, el valor s'estableix per a l'identificador de generació de generació, en cas contrari s'estableix per al procés actual.

Si s'eliminen o no nuls,Esperar registrarà bytes nuls en el registre i l'estoc.

envieu -flags cadena

Envia cadena al procés actual. Per exemple, l'ordre

envia "hola món r"

envia els caràcters, h l l o w o r l d al procés actual. (Inclou una ordre similar a printf (anomenadaformat ) que pot generar cadenes complexes arbitràriament.)

Els caràcters s'envien immediatament, tot i que els programes amb entrada amb buffer de línia no llegiran els caràcters fins que no s'enviïn un caràcter de retorn. Es denota un caràcter de retorn " r".

El-- La bandera obliga al següent argument a interpretar-se com una cadena en lloc d'una bandera.Qualsevol cadena pot anar precedida per "-" si realment es veu com una bandera. Això proporciona un mecanisme fiable per especificar les cadenes de variables sense que siguin interferits per aquells que accidentalment es veuen com a banderes. (Totes les cadenes que comencen per "-" estan reservades per a futures opcions.)

El-i L'indicador declara que la cadena s'envia a spawn_id. Si el spawn_id és user_spawn_id , i el terminal està en mode brut, les línies noves de la cadena es tradueixen a seqüències return-newline perquè apareguin com si el terminal estigués en mode cuinat. El-rau La bandera no permet aquesta traducció.

El-nul L'indicador envia caràcters nuls (0 bytes). De manera predeterminada, s'envia un nul. Un enter pot seguir el-nul per indicar quants nuls s'han d'enviar.

El-trencar La bandera genera un estat de ruptura. Això només té sentit si l'id de generació es refereix a un dispositiu tty obert a través de "spawn-opens". Si heu engendrat un procés com ara un consell, heu d'utilitzar la convenció de la punta per generar un descans.

El-s l'indicador força la sortida a enviar "lentament", evitant així la situació comuna en què una computadora desactiva un buffer d'entrada dissenyat per a un ésser humà que no superaria mai la mateixa memòria intermèdia. Aquesta sortida es controla pel valor de la variable "send_slow" que porta una llista de dos elements. El primer element és un enter que descriu la quantitat de bytes a enviar atòmicament. El segon element és un número real que descriu el nombre de segons pels quals l'enviament atòmic s'ha de separar. Per exemple, "set send_slow (10 .001)" obligaria a "enviar-s" a enviar cadenes amb 1 mil·lisegon entre cada 10 caràcters enviats.

El-h L'indicador força la sortida a enviar (una miqueta) com una persona que escriviu realment. Es mostren retards entre humans entre els personatges. (L'algoritme es basa en una distribució de Weibull, amb modificacions que s'adapten a aquesta aplicació particular). Aquesta sortida es controla pel valor de la variable "send_man" que porta una llista de cinc elements. Els primers dos elements són un temps interarrival mitjà de caràcters en segons. El primer s'utilitza per defecte. El segon s'utilitza en termes de paraules, per simular les pauses subtils que ocasionalment es produeixen en aquestes transicions. El tercer paràmetre és una mesura de variabilitat on .1 és força variable, 1 és raonablement variable i 10 és força invariable. Els extrems són 0 fins a l'infinit. Els dos últims paràmetres són, respectivament, un temps interarrival mínim i màxim. El mínim i el màxim s'utilitzen per última vegada i "clip" l'última vegada. La mitjana final pot ser bastant diferent de la mitjana donada si el valor mínim i màxim és suficient.

Com a exemple, el següent comandament emula un mecanisme ràpid i consistent:

configure send_human {.1 .3 1 .05 2} enviar -h "tinc gana, anem a dinar".

mentre que el següent podria ser més adequat després d'una ressaca:

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

Tingueu en compte que els errors no es simulen, tot i que podeu configurar situacions de correcció d'errors per incrustar errors i correccions en un argument d'enviament.

Les banderes per a l'enviament de caràcters nuls, per a l'enviament de pauses, per obligar a la sortida lenta i per a la producció d'estil humà són excloents mútuament. Només s'utilitzarà el que s'hagi especificat. A més, no cadena L'argument es pot especificar amb les banderes per a l'enviament de caràcters nuls o interrupcions.

És una bona idea precedir la primeraenviar a un procés per unespera. espera Esperarà que el procés comenci, mentre queenviar no pot. En particular, si és el primerenviar finalitza abans que el procés comenci a funcionar, corre el risc que les dades s'ignorin. En situacions en què els programes interactius no ofereixen un missatge inicial, podeu precedirenviar per un retard com en:

# Per evitar donar consells als pirates informàtics sobre com interrompre, # aquest sistema no sol·licita una contrasenya externa. # Espereu durant 5 segons per executar per completar el telnet generat very.secure.gov el so 5 envieu la contrasenya r

exp_send és un àlies per a enviar. Si esteu utilitzant Expectk o alguna altra v