Esperar o comando Linux / Unix

Expect é un programa que fala con outros programas interactivos segundo un script. Seguindo o guión, Expect sabe o que se pode esperar dun programa e cal será a resposta correcta. Unha linguaxe interpretada fornece estruturas de control de ramificación e alto nivel para dirixir o diálogo. Ademais, o usuario pode asumir o control e interactuar directamente cando o desexa, logo devolver o control ao script.

Expectk é unha mestura de Expect e Tk. Compórtase do mesmo xeito que Espero eo desexo de Tk. Espérase tamén se pode usar directamente en C ou C + + sen Tcl.

O nome "Esperar" provén da idea de enviar / esperar secuencias popularizadas por uucp, kermit e outros programas de control de módem. Non obstante, a diferenza do uucp, Expect é xeneralizado para que se poida executar como un comando de nivel de usuario con calquera programa e tarefa en mente. Espere pode falar con varios programas ao mesmo tempo.

Que pode esperar?

Por exemplo, aquí hai algunhas cousas que o comando expect pode facer:

Hai unha variedade de razóns polas que o shell non pode realizar estas tarefas. Todos son posibles con Esperar.

En xeral, Esperar é útil para executar calquera programa que requira interacción entre o programa eo usuario. Todo o que é necesario é que a interacción pode caracterizarse mediante programación. Espere tamén pode devolver o control ao usuario sen deter o programa que se está a controlar. Do mesmo xeito, o usuario pode devolver o control ao script en calquera momento.

Uso

Espere ler cmdfile para unha lista dos comandos a executar. ¡Espero que se invoque implícitamente nos sistemas que admitan o #! notación marcando o script como executable e facendo a primeira liña no script:

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

Por suposto, o camiño debe describir con precisión o lugar onde se espera vivir. / usr / local / bin é só un exemplo.

A marca -c prefire un comando para ser executado antes de calquera no script. O comando debe ser citado para evitar que o intérprete desvíe. Esta opción pode usarse varias veces. Múltiples comandos poden ser executados cun único -c separándoos con punto e coma. Os comandos executáronse na orde que aparecen. Ao usar Expectk, esta opción especifícase como -command.

A bandeira -d permite algunha saída de diagnóstico, que reporta principalmente a actividade interna dos comandos, como esperar e interactuar. Esta bandeira ten o mesmo efecto que "exp_internal 1" ao comezo dun script de Expect, ademais da versión de Expect está impresa.

A bandeira -D permite un depurador interactivo. Debería seguir un valor enteiro. O depurador tomará o control antes do seguinte proceso de Tcl se o valor non é cero ou se se preme a ^ C ou o punto de quebra é alcanzado ou outro comando de depurador apropiado aparece no script. Ao usar Expectk, esta opción especifícase como - Depurar.

A bandeira -f prefere un ficheiro desde o cal ler os comandos. A propia bandeira é opcional xa que só é útil cando se usa o botón #! notación, para que outros argumentos poidan ser subministrados na liña de comandos. Ao usar Expectk, esta opción especifícase como ficheiro.

De xeito predeterminado, o ficheiro de comando léase na memoria e execútase na súa totalidade. É ocasionalmente desexable ler ficheiros dunha liña por vez. Para forzar arquivos arbitrarios a manexar deste xeito, use a bandeira -b. Ao usar Expectk, esta opción especifícase como -buffer.

Se a cadea "-" é subministrada como nome de ficheiro, lese a entrada estándar. Use "./-" para ler dun ficheiro que se chama "-".

A marca -i causa a esperanza de solicitar interactivamente os comandos en lugar de le-los dun ficheiro. A confirmación é cancelada a través do comando de saída ou a través de EOF. A bandeira -i é asumida se non se usa ningún ficheiro de comando nin -c. Ao usar Expectk, esta opción especifícase como -interactiva.

- pódese empregar para delimitar o final das opcións. Isto é útil se quere pasar un argumento de opción ao seu script sen que sexa interpretado por Expect. Isto pódese colocar de forma útil no #! liña para evitar calquera interpretación flagel por Expect. Por exemplo, o seguinte deixará os argumentos orixinais, incluído o nome do script na variable argv .

#! / usr / local / bin / expect -

Teña en conta que as convencións usual getopt (3) e execve (2) deben observarse ao engadir argumentos ao #! liña.

O ficheiro $ exp_library / expect.rc obtense automaticamente se está presente, a non ser que se use a marca -N. (Cando se usa Expectk, esta opción especifícase como -NORC.) Inmediatamente despois, o ficheiro ~ / .expect.rc sácase automaticamente, a menos que se use a marca -n. Se a variable de entorno DOTDIR está definida, trátase como un directorio e .expect.rc léase a partir de aí. Ao usar Expectk, esta opción especifícase como -norc. Este sourcing ocorre só despois de executar calquera bandeira -c.

-v causas Espere imprimir o seu número de versión e saír. A bandeira correspondente en Expectk, que usa nomes de bandeiras longas, é -versión.

Os argumentos opcionais son construídos nunha lista e almacenados na variable denominada argv e. argc inicialízase ao longo do argv.

Argv0 defínese como o nome do script ou o binario se non se usa ningún script. Por exemplo, o seguinte imprime o nome do script e os tres primeiros argumentos:

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

Comandos

Espere usar o idioma do comando da ferramenta. Tcl proporciona fluxo de control (se, para, rompe), avaliación de expresión e varias outras características, como a definición de recursión e procedemento. Os comandos usados ​​aquí pero non definidos (set, if, exec) son comandos Tcl. Espere que admita comandos adicionais. A menos que se especifique o contrario, os comandos devolverán a cadea baleira.

Os comandos aparecen alfabeticamente para que poidan ser situados rapidamente. Non obstante, os novos usuarios poden ter máis facilidade comezar a ler as descricións de spawn, enviar, esperar e interactuar nesa orde.

pechar [-slave] [-exec 0 | 1] [-i spawn_id]

pecha a conexión co proceso actual. A maioría dos programas interactivos detectarán EOF no seu stdin e sairán; Por conseguinte, normalmente é suficiente para matar o proceso tamén. A bandeira -i declara que o proceso se pecha correspondente ao spawn_id.

Ambos esperan e interactúan detectar cando o proceso actual sae e implícitamente se pecha, pero se mata o proceso por exemplo, "exec kill $ pid", necesitará chamar de forma explícita .

A marca -execc determina se a identificación de spawn está pechada en calquera novo proceso xerado ou se o proceso está superposto. Para deixar un spawn id aberto, use o valor 0. O valor enteiro sen cero obriga a spawn pechada en calquera proceso novo.

A bandeira de sinais pecha o escravo asociado coa id. De spawn. Cando a conexión está pechada, o escravo tamén se pecha automaticamente se aínda está aberto.

Non importa se a conexión está pechada implícita ou explícitamente, debería chamar wait para aclarar o slot correspondente do proceso do kernel. O comando pechar non chama esperar porque non hai ningunha garantía de que pechar unha conexión de proceso fará que saia.

depurar [[-now] 0 | 1]

controla un depurador Tcl que permite pasar declaracións e establecer puntos de interrupción.

Sen argumentos, devólvese un 1 se o depurador non se está a executar, se non, devolve un 0.

Cun argumento 1, o depurador iníciase. Cun argumento 0, o depurador está parado. Se un argumento 1 está precedido por a -la marca, o depurador iníciase de inmediato. En caso contrario, o depurador comeza co seguinte comando Tcl.

O comando de depuración non modifica ningunha trampa. Compare isto para comezar Espero coa bandeira -D.

O comando de desconexión desconecta un proceso forked desde o terminal . Continúa executándose en segundo plano. O proceso ten o seu propio grupo de procesos. A E / S estándar redirixíase a / dev / null .

O seguinte fragmento usa desconectar para continuar a executar o script en segundo plano.

se {[fork]! = 0} saia da desconexión. . .

O seguinte script le un contrasinal e executa un programa cada hora que esixe unha contraseña cada vez que se executa. O script proporciona o contrasinal para que só teña que escribir unha vez.

enviar_user "password? \" expect_user -re "(. *) \ n" for {} 1 {} {if {[fork]! = 0} {sleep 3600; continue} desconectar spawn priv_prog espera contraseña: enviar "$ expect_out" 1, cadea) \ r ". . . saír}

Unha vantaxe de usar desconectar a característica de proceso asíncronas do depósito (&) é que o Expect pode gardar os parámetros do terminal antes da desconexión e despois aplicalos a novos ptys. Con &, Expect non ten a oportunidade de ler os parámetros do terminal xa que o terminal xa está desconectado co tempo que Expect recibe o control.

saír [opostos] [estado]

fai que se espera que saia doutra forma ou se prepare a facelo.

A marca -exitir fai que o seguinte argumento se use como controlador de saída. Sen argumentos, devólvese o controlador de saída actual.

A bandeira -noexit fai que esperar a prepararse para saír pero que non poida volver o control do sistema operativo. O controlador de saída definido polo usuario execútase así como os propios controladores internos de Expect. Non se deben executar máis comandos Expect. Isto é útil se está executando Expect con outras extensións Tcl. O intérprete actual (e a fiestra principal se está no ambiente Tk) permanecen así que as outras extensións Tcl poden limpar. Se se chama de novo a saída de Expect (isto pode ocorrer), os controladores non se volven a executar.

Ao saír, todas as conexións a procesos xerados están pechadas. O peche será detectado como EOF por procesos xerados. a saída non toma outras accións máis aló do que fai o procedemento normal _exit (2). Deste xeito, os procesos xerados que non verifican EOF poden seguir funcionando. (Unha variedade de condicións son importantes para determinar, por exemplo, cales sinais enviarán un proceso xerado, pero estas dependen do sistema, normalmente documentadas na saída (3).) Os procesos despregados que seguen a executarse serán herdados por init.

O estado (ou 0 se non se especifica) regresa como o estado de saída de Esperar . A saída execútase implícitamente se se chega ao final do script.

exp_continuar [-continue_timer]
O comando exp_continue permite que se espera continuar executando en lugar de volver como o faría normalmente. Por defecto exp_continue restablece o temporizador de tempo de espera. A bandeira -continue_timer impide que o temporizador se reinicie. (Vexa esperando máis información).

valor exp_internal [-f ficheiro]
fai que outros comandos envíen información interna de diagnóstico a esperar que stderr se o valor non é cero. Esta saída está desactivada se o valor é 0. A información de diagnóstico inclúe todos os caracteres recibidos e todos os intentos realizados para combinar a saída actual cos patróns.

Se se fornece o ficheiro opcional, toda a saída normal e de depuración escríbese a ese ficheiro (independentemente do valor do valor ). Calquera ficheiro de saída de diagnóstico anterior está pechado.

O indicador -info causa que exp_internal devolva unha descrición dos argumentos non informativos máis recentes.

exp_open [args] [-i spawn_id]
devolve un identificador de ficheiro Tcl que corresponde ao id. orixinal de spawn. O identificador de ficheiro pode entón ser usado coma se fose aberto polo comando aberto de Tcl. (A id. De spawn non debería ser usada. Non se debe executar unha espera .

A bandeira -leaveopen abandona o spawn para acceder a través de comandos Expect. Debe executarse unha espera na ID de spawn.

exp_pid [-i spawn_id]
devolve o ID de proceso correspondente ao proceso actualmente xerado. Se se usa a bandeira -i , o pid devolto correspóndese co da idéntica xeración.

exp_send
é un alias para enviar .

exp_send_error
é un alias para send_error .

exp_send_log
é un alias para send_log .

exp_send_tty
é un alias para send_tty .

exp_send_user
é un alias para send_user .

exp_version [[-exit] versión]
é útil para asegurar que o script sexa compatible coa versión actual de Expect.

Sen argumentos, devólvese a versión actual de Expect . Esta versión pode entón ser codificada no seu script. Se realmente sabe que non está a usar as funcións das versións recentes, pode especificar unha versión anterior.

As versións consisten en tres números separados por puntos. Primeiro é o número maior. Os scripts escritos para versións de Expect con un número importante diferente seguramente non funcionarán. exp_version devolve un erro se os números principais non coinciden.

O segundo é o número menor. Os scripts escritos para unha versión con menor número menor que a versión actual poden depender de algunha nova característica e non se executar. exp_version devolve un erro se os números principais coinciden, pero o número mínimo de script é maior que o de Expect .

O terceiro é un número que non ten ningunha parte na comparación de versións. Non obstante, incrementarase cando se modifique a distribución de software Expect de forma algunha, por exemplo mediante documentación adicional ou optimización. Restableceuse a 0 por cada nova versión menor.

Coa bandeira -exit , espera imprimir un erro e sae se a versión está desactualizada.

espera [[-opts] pat1 body1] ... [-opts] patn [bodyn]
agarda ata que un dos patróns coincide coa saída dun proceso xerado, transcorreu un período de tempo especificado ou se ve un final de arquivo. Se o corpo final está baleiro, pode omitirse.

Os patróns do comando expect_before máis recente úsanse implícitamente antes de calquera outro patrón. Os patróns do comando expect_after máis recente úsanse implícitamente despois de calquera outro patrón.

Se os argumentos en toda a declaración esperada requiren máis dunha liña, todos os argumentos poden ser "preparados" nun para evitar a conclusión de cada liña cunha barra invertida. Neste caso, as substitucións habituais de Tcl ocorrerán a pesar dos aparellos.

Se un patrón é a palabra clave eof , o corpo correspondente execútase ao final do ficheiro. Se un patrón é o tempo de espera da palabra clave, o corpo correspondente execútase despois do tempo de espera. Se non se usa unha palabra clave de tempo de espera, execútase unha acción nula implícita despois do tempo de espera. O período de tempo de espera predeterminado é de 10 segundos, pero pódese configurar, por exemplo a 30, polo comando "set timeout 30". Un tempo de espera infinito pode ser designado polo valor -1. Se un patrón é a palabra clave por defecto , o corpo correspondente execútase ao caducar ou ao final do ficheiro.

Se un patrón coincide, entón execútase o corpo correspondente. Espere retorna o resultado do corpo (ou a cadea baleira se non hai un patrón coincidente). No caso de que coincidan varios patróns, o que aparece primeiro emprégase para seleccionar un corpo.

Cada vez que chega a nova saída, compárase con cada patrón na orde en que se listan. Deste xeito, pode probar a ausencia dunha coincidencia facendo que o último patrón sexa garantido por aparecer, como un aviso. En situacións onde non hai indicación, debes usar o tempo de espera (do mesmo xeito que se fas cando interactúas manualmente).

Os patróns están especificados de tres xeitos. Por defecto, os patróns especificáronse co comando de cadea de Tcl. (Eses patróns tamén son semellantes ás expresións regulares de C-shell que normalmente se denominan "glob"). É posible que a bandeira -gl se empregue para protexer os patróns que de outra forma non coincidirían coas bandeiras esperadas. Calquera patrón que comece cun "-" debería estar protexido deste xeito. (Todas as cadeas que comezan por "-" están reservadas para futuras opcións.)

Por exemplo, o seguinte fragmento busca un inicio de sesión exitoso. (Ten en conta que se supón que o aborto é un procedemento definido noutro lugar do script).

espera {ocupado {pon ocupado \ n; exp_continue} fallou abortar "contrasinal non válido" abortar tempo de espera cancelar conectado}

As cuotas son necesarias no cuarto patrón xa que contén un espazo que separaría o patrón da acción. Os patróns coa mesma acción (como o 3º e 4º) requiren a lista das accións de novo. Isto pódese evitar empregando patróns de estilo regexp (ver a continuación). Pode atopar máis información sobre a formación de patróns de estilo globo no manual de Tcl.

Os patróns de estilo de Regexp seguen a sintaxe definida polo comando regexp de Tcl (abreviatura de "expresión regular"). Os patróns regexp introdúcense coa marca -re . O exemplo anterior pode ser reescrito usando un regexp como:

espera {ocupado {pon ocupado \ n; exp_continue} -re "fallou | contrasinal non válido" abortar tempo de espera cancelar conectado}

Ambos tipos de patróns son "non aforrados". Isto significa que os patróns non teñen que coincidir coa cadea completa, pero pode comezar e rematar a coincidencia en calquera lugar da cadea (sempre que o resto coincida). Use ^ para combinar o comezo dunha cadea e $ para que coincida co final. Teña en conta que, se non espera o final dunha cadea, as súas respostas poden acabar facilmente no medio da cadea a medida que se fan eco do proceso xerado. Aínda producindo resultados correctos, a saída pode parecer pouco natural. Así, o uso de $ é animado se pode describir exactamente os caracteres ao final dunha cadea.

Nótese que en moitos editores, o ^ e $ coinciden co inicio e ao final das liñas, respectivamente. Non obstante, porque esperamos non está orientado a liña, estes personaxes coinciden co inicio e ao final dos datos (en oposición ás liñas) actualmente no esperado buffer coincidente. (Tamén, vexa a nota de abaixo sobre "indixestión do sistema".)

A marca -ex fai que o patrón sexa igualado como unha cadea "exacta". Non se fai ningunha interpretación de *, ^, etc (aínda que as convencións TCL habituais aínda deben ser observadas). Os patróns exactos sempre non están afianzados.

A marca -nocase fai que os caracteres maiúsculas da saída se comparen coma se fosen minúsculas. O patrón non se ve afectado.

Ao ler a saída, máis de 2000 bytes poden forzar os bytes anteriores a ser "esquecidos". Isto pódese cambiar coa función match_max . (Teña en conta que os valores excesivamente grandes poden ralentizar a matriz de patrón.) Se a listaxe de patentes é full_buffer , o corpo correspondente execútase se coincidiron match_max bytes e non se atoparon outros patróns. Se se usa ou non a palabra clave full_buffer , os caracteres esquecidos escríbense para expect_out (buffer).

Se a listaxe de patróns é a palabra clave nula e permítenos nulos (a través do comando remove_nulls ), o corpo correspondente execútase se un único ASCII 0 coincide. Non é posible coincidir con 0 bytes a través de patróns globais ou regexp.

Ao combinar un patrón (ou eof ou full_buffer), calquera saída coincidente e previamente incomparable gárdase na variable expect_out (buffer) . Ata 9 xogos de subcadenas de regexp gárdanse nas variables expect_out (1, cadea) a través de expect_out (9, cadea) . Se a bandeira de índices emprégase antes dun patrón, os índices de inicio e finalización (nunha forma axeitada para arranxar ) das 10 secuencias están gardados nas variables expect_out (X, start) e expect_out (X, end) onde X é un díxito, corresponde á posición de subcadea no búfer. 0 refírese a cadeas que coinciden con todo o patrón e xérase para os patróns globais, así como os patróns regexp. Por exemplo, se un proceso produciu a saída de "abcdefgh \ n", o resultado de:

espera "cd"

é como se executaran as seguintes declaracións:

set expect_out (0, cadea) cd set expect_out (buffer) abcd

e "efgh \ n" queda no buffer de saída. Se un proceso produciu a saída "abbbcabkkkka \ n", o resultado de:

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

é como se executaran as seguintes declaracións:

set expect_out (0, start) 1 set expect_out (0, final) 10 set expect_out (0, cadea) bbbcabkkkk set expect_out (1, start) 2 set expect_out (1, final) 3 set expect_out (1, cadea) bb set expect_out (2, inicio) 10 set expect_out (2, final) 10 set expect_out (2, cadea) k set expect_out (buffer) abbbcabkkkk

e "a \ n" queda no búfer de saída. O patrón "*" (e -re ". *") Eliminará o buffer de saída sen ler máis saída do proceso.

Normalmente, a saída coincidente descarta os buffers internos de Expect. Isto pode evitarse prefixando un patrón coa marca -notransferir . Esta bandeira é especialmente útil para experimentar (e pode ser abreviada como "-non" para maior comodidade mentres se experimenta).

O id. De spawn asociado coa saída coincidente (ou eof ou full_buffer) almacénase en expect_out (spawn_id) .

A marca de tempo de espera fai que o comando actual espera usar o seguinte valor como tempo de espera en vez de usar o valor da variable de tempo de espera.

Por defecto, os patróns coinciden coa saída do proceso actual, con todo a bandeira -i declara que a saída da lista de spawn_id nomeada coincide cos seguintes patróns (ata o seguinte -i ). A lista spawn_id debería ser unha lista separada por espazos en branco de spawn_ids ou unha variable referente a esa lista de spawn_ids.

Por exemplo, o seguinte exemplo agarda "conectado" do proceso actual, ou "ocupado", "fallou" ou "contrasinal non válido" do spawn_id nomeado por $ proc2.

espera {-i $ proc2 ocupado {pon ocupado \ n; exp_continue} -re "fallou | contrasinal non válido" abortar tempo de espera cancelar conectado}

O valor da variable global any_spawn_id pode ser usado para combinar patróns con calquera spawn_ids que se nomeen con todas as outras -i bandeiras no comando actual esperado . O spawn_id dunha bandeira -i sen patrón asociado (é dicir, seguido inmediatamente por outro -i ) está dispoñible para outros patróns no mesmo comando de espera asociado con any_spawn_id.

A bandeira -i tamén pode nomear unha variable global, no que se leva a variable para unha lista de ids de spawn. A variable é releer cada vez que cambia. Isto proporciona unha forma de cambiar a fonte de E / S mentres o comando está en execución. Os identificadores de spawn proporcionados deste xeito chámanse identificadores de spawn "indirectos".

As accións como romper e continuar causan estruturas de control (isto é, para , proc ) comportarse do xeito habitual. O comando exp_continue permite que se espera continuar executando en lugar de volver como o faría normalmente.

Isto é útil para evitar loops explícitos ou declaracións de espera repetidas. O seguinte exemplo forma parte dun fragmento para automatizar rlogin. O exp_continue evita ter que escribir unha segunda declaración de espera (para buscar a solicitude nuevamente) se o rlogin solicita un contrasinal.

espera {Contrasinal: {stty -echo send_user "password (para $ user) en $ host:" expect_user -re "(. *) \ n" send_user "\ n" enviar "$ expect_out (1 cadea) \ r" stty eco exp_continue} incorrecto {send_user "contrasinal ou conta inválida \ n" saír} tempo de espera {send_user "conexión a $ host eliminado \ n" saír "eof {send_user \" conexión a host fallou: $ expect_out (buffer) "exit} - re $ prompt}

Por exemplo, o seguinte fragmento pode axudar un usuario a orientar unha interacción que xa está totalmente automatizada. Neste caso, o terminal ponse en modo en bruto. Se o usuario presiona "+", incrementarase unha variable. Se se preme "p", enviaranse varias voltas ao proceso, quizais para inclinarlo de algunha maneira e "i" permita ao usuario interactuar co proceso, eliminando de xeito efectivo o control do script. En cada caso, o exp_continue permite que a espera actual continúe a coincidencia de patrón despois de executar a acción actual.

stty raw -echo expect_after {-i $ user_spawn_id "p" {enviar \ "\ r \ r"; exp_continue} "+" {incr foo; exp_continue} "i" {interactuar; exp_continue} "saír" saír}

Por defecto, exp_continue restablece o tempo de espera. O temporizador non se reinicia, se exp_continue chámase coa marca -continue_timer .

expect_after [expect_args]
funciona de forma idéntica á esperada _ antes excepto que se os patróns de ambos esperan e expect_after poden coincidir, úsase o patrón de espera . Vexa o comando expect_before para obter máis información.

expect_background [expect_args]
leva os mesmos argumentos que esperamos , pero volve de inmediato. Os patróns son probados cada vez que chega unha nova entrada. O tempo de espera do patrón e o valor por defecto teñen sentido para esperar_background e son descartados de forma silenciosa. Se non, o comando expect_background usa os patróns expect_before e expect_after como o fai esperar .

Cando se están avaliando as accións de expect_background, o bloqueo de procesamento de fondo para a mesma idéntica xeración . O procesamento de fondo desbloquearase cando se complete a acción. Mentres o procesamento de fondo está bloqueado, é posible facer un (primeiro plano) espera na mesma id. De spawn.

Non se pode executar unha espera mentres un espera_background está desbloqueado. expect_background para un id. spawn particular elimínase declarando un novo expect_background coa mesma id. de spawn. A declaración de expect_background sen patrón elimina a idade de reprodución dada da capacidade de igualar os patróns en segundo plano.

esperaba antes [expect_args]
leva os mesmos argumentos que esperamos , pero volve de inmediato. Os pares de patrón-acción dos esperados máis recentes anteriormente co mesmo id. De spawn engádense implícitamente aos seguintes comandos esperados . Se un patrón coincide, trátase coma se estivese especificado no comando expect , e o corpo asociado execútase no contexto do comando expect . Se os patróns de ambos expect_before e expect poden coincidir, úsase o patrón expect_before .

Se non se especifica un patrón, a marca de spawn non está marcada para ningún patrón.

A non ser que sexa anulada por unha bandeira -i , espérase antes de que os patróns coincidan coa definición de spawn definida no momento en que se executa o comando expect_before (non cando o patrón coincide).

O indicador -info causa esperar_que antes devolver as especificacións actuais de que patróns coincidirá. De forma predeterminada, informa sobre a ID actual de spawn. Pódese proporcionar unha especificación opcional de identificación de spawn para obter información sobre a ID de spawn. Por exemplo

expect_before -info -i $ proc

Como máximo unha especificación de spawn pode ser dada. A bandeira -indirect suprime ids de spawn directos que só proveñen de especificacións indirectas.

No canto dunha especificación de spawn id, a bandeira "-all" fará que "-info" informe sobre todos os IDs de spawn.

A saída da marca -info pode ser reutilizada como o argumento para esperar- antes.

expect_tty [expect_args]
é como esperar, pero le personaxes de / dev / tty (isto é, as teclas do usuario). Por defecto, a lectura lévase a cabo no modo cocido. Así, as liñas deben terminar cunha volta para esperar ver. Isto pódese cambiar a través de stty (ver o comando stty a continuación).

expect_user [expect_args]
é como esperar pero le personaxes de stdin (ou sexa, pulsacións de teclas do usuario). Por defecto, a lectura lévase a cabo no modo cocido. Así, as liñas deben terminar cunha volta para esperar ver. Isto pódese cambiar a través de stty (ver o comando stty a continuación).

garfo
crea un novo proceso . O novo proceso é unha copia exacta do proceso actual de Expect . No éxito, a bifurcación devolve 0 ao novo proceso (neno) e devolve a ID do proceso do proceso secundario ao proceso primario. Na falla (invariablemente debido á falta de recursos, por exemplo, intercambiar espazo, memoria), a bifurcación devolve -1 ao proceso primario e non se crea ningún proceso fillo.

Os procesos forzados saen a través do comando de saída , como o proceso orixinal. Os procesos forzados permiten escribir nos ficheiros de rexistro. Se non deshabilita a depuración ou a sesión na maioría dos procesos, o resultado pode ser confuso.

Algunhas implementacións pty poden ser confundidas por moitos lectores e escritores, mesmo momentáneamente. Deste xeito, é o máis seguro de fork antes dos procesos de reprodución.

interactuar [cadea1 corpo1] ... [cadea [cadro]]
dá o control do proceso actual ao usuario, de xeito que as teclas son enviadas ao proceso actual e devolve o stdout e stderr do proceso actual.

Os pares cadea-corpo pódense especificar como argumentos, caso en que o corpo se executa cando se ingrese a cadea correspondente. (Por defecto, a cadea non se envía ao proceso actual.) Suponse o comando de intérprete , se falta o corpo final.

Se os argumentos para toda a declaración de interacción requiren máis dunha liña, todos os argumentos poden estar "preparados" nun para evitar a conclusión de cada liña cunha barra invertida. Neste caso, as substitucións habituais de Tcl ocorrerán a pesar dos aparellos.

Por exemplo, o seguinte comando funciona interactuando cos seguintes pares de cadea-corpo definidos: Cando se prema ^ Z, espera estar suspendido. (A bandeira de restablecemento restablece os modos de terminal.) Cando ^ A presiona, o usuario ve "escribiu un control-A" e o proceso envíase a ^ A. Cando se prema $, o usuario ve a data. Cando se preme ^ C, espera saír. Se se ingresa "foo", o usuario ve a "barra". Cando se preme ~~, o intérprete Expect execútase interactivamente.

configure CTRLZ \ 032 interactuar {-reset $ CTRLZ {exec kill -STOP [pid]} \ 001 {send_user "escribiu un control-A \ n"; envía "\ 001"} $ {send_user "A data é [formato de reloxo [segundos de reloxo]].}} \ 003 saír foo {send_user" bar}} ~~}

En pares de corpo de cadea, as cadeas coinciden no orden en que se listan como argumentos. As cadeas que coinciden parcialmente non se envían ao proceso actual en anticipación do resto. Se os caracteres introdúcense de xeito que xa non poida haber unha coincidencia, só a parte da cadea enviarase ao proceso que non poida comezar outra coincidencia. Deste xeito, as cadeas que son subcadenas de coincidencias parciais poden coincidir máis tarde, se as cadeas orixinais que intentaban ser coincidentes finalmente falla.

Por defecto, a combinación de cordas é exacta sen tarxetas salvaxes . (En contraste, o comando expect usa patróns de estilo globo por defecto). A bandeira -ex pode usarse para protexer os patróns que de outra forma non coincidirían coas bandeiras interactivas . Calquera patrón que comece cun "-" debería estar protexido deste xeito. (Todas as cadeas que comezan por "-" están reservadas para futuras opcións.)

A bandeira -ir forzará a cadea a ser interpretada como un patrón de estilo regexp. Neste caso, as subcadenas coincidentes almacénanse na variable interact_out do mesmo xeito que o que espera que almacena a súa saída na variable expect_out . A bandeira de símbolos tamén está soportada.

O patrón eof introduce unha acción que se executa ao final do ficheiro. Un patrón de eof separado tamén pode seguir a bandeira de saída, caso en que coincide se se detecta un eof mentres escribe a saída. A acción predeterminada é "devolver", polo que a interacción simplemente volve con calquera EOF.

O tempo de espera do patrón introduce un tempo de espera (en segundos) e unha acción que se executa despois de que non se leron lecturas durante un tempo determinado. O patrón de tempo de espera aplícase ao proceso especificado máis recentemente. Non hai tempo de espera predeterminado. A variable especial "tempo de espera" (utilizada polo comando expect ) non ten ningún efecto sobre este tempo de espera.

Por exemplo, a seguinte declaración podería usarse para autologoutear usuarios que non escribiron nada por unha hora pero que aínda reciben mensaxes frecuentes do sistema:

interactuar-entrada $ user_spawn_id tempo de espera 3600 return -output \ $ spawn_id

Se o patrón é a palabra clave nula e permítenos nulos (a través do comando remove_nulls ), o corpo correspondente execútase se un único ASCII 0 coincide. Non é posible coincidir con 0 bytes a través de patróns globais ou regexp.

Prefire un patrón coa marca -write fai que a variable interact_out (spawn_id) se configure no spawn_id que coincida co patrón (ou eof).

As accións como romper e continuar causan estruturas de control (isto é, para , proc ) comportarse do xeito habitual. Non obstante o retorno provoca que o interaccionen para volver ao seu interlocutor, mentres que o inter_return fai que interactuar provoque un retorno no seu chamador. Por exemplo, se "proc foo" chamou a interactuar e logo executou a acción inter_return , proc foo regresaría. (Isto significa que se o interactivo chama intérprete de forma interactiva, retorno de texto fará que a interacción continúe, mentres que a función inter_ fará que a interacción volva á súa chamada).

Durante a interacción , o modo en bruto utilízase para que todos os caracteres se poidan pasar ao proceso actual. Se o proceso actual non capta os sinais de control de traballo, parará se se envía un sinal de parada (por defecto ^ Z). Para reiniciarlo, envíe un sinal de continuar (por exemplo, "kill -CONT"). Se realmente desexa enviar un SIGSTOP a un proceso deste tipo (por ^ Z), considere engadir csh primeiro e executar o programa. Por outra banda, se desexa enviar un SIGSTOP a Esperarse, intérprete de primeira chamada (quizais empregando un personaxe de escape) e, a continuación, prema ^ Z.

Os pares de cadea-corpo pódense usar como taquigrafia para evitar entrar no intérprete e executar comandos interactivamente. O modo de terminal anterior úsase mentres se executa o corpo dun par de cadea de corpo.

Para a velocidade, as accións executan en modo bruto por defecto. A bandeira de restablecemento restablece o terminal ao modo que tiña antes de que se executase a interacción (invariablemente, modo cocido). Teña en conta que os caracteres introducidos cando se está a cambiar o modo (unha característica desafortunada do controlador de terminal nalgúns sistemas). A única razón para usar- restablecer é se a túa acción depende de correr en modo cocido.

A marca de echo envía caracteres que coinciden co seguinte patrón ao proceso que os xerou a medida que se len cada personaxe. Isto pode ser útil cando o usuario necesita ver os comentarios de patróns tipificados parcialmente.

Se se fai eco dun patrón pero ao final non coincide, os caracteres envíanse ao proceso xerado. Se o proceso xerado repíbeas, o usuario verá os caracteres dúas veces. -chocho probablemente sexa só apropiado en situacións onde o usuario non poida completar o estándar. Por exemplo, o seguinte fragmento é de rftp, o script recursive-ftp, onde o usuario se lle pide que ingrese ~ g, ~ p, ou ~ l para obter, colocar ou listar o directorio actual recursivamente. Estes están tan lonxe dos comandos ftp normais, de que o usuario é pouco probable que escriba ~ seguido por outra cousa, excepto por erro, en cuxo caso, probabelmente ignorará o resultado de todos os xeitos.

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

A bandeira de notas envía caracteres que coinciden co seguinte patrón ao proceso de saída mentres se leen os caracteres.

Isto é útil cando desexa que un programa repare o patrón. Por exemplo, pódese usar o seguinte para controlar onde está marcando unha persoa (un modem de estilo Hayes). Cada vez que se ve o "atd", o script rexistra o resto da liña.

proc lognumber {} {interact -nobuffer -re "(. *) \ r" return pon $ log "[formato de reloxo [reloxo segundo]]: marcado $ interact_out (1, cadea)"} interactuar -nobuffer "atd" lognumber

Durante a interacción , ignórase o uso previo de log_user . En particular, a interacción forzará a súa saída a ser rexistrada (enviada á saída estándar) xa que se presume que o usuario non quere interactuar a cegas.

A bandeira -o fai que se poidan aplicar os seguintes pares de chaves para a saída do proceso actual. Isto pode ser útil, por exemplo, cando se trata de hosts que envían caracteres non desexados durante unha sesión telnet.

De forma predeterminada, interactuar espera que o usuario escriba stdin e lese stdout do proceso de Expect . A bandeira -u (para "usuario") fai que o usuario busque interactuar como o proceso nomeado polo seu argumento (que debe ser unha identificación xerada).

Isto permite unir dous procesos non relacionados sen usar un ciclo explícito. Para axudar na depuración, espera que os diagnósticos sempre sexan stderr (ou stdout para certos datos de rexistro e depuración). Pola mesma razón, o comando de intérprete lerá interactivamente desde stdin.

Por exemplo, o seguinte fragmento crea un proceso de inicio de sesión. Logo di o usuario (non se amosa) e, finalmente, conéctase os dous xuntos. Por suposto, calquera proceso pode ser substituído por iniciar sesión. Un shell, por exemplo, permitiría ao usuario traballar sen proporcionar unha conta e contrasinal.

engadir inicio de sesión de inicio de sesión $ spawn_id spawn tip módem # marcar de volta ao usuario # conectar usuario para iniciar sesión interactuar -u $ login

Para enviar saída a varios procesos, enumera cada lista de identificación de reprodución precedida por unha marca de entrada. A entrada para un grupo de identificación de spawn de saída pode ser determinada por unha lista de identificación de spawn precedida por unha marca de entrada. (Ambas entradas e saídas poden tomar listas na mesma forma que a marca -i no comando expect , excepto que calquera_spawn_id non ten sentido para interactuar .) Todas as seguintes bandeiras e cadeas (ou patróns) aplícanse a esta entrada ata outra - aparece o indicador de entrada. Se non aparece ningunha entrada , -output implica "-input $ user_spawn_id -output". (De forma similar, con patróns que non teñen entrada ). Se se especifica unha entrada, anula $ user_spawn_id. Se se especifica unha segunda entrada , anula $ spawn_id. Pode especificarse bandeiras de entrada adicionais.

Os dous procesos de entrada implicados por defecto teñen as súas saídas especificadas como $ spawn_id e $ user_spawn_id (en reversa). Se aparece unha bandeira de entrada sen bandeira de saída , descartáronse caracteres deste proceso .

A bandeira -i introduce un reemplazo para o spawn_id actual cando non se utilizan outros indicadores de entrada ou de saída . A bandeira A implica unha bandeira -o.

É posible cambiar os procesos que están a ser interactuados empregando ids de spawn indirectos. (Os ids de spawn indirectos descríbense na sección do comando expect.) Os ids indirectos de spawn pódense especificar cos indicadores -i, -u, -input ou -output.

intérprete [args]
fai que o usuario poida ser interactivamente solicitado polos comandos Expect e Tcl. O resultado de cada comando está impreso.

As accións como romper e continuar causan estruturas de control (isto é, para , proc ) comportarse do xeito habitual. Non obstante o retorno provoca que o intérprete volva ao seu interlocutor, mentres que o inter_return fai que o intérprete cause un retorno no seu chamador. Por exemplo, se "proc foo" chamado intérprete que executou a acción inter_return , proc foo regresaría. Calquera outro comando fai que o intérprete siga solicitando novos comandos.

Por defecto, o indicador contén dous enteiros. O primeiro enteiro describe a profundidade da pila de avaliación (é dicir, cantas veces chamouse Tcl_Eval). O segundo enteiro é o identificador de historial Tcl. O indicador pódese configurar definindo un procedemento chamado "prompt1" cuxo valor de retorno convértese no próximo indicador. Se unha declaración ten comiñas abertas, paréntesis, parénteses ou parénteses, un indicador secundario (por defecto "+>") emítese en liña nova. O indicador secundario pode definirse ao definir un procedemento chamado "prompt2".

Durante o intérprete utilízase o modo cocido, mesmo se o seu chamador estaba usando o modo en bruto.

Se stdin está pechado, o intérprete regresará a non ser que se use a -de pabellón, caso en que se invoca o seguinte argumento.

rexistro_filo [args] [[-a] ficheiro]
Se se fornece un nome de ficheiro, log_file rexistrará unha transcrición da sesión (comezando nese punto) no ficheiro. log_file deixará de gravar se non se fornece ningún argumento. Calquera ficheiro de rexistro anterior está pechado.

No canto dun nome de ficheiro, pode fornecer un identificador de ficheiro Tcl empregando as etiquetas -open ou -leaveopen . Isto é similar ao comando spawn . (Vexa spawn para máis información.)

A bandeira-a forza a saída que se rexistrou que foi suprimida polo comando log_user .

De xeito predeterminado, o comando log_file engádese a ficheiros antigos en vez de truncarlos, por conveniencia de poder desactivar e desactivar varias veces nunha sesión. Para truncar ficheiros, use a bandeira -noappend .

A marca -info fai que log_file devolva unha descrición dos argumentos non informativos máis recentes.

log_user-info | 0 | 1
Por defecto, o diálogo de envío / espera está conectado a stdout (e un ficheiro de rexistro se está aberto). O rexistro para a estrutura está desactivado polo comando "log_user 0" e volve ser activado por "log_user 1". O rexistro no ficheiro de rexistro non se modifica.

A marca -info fai que log_user devolva unha descrición dos argumentos non informativos máis recentes.

match_max [-d] [-i spawn_id] [size]
define o tamaño do buffer (en bytes) usado internamente por espera . Sen argumento de tamaño , devólvese o tamaño actual.

Coa marca -d , o tamaño predeterminado está axustado. (O valor predeterminado inicial é 2000.) Coa bandeira -i , o tamaño está definido para o ID de spawn nomeado, se non, está configurado para o proceso actual.

overlay [- # spawn_id] [- # spawn_id] [...] programa [args]
executa " args do programa " no lugar do programa Expect actual, que remata. Un argumento de guión desnudo forza un guión fronte ao nome do comando coma se fose un intérprete de inicio de sesión. Todos os spawn_ids están pechados excepto os que se denominan argumentos. Estes son mapeados nos identificadores de ficheiros nomeados.

Os spawn_ids están mapeados para identificar os arquivos do novo programa para herdar. Por exemplo, a seguinte liña executa o ajedrez e permítelle controlar o proceso actual, por exemplo, un mestre de xadrez.

overlay -0 $ spawn_id -1 $ spawn_id -2 $ spawn_id xadrez

Isto é máis eficiente que "interactuar -u", pero sacrifica a capacidade de facer a interacción programada xa que o proceso de Expect deixa de estar controlado.

Teña en conta que non se proporciona terminal de control. Deste xeito, se desconecta ou remapea a entrada estándar, os programas que controlan o traballo (conchas, login, etc.) non funcionarán correctamente.

paridade [-d] [-i spawn_id] [valor]
define se a paridade debe ser retida ou eliminada da saída dos procesos xerados. Se o valor é cero, a paridade é desposuída, se non, non está desposuída. Sen argumento de valor , devólvese o valor actual.

Coa marca -d , establécese o valor de paridade predeterminado. (O valor por defecto inicial é 1, é dicir, a paridade non está desposuída). Coa marca -i , o valor de paridade está definido para o id. Xerado de spawn, se non, está configurado para o proceso actual.

remove_nulls [-d] [-i spawn_id] [value]
define se os nulos son retidos ou eliminados da saída dos procesos xerados antes da combinación de patróns ou almacenamento na variable expect_out ou interact_out . Se o valor é 1, elimínanse os nulos. Se o valor é 0, os nulos non se eliminan. Sen argumento de valor , devólvese o valor actual.

Coa marca -d , establécese o valor predeterminado. (O valor predeterminado inicial é 1, é dicir, elimínanse os nulos.) Coa bandeira -i , o valor establécese para o id. De spawn nomeado, se non, está configurado para o proceso actual.

Se se eliminan ou non os nulos, espérase que grava os bytes nulos no rexistro e na estrutura.

envía cadea [-flags]
Envía cadea ao proceso actual. Por exemplo, o comando

envía "hello world \ r"

envía os personaxes, helloworld ao proceso actual. (Tcl inclúe un comando con printf ( formato chamado) que pode crear cadeas arbitrariamente complexas).

Os caracteres envíanse de inmediato, aínda que os programas con entrada de buffer de liña non len os caracteres ata que se envíe un carácter de retorno. Un carácter de retorno denotado "\ r".

A bandeira obriga o seguinte argumento a ser interpretado como unha cadea en vez de unha bandeira. Calquera cadea pode ser precedida por "-" se se parece ou non a unha bandeira. Isto proporciona un mecanismo fiable para especificar secuencias variables sen ser desencadeadas por aqueles que aparentemente parecen bandeiras. (Todas as cadeas que comezan por "-" están reservadas para futuras opcións.)

A bandeira -i declara que a cadea enviarase a spawn_id. Se o spawn_id é user_spawn_id e o terminal está en modo sen procesar, as liñas novas da cadea tradúcense ás secuencias return-newline para que aparezan coma se o terminal estivese en modo cocido. A marca -raw desactiva esta tradución.

A bandeira completa envía caracteres nulos (0 bytes). Por defecto, envíase un nulo. Un número enteiro pode seguir o -null para indicar cantos nulos para enviar.

A marca -break xera un estado de rotura. Isto só ten sentido se o spawn id se refire a un dispositivo tty aberto mediante "spawn -open". Se xerou un proceso como a punta, debería usar a convención de punta para xerar un descanso.

A bandeira -s forza a saída para ser enviada "lentamente", evitando así a situación común onde unha computadora desactiva un buffer de entrada que foi deseñado para un ser humano que nunca superaría o mesmo búfer . Esta saída está controlada polo valor da variable "send_slow" que leva unha lista de dous elementos. O primeiro elemento é un número enteiro que describe o número de bytes para enviar atómicamente. O segundo elemento é un número real que describe o número de segundos polo que se debe separar o envío atómico. Por exemplo, "set send_slow (10 .001)" forzaría "enviar -s" a enviar cadeas con 1 milisegundo entre cada 10 caracteres enviados.

A bandeira- h forza a saída para ser enviada (un pouco) como un ser humano realmente escribindo. Preséntanse retrasos similares aos humanos entre os personaxes. (O algoritmo baséase nunha distribución de Weibull, con modificacións adecuadas para esta aplicación particular.) Esta saída está controlada polo valor da variable "send_man" que leva unha lista de cinco elementos. Os dous primeiros elementos son o tempo interarrival medio de caracteres en segundos. O primeiro úsase por defecto. O segundo úsase nas terminacións de palabras, para simular as pausas sutís que ocasionalmente ocorren en tales transicións. O terceiro parámetro é unha medida de variabilidade onde .1 é bastante variable, 1 é razoablemente variable e 10 é bastante invariable. Os extremos son 0 ao infinito. Os dous últimos parámetros son, respectivamente, un tempo interarrival mínimo e máximo. O mínimo e máximo son usados ​​por última vez e "clip" a última hora. A media máxima pode ser bastante diferente da media dada, se o mínimo e máximo son suficientes.

Como exemplo, o seguinte comando emula un mecanógrafo rápido e consistente:

configure send_human {.1 .3 1 .05 2} envíe -h "estou con fame. Imos xantar".

mentres que o seguinte podería ser máis axeitado logo dunha resaca:

configure send_human {.4 .4 .2 .5 100} enviar-h "Goodd party noite das pestanas".

Teña en conta que os erros non se simulan, aínda que pode configurar situacións de corrección de erros por incrustación de erros e correccións nun argumento de envío.

As bandeiras para o envío de caracteres nulos, para o envío de pausas, para forzar a saída lenta e para a produción de estilo humano son mutuamente exclusivos. Só se empregará a última especificada. Ademais, non se pode especificar ningún argumento de cadea coas bandeiras para enviar caracteres nulos ou pausas.

É unha boa idea preceder o primeiro envío a un proceso por un esperado . Espero que espera que o proceso se inicie, mentres que non se pode enviar . En particular, se o primeiro envío complétase antes de que o proceso se inicie, corre o risco de ignorar os datos. En situacións nas que os programas interactivos non ofrecen un aviso inicial, pode preceder a enviar por un atraso como en:

# Para evitar dar consellos de hackers sobre como romper, # este sistema non solicita un contrasinal externo. # Espere por 5 segundos para executar para completar spawn telnet moi.secure.gov durmir 5 enviar contrasinal \ r

exp_send é un alias para enviar. Se está a usar Expectk ou algunha outra variante de Expect no ambiente Tk, o envío é definido por Tk para un propósito completamente distinto. exp_send proporciona compatibilidade entre ambientes. Os alias similares están dispoñibles para outros comandos de envío de outros.

send_error [-flags] cadea
é como enviar , agás que a saída é enviada a stderr e non ao proceso actual.

enviar_log [-] cadea
é como enviar , agás que a cadea só se envíe ao ficheiro de rexistro (ver log_file ). Os argumentos ignóranse se non hai ningún ficheiro de rexistro aberto.

enviar_tty [-flags] cadea
é como enviar , agás que a saída envíase a / dev / tty en vez do proceso actual.

send_user [-flags] cadea
é como enviar , agás que a saída envíase a stdout no canto do proceso actual.

durmir segundos
fai que o guión se durmi por un número dado de segundos. Os segundos poden ser un número decimal. As interrupcións (e os eventos de Tk se está a usar Expectk) procesaranse mentres espera dormir.

spawn [args] programa [args]
crea un novo proceso que executa " args do programa ". O seu stdin, stdout e stderr están conectados a Expect, para que poidan ser lidos e escritos por outros comandos Expect . A conexión está rota por certo ou se o propio proceso pecha calquera dos identificadores de ficheiro.

Cando se inicia un proceso por desova , a variable spawn_id establécese nun descriptor que se refire a ese proceso . O proceso descrito por spawn_id considérase o " proceso actual ". spawn_id pode ser lido ou escrito, en efecto proporcionando control de traballo.

user_spawn_id é unha variable global que contén un descriptor que fai referencia ao usuario. Por exemplo, cando spawn_id está axustado a este valor, espera que se comporta como expect_user .

.I error_spawn_id é unha variable global que contén un descriptor que se refire ao erro estándar. Por exemplo, cando spawn_id está axustado a este valor, o envío compórtase como send_error .

tty_spawn_id é unha variable global que contén un descriptor que se refire a / dev / tty. Se / dev / tty non existe (como nun cron, nun script ou lotes), entón tty_spawn_id non está definido. Isto pode ser probado como:

se {[info vars tty_spawn_id]} {# / dev / tty existe} máis {# / dev / tty non existe # probablemente en cron, batch ou script}

spawn devolve a ID de proceso de UNIX. Se non se inicia ningún proceso , devólvese 0. A variable spawn_out (esclavo, nome) está configurada no nome do dispositivo escravo pty.

Por defecto, spawn fai eco do nome e os argumentos do comando. A marca -noecho deixa de reproducirse .

A bandeira consola fai que a saída da consola sexa redirixida ao proceso xerado. Isto non é compatible con todos os sistemas.

Internamente, spawn usa un pty, inicializado do mesmo xeito que o usuario. Isto engádese aínda máis para que todas as opcións sexan "correctas" (segundo Stty (1)). Se a variable stty_init está definida, interprétase no estilo dos argumentos stty como configuración posterior. Por exemplo, "set stty_init raw" fará que os terminais de procesos máis engendrados empezan no modo en bruto. -Nottycopy omite a inicialización en función do tty do usuario. -nottyinit salta a inicialización "sana".

Normalmente, o spawn leva pouco tempo para executar. Se notas que o spawn tarda un tempo significativo, é probable que estea atopando ptys que están encaixados. Existen varias probas en pty para evitar enredos con procesos errantes. (Isto leva 10 segundos por pty cuncha). Executar Expect coa opción -d mostrará se Expect está atopando moitas pty en estados impares. Se non pode matar os procesos aos que están unidos estes pty, o único recurso pode ser reiniciar.

Se o programa non se pode xerar correctamente porque executar (2) falla (por exemplo, cando o programa non existe), o seguinte comando interactuar ou esperar verá unha mensaxe de erro coma se executara o programa e produciu a mensaxe de erro como saída. Este comportamento é unha consecuencia natural da implementación de spawn . Internamente, despexa garfos, despois de que o proceso xerado non ten forma de comunicarse co proceso orixinal de Expect , excepto pola comunicación a través do spawn_id.

A bandeira aberta fai que o seguinte argumento sexa interpretado como un identificador de ficheiro Tcl (isto é, volto por aberto ). O id. Spawn pode entón ser usado como se fose un proceso xerado. (O identificador de ficheiro non debería ser usado.) Isto permítelle tratar dispositivos, ficheiros e canalizacións sen procesar como procesos xerados sen usar un pty. 0 volve para indicar que non hai ningún proceso asociado. Cando se pecha a conexión co proceso xerado, así é o identificador de ficheiro Tcl. A bandeira -leaveopen é semellante a -open excepto que -leaveopen fai que o identificador de ficheiro sexa aberto mesmo despois de que a id do spawn estea pechada.

A bandeira baleira fai que se abra un pty sen que se produza ningún proceso . 0 volve para indicar que non hai ningún proceso asociado. Spawn_id configúrase como de costume.

A variábel spawn_out (escravo, fd) está configurada nun identificador de ficheiro correspondente ao escravo pty. Pódese pechar con "close -slave".

A marca -ignores coñece un sinal que debe ignorarse no proceso xerado. En caso contrario, os sinais obteñen o comportamento predeterminado. Os sinais son nomeados como no comando trap , excepto que cada sinal require unha bandeira separada.

nivel strace
fai que as declaracións seguintes sexan impresas antes de ser executado. (A traza de Tcl recolle trazas variables.) O nivel indica o que queda na pila de chamadas para rastrexar. Por exemplo, execútase o seguinte comando mentres se rastrean os primeiros 4 niveis de chamadas, pero ningún por debaixo.

espere -c "strace 4" script.exp

A marca -info causa a estrea para devolver unha descrición dos argumentos non informativos máis recentes.

Argos estancos
cambia os modos de terminal de forma similar ao comando stty externo.

Por defecto, accédese ao terminal de control. Pódese acceder a outros terminais engadindo "Solicitudes de estado devolve-lo como resultado do comando. Se non se solicita ningún estado e se accede ao terminal de control, o estado anterior dos atributos de echo e de volta regresarase nun formulario que pode ser posteriormente usado polo comando.

Por exemplo, os argumentos en bruto ou -cooked pon o terminal en modo bruto. Os argumentos -transmitidos ou cocidos pór o terminal en modo cocido. Os argumentos echo e -cho colocarán o terminal no modo eco e noecho respectivamente.

O seguinte exemplo ilustra como desactivar temporalmente o eco. Isto podería usarse en scripts automáticamente para evitar incrustación de contrasinais neles. (Vexa máis discusión sobre isto en EXPECT HINTS a continuación.)

stty -echo send_user "Contrasinal:" expect_user -re "(. *) \ n" configure o contrasinal $ expect_out (1, string) stty echo

sistema args
args a sh (1) como entrada, do mesmo xeito que se fose tipificado como un comando desde un terminal. Espere esperar ata que finalice o shell. O estado de retorno de sh xestiona o mesmo xeito que o executor xestiona o seu estado de retorno.

En contraste co executivo que redirecciona stdin e stdout ao script, o sistema non realiza redireccións (ademais do indicado pola propia cadea). Deste xeito, é posible usar programas que deben falar directamente con / dev / tty. Polo mesmo motivo, os resultados do sistema non se rexistran no rexistro.

timestamp [args]
devolve unha marca de tempo. Sen argumentos, devolve o número de segundos desde a época.

A bandeira de formato introduce unha cadea que se devolve pero con substitucións feitas de acordo coas regras de POSIX durante a hora límite . Por exemplo% a é substituído por un nome de semana abreviado (isto é, Sat). Outros son:

% un nome de día de semana abreviado% Un nome de xornada completa% b nome de mes abreviado% B nome de mes completo% c data-hora como en: Mér Oct 6 11:45:56 1993% d día do mes (01-31% H hora (00-23)% I hora (01-12)% j día (001-366)% m mes (01-12)% M minuto (00-59)% p am ou pm% S segundo (00-61) % u dia (1-7, o luns é o primeiro día da semana)% U semana (00-53, o primeiro domingo é o primeiro día da semana un)% V semana (01-53, estilo ISO 8601)% w día (0- 6)% W semana (00-53, o primeiro luns é o primeiro día da semana un)% x data como: Wed Outubro 6 1993% X tempo como en: 23:59:59% ano e (00-99) % Y ano como en: 1993% Z timezone (ou nada se non determinable) %% un sinal de porcentaxe descoñecido

As outras especificacións% non están definidas. Outros caracteres pasaranse sen tocar. Só se admite a configuración local de C.

A bandeira de segundos introduce un número de segundos desde a época en que se utilizará como fonte desde a que se formatear. Se non, empregarase a hora actual.

A bandeira- GMT forza a saída de marca de hora para usar a zona horaria de GMT . Sen sinalización, úsase a zona horaria local.

trampa [[comando] sinais]
fai que se execute o comando dado despois da recepción de calquera dos sinais indicados. O comando execútase no ámbito global. Se o comando está ausente, devólvese a acción do sinal. Se o comando é a cadea SIG_IGN, ignóranse os sinais. Se o comando é a cadea SIG_DFL, os sinais son resultado do sistema predeterminado do sistema. Os sinais son un só sinal ou unha lista de sinais. As sinais pódense especificar de forma numérica ou simbólica segundo o sinal (3). Pódese omitir o prefixo "SIG".

Sen argumentos (ou o número de argumento), a trampa devolve o número de sinal do comando de trampa que se está executando actualmente.

A bandeira de código usa o código de retorno do comando no canto do código que Tcl estivese a piques de regresar cando o comando se iniciase originalmente.

A marca -interp fai que o comando sexa avaliado usando o intérprete activo no momento no que o comando comezou a executarse en vez de cando se declarou a trampa.

A bandeira de nome fai que o comando trampa devolva o nome de sinal do comando trampa que se está executando actualmente.

A marca -max fai que o comando trampa devolva o maior número de sinal que se pode configurar.

Por exemplo, o comando "trap {send_user" Ouch! "} SIGINT" imprimirá "Ouch!" cada vez que o usuario preme ^ C.

De forma predeterminada, SIGINT (que normalmente se pode xerar premendo ^ C) e SIGTERM causan que Espere saia. Isto é debido á seguinte trampa, creada por defecto cando comeza o esperado.

saída de trampa {SIGINT SIGTERM}

Se usa a bandeira -D para iniciar o depurador, SIGINT é redefinida para iniciar o depurador interactivo. Isto é debido á seguinte trampa:

trampa {exp_debug 1} SIGINT

A trampa do depurador pódese cambiar establecendo a variable de entorno EXPECT_DEBUG_INIT nun novo comando trap.

Pode, por suposto, anular os dous só engadindo comandos de trampa no seu script. En particular, se ten a súa propia "saída de trampa SIGINT", isto anulará a trampa do depurador. Isto é útil se quere impedir que os usuarios se acostuman ao depurador.

Se quere definir a súa propia trampa en SIGINT pero aínda atrapar ao depurador cando se está a executar, use:

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

Alternativamente, pode atrapar ao depurador usando algún outro sinal.

A trampa non permitirá que anule a acción para SIGALRM xa que se usa internamente para esperar . O comando de desconexión establece SIGALRM en SIG_IGN (ignore). Podes reiniciar isto sempre que o desactive durante os seguintes comandos de reprodución.

Vexa o sinal (3) para máis información.

agarde [args]
demora ata que finalice un proceso xerado (ou o proceso actual se non se nomeou ningún).

espere normalmente devolve unha lista de catro enteiros. O primeiro enteiro é o pid do proceso que se esperaba. O segundo número enteiro é o identificador de spawn correspondente. O terceiro enteiro é -1 se se produciu un erro no sistema operativo, ou 0 se non. Se o terceiro enteiro era 0, o cuarto enteiro é o estado devolto polo proceso xerado. Se o terceiro enteiro era -1, o cuarto enteiro é o valor do errno establecido polo sistema operativo. A variable global errorCode tamén está configurada.

É posible que aparecen elementos adicionais ao final do valor de retorno desde a espera . Un quinto elemento opcional identifica unha clase de información. Actualmente, o único valor posíbel para este elemento é CHILDKILLED, en cuxo caso os dous valores seguintes son o nome de sinal de estilo C e unha breve descrición textual.

A bandeira -i declara o proceso a esperar correspondente ao spawn_id chamado (NON a ID do proceso ). Dentro dun controlador SIGCHLD, é posible esperar por calquera proceso xerado empregando o spawn id -1.

A marca -nowait fai que a espera regrese de inmediato coa indicación dunha espera exitosa. Cando o proceso saia (máis tarde), desaparecerá automaticamente sen necesidade dunha espera explícita.

O comando wait pode tamén usarse agardar por un proceso forked usando os argumentos "-i -1". A diferenza do seu uso con procesos xerados, este comando pode ser executado en calquera momento. Non hai control sobre o que se colle o proceso . Non obstante, pódese comprobar o valor de retorno para a ID do proceso .

BIBLIOTECAS

Espere automaticamente coñecer dúas bibliotecas integradas para os scripts de Expect. Estes están definidos polos directorios nomeados nas variables exp_library e exp_exec_library. Ambos están destinados a conter ficheiros de utilidade que poden ser utilizados por outros scripts.

exp_library contén ficheiros independentes de arquitectura. exp_exec_library contén ficheiros dependentes da arquitectura. Dependendo do seu sistema, ambos os cartafoles poden estar totalmente baleiros. A existencia do ficheiro $ exp_exec_library / cat-buffers describe os buffers de / bin / cat por defecto.

PRETTY-PRINTING

Unha definición de vgrind está dispoñible para unha boa impresión de guións Expect . Supoñendo que a definición vgrind subministrada coa distribución Expect está correctamente instalada, pode usala como:

vgrind-arquivo de visualización

EXEMPLOS

Moitos non son aparentes como poñer todo en conxunto que describe a páxina do home . Recoméndolles ler e probar os exemplos no directorio de exemplo da distribución de Expect . Algúns deles son programas reais. Outros son simplemente ilustrativos de certas técnicas e, por suposto, unha parella son só hacks rápidos. O ficheiro INSTALL ten unha visión xeral destes programas.

Os papeis de Expect (ver VER TAMÉN) tamén son útiles. Mentres algúns papeis usan sintaxe correspondente a versións anteriores de Expect, as razóns que se acompañan aínda son válidas e inclúen moito máis detalles que a páxina deste home.

CAVEATS

As extensións poden chocar cos nomes de comandos de Expect. Por exemplo, o envío é definido por Tk para un propósito completamente distinto. Por este motivo, a maioría dos comandos Expect tamén están dispoñibles como "exp_XXXX". Os comandos e as variables que comezan por "exp", "inter", "spawn" e "timeout" non teñen alias. Use os nomes de comando estendidos se precisa esta compatibilidade entre ambientes.

Esperar toma unha visión bastante liberal do alcance. En particular, as variables leas por comandos específicos para o programa Expect buscaranse primeiro do ámbito local e, se non se atopan, no ámbito global. Por exemplo, isto evita a necesidade de colocar "tempo de espera global" en todos os procedementos que escribe que usa esperar . Por outra banda, as variables escritas están sempre no ámbito local (a menos que se emitiu un comando "global"). O problema máis común que isto causa é cando o spawn se executa nun procedemento. Fóra do procedemento, spawn_id xa non existe, polo que o proceso xerado xa non se pode acceder simplemente polo alcance. Engade un "spawn_id global" a tal procedemento.

Se non pode habilitar a capacidade de multiespañar (é dicir, o sistema non admite ningunha selección (BSD *. *), Enquisa (SVR> 2), nin equivalente), Espero só poderá controlar un único proceso á vez. Neste caso, non intente definir spawn_id , nin executar procesos a través de exec mentres se está a executar un proceso xerado. Ademais, non poderá esperar de varios procesos (incluído o usuario como un) ao mesmo tempo.

Os parámetros do terminal poden ter un gran efecto nos scripts. Por exemplo, se un script está escrito para buscar un eco, será mal comprobado se o eco está apagado. Por este motivo, Expect forzas de parámetros sane de forma predeterminada. Desafortunadamente, isto pode facer as cousas desagradables para outros programas. Por exemplo, o shell de emacs quere cambiar as asignacións "habituais": as liñas novas colócanse en liñas novas no canto de novas liñas de envío e de retorno e está desactivado. Isto permite usar emacs para editar a liña de entrada. Desafortunadamente, esperamos que non podo imaxinar isto.

Pode solicitar que espera non anular a configuración predeterminada dos parámetros do terminal, pero entón ten que ter moito coidado ao escribir scripts para tales contornas. No caso dos emacs, evite depender de cousas como facer eco e mapas de fin de liña.

Os comandos que aceptaron argumentos inclúen unha única lista (as variantes de espera e interactúan ) usan unha heurística para decidir se a lista é realmente un argumento ou moitos. A heurística pode fallar só no caso cando a lista realmente representa un argumento único que ten varios \ ns integrados con caracteres non-branco entre eles. Isto parece bastante improbable, pero o argumento "-nobrace" pode usarse para forzar un único argumento que se manexa como un único argumento. Isto podería usarse con código Expect xerado pola máquina. Do mesmo xeito, -brace forzas un único argumento para ser xestionado como múltiples patróns / accións.

BUGS

Foi realmente tentador nomear o programa "sexo" (xa sexa por "Smart EXec" ou "Send-EXpect"), pero prevaleceu o bo sentido (ou talvez o puritanismo).

Nalgúns sistemas, cando se xera un intérprete de comandos, quéixase de non poder acceder ao tty pero funciona de todos os xeitos. Isto significa que o seu sistema ten un mecanismo para gañar a tty de control que espera non sabe. Descubra o que é e envíame esta información.

Ultrix 4.1 (polo menos as versións máis recentes por aquí) considera que os tempos de espera superiores a 1.000.000 son equivalentes a 0.

O UNIX 4.0A dixital (e probablemente outras versións) rexeita asignar ptys se define un controlador SIGCHLD. Vexa a páxina da axuda para máis información.

IRIX 6.0 non xestiona correctamente os permisos de pty de xeito que se Expect intenta asignar un pty anteriormente usado por outra persoa, falla. Actualiza a IRIX 6.1.

Telnet (verificado só baixo SunOS 4.1.2) paira se TERM non está configurado. Este é un problema baixo cron, at e in cgi scripts, que non definen TERM. Deste xeito, debes configuralo explícitamente - a que tipo adoita ser irrelevante. Só ten que ser definido para algo. O seguinte probabelmente é suficiente para a maioría dos casos.

set env (TERM) vt100

Consello (verificado só baixo BSDI BSD / OS 3.1 i386) paira se SHELL e HOME non están configurados. Este é un problema baixo cron , at e in cgi scripts, que non definen estas variables de entorno. Deste xeito, debes configuralos explícitamente - a que tipo adoita ser irrelevante. Só ten que ser definido para algo. O seguinte probabelmente é suficiente para a maioría dos casos.

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

Algunhas implementacións de pty están deseñadas para que o kernel elimine calquera saída non lida despois de 10 a 15 segundos (o número real depende da implementación) despois de que o proceso pechou o descriptor de ficheiro. Así espere programas como

Data de xeración de sono 20 espera

fallará. Para evitar isto, invoca programas non interactivos con exec en lugar de xerar . Mentres tales situacións son concebibles, na práctica nunca atopei unha situación na que a produción final dun programa realmente interactivo perderíase debido a este comportamento.

Por outra banda, as pty de Cray UNICOS eliminan calquera saída non lida inmediatamente despois de que o proceso pechou o descriptor do ficheiro. Informei a Cray e están traballando nunha solución.

Ás veces é necesario un atraso entre un aviso e unha resposta, como cando unha interface tty está cambiando a configuración de UART ou as taxas de bautismo coincidindo buscando os pares de inicio / parar. Normalmente, todo isto é necesario é durmir por un segundo ou dous. Unha técnica máis robusta é reintentar ata que o hardware estea listo para recibir entrada. O seguinte exemplo usa dúas estratexias:

enviar "velocidade 9600 \ r"; durmir espera 1 {tempo de espera {enviar "\ r"; exp_continue} $ prompt}

O código de trampa non funcionará con ningún comando que se atope no ciclo de eventos de Tcl, como o soño. O problema é que no ciclo do evento, Tcl descarta os códigos de retorno dos controladores de eventos asíncronos. Unha solución é establecer unha bandeira no código de trampa. A continuación, marque a bandeira inmediatamente despois do comando (ou sexa, durmir).

O comando expect_background ignora os argumentos de tempo e non ten ningún concepto de tempo de espera en xeral.

& # 34; EXPECT HINTS & # 34;

Hai un par de cousas sobre Esperar que non sexan intuitivas. Esta sección intenta abordar algunhas destas cousas cun par de suxestións.

Un problema de esperanza común é como recoñecer avisos de shell. Xa que estas son personalizadas de xeito diferente por persoas e con diferentes cunchas distintas, a automatización automática de rlogin pode ser difícil sen saber a solicitude. Unha convención razoable é que os usuarios almacenen unha expresión regular que describe a súa solicitude (en particular, o final do mesmo) na variable de ambiente EXPECT_PROMPT. Pode usarse código como o seguinte. Se EXPECT_PROMPT non existe, o código aínda ten moitas posibilidades de funcionar correctamente.

set prompt "(% | # | \\ $) $"; # catch prompt predeterminado {set prompt $ env (EXPECT_PROMPT)} espera -re $ prompt

Anímovos a escribir patróns de esperanza que inclúen o final do que esperas ver. Isto evita a posibilidade de responder unha pregunta antes de ver todo. Ademais, aínda que poida que poidas responder preguntas antes de velas enteiramente, se contestas anticipadamente, a túa resposta pode aparecer ecotado de novo no medio da pregunta. Noutras palabras, o diálogo resultante será correcto pero verá revolto.

A maioría das mensaxes inclúen un carácter espacial ao final. Por exemplo, a solicitude de ftp é 'f', 't', 'p', '>' e. Para combinar este aviso, debes contar cada un destes caracteres. É un erro común non incluír o espazo en branco. Engade o espazo en branco de forma explícita.

Se usa un patrón do formulario X *, * * coincidirá con toda a saída recibida do final de X ao último recibido. Isto parece intuitivo pero pode ser algo confuso porque a frase "última cousa recibida" pode variar dependendo da velocidade da computadora e do procesamento de E / S tanto polo núcleo como polo controlador do dispositivo.

En particular, os humanos tenden a ver a saída do programa chegando en grandes anacos (atómicamente) cando na verdade a maioría dos programas producen unha liña de saída por vez. Supoñendo que este é o caso, o * no padrón do parágrafo anterior só pode coincidir co final da liña actual aínda que pareza existir máis, xa que no momento da partida era todo o resultado recibido.

Espero que non teña ningunha forma de saber que a saída aínda máis chegará a menos que o teu patrón concretamente o represente.

Incluso dependendo do buffer orientado a liña non é bo. Non só os programas raramente fan promesas sobre o tipo de buffering que fan, pero a indixestión do sistema pode romper as liñas de saída para que as liñas se rompen en lugares aparentemente aleatorios. Así, se pode expresar os últimos caracteres dun indicador ao escribir patróns, é aconsellable facelo.

Se estás esperando un patrón na última saída dun programa e o programa emite outra cousa, non poderás detectar isto coa palabra clave de tempo de espera . A razón é que esperamos que o tempo de espera non se repare, en vez diso obterá unha indicación eof . Use isto no seu lugar. Aínda mellor, use ambos. Desta forma, se esa liña sempre se mova, non terá que editar a liña en si.

As liñas novas adoitan converterse en retorno de carro, secuencias de títulos de liña cando saen polo controlador de terminal. Deste xeito, se desexa un patrón que coincida explícitamente coas dúas liñas, digamos printf ("foo \ nbar"), debería usar o patrón "foo \ r \ nbar".

Unha tradución semellante ocorre ao ler do usuario, a través de expect_user . Neste caso, cando prema a tecla return, será traducida a unha nova liña. Se esperar entón pasa a un programa que establece o seu terminal como modo en bruto (como o telnet), haberá un problema, xa que o programa espera un verdadeiro retorno. (Algúns programas realmente están perdonando porque automaticamente traducirán as liñas novas aos rendementos, pero a maioría non). Por desgraza, non hai forma de descubrir que un programa pon o terminal en modo sen formato.

En vez de substituír manualmente as liñas novas con retorno, a solución é usar o comando "stty raw", que deterá a tradución. Teña en conta, con todo, que isto significa que xa non terá as funcións de edición de liña cocidas.

interactúan implícitamente establece o seu terminal no modo en bruto así que este problema non xurdirá nese momento.

A miúdo é útil almacenar contrasinais (ou outra información privada) en Expect scripts. Non se recomenda isto porque calquera cousa almacenada nunha computadora é susceptible de ser visitada por calquera persoa. Deste xeito, o pedido interactivo dos contrasinais dun script é unha idea máis intelixente que incrusta-los literalmente. Non obstante, ás veces esa incrustación é a única posibilidade.

Desafortunadamente, o sistema de ficheiros UNIX non ten forma directa de crear scripts que sexan executábeis senón que non sexan lexibles. Os sistemas que soportan os scripts de shell de setgid poden simularse de forma indirecta como segue:

Crea o script de Expect (que contén os datos secretos) como de costume. Fai que os seus permisos sexan 750 (-rwxr-x ---) e pertenzan a un grupo de confianza, é dicir, un grupo que lles permita le-lo. Se é necesario, cree un novo grupo para este fin. A continuación, crea un script / bin / sh con permisos 2751 (-rwxr-s - x) de propiedade do mesmo grupo que antes.

O resultado é un script que pode ser executado (e lido) por calquera. Cando se invoca, execútase o script de Expect .

& # 34; VER TAMÉN & # 34;

Tcl (3), libexpect (3)
"Exploring expect: A Tcl-Based Toolkit para automatizar programas interactivos" por Don Libes, pp. 602, ISBN 1-56592-090-2, O'Reilly and Associates, 1995.
"Espero: Curing Those Uncontrollable Fits of Interactivity" por Don Libes, Actas da Conferencia USENIX do verán de 1990, Anaheim, California, do 11 ao 15 de xuño de 1990.
. "Usando esperar para automatizar as tarefas da administración do sistema" por Don Libes, Proceedings da Conferencia de Administración de Sistemas de Instalación Grande USENIX de 1990, Colorado Springs, Colorado, 17-19 de outubro de 1990.
.I "Tcl: Un idioma de comandos integrado" de John Ousterhout, Proceedings of the 1990 USENIX Winter Conference, Washington, DC, do 22 ao 26 de xaneiro de 1990. "Espero: Scripts para controlar programas interactivos" de Don Libes, Sistemas Informáticos , Vol. 4, n. ° 2, xornadas de prensa da Universidade de California, novembro de 1991. "Probas de regresión e programas de probas de conformidade", por Don Libes, Proceedings of the Summer 1992 USENIX Conference, pp. 135-144, San Antonio, TX, 12-15 de xuño de 1992. I "Kibitz - Conectando varios programas interactivos xuntos", por Don Libes, Software - Práctica e experiencia, John Wiley & Sons, West Sussex, Inglaterra, Vol.

23, n. ° 5, maio de 1993. I "A Debugger for Tcl Applications", de Don Libes, Actas do Taller Tcl / Tk de 1993, Berkeley, CA, do 10 ao 11 de xuño de 1993.

AUTOR

Don Libes, Instituto Nacional de Estándares e Tecnoloxía

AGRADECIMENTOS

Grazas a John Ousterhout para Tcl e Scott Paisley para a súa inspiración. Grazas a Rob Savoye para o código de autoconfiguración de Expect.

O ficheiro HISTORY documenta boa parte da evolución do esperado . Fai unha lectura interesante e pode darlle máis información sobre este software. Grazas ás persoas mencionadas na mesma que me enviou correccións de erros e deu outra axuda.

O deseño e implementación de Expect foi pagado en parte polo goberno de EE. UU. E, polo tanto, no dominio público. Non obstante, o autor e NIST queren crédito se se usan este programa e documentación ou partes destes.