Next Previous Contents

5. Trucos

5.1 Ralentizacion en el envio de caracteres

el codigo que figura al principio de cada guion:


                          
                          ;# script wasn't run conservatively originally
set force_conservative 1  ;# set to 1 to force conservative mode even if
if {$force_conservative} {
        set send_slow {1 .001}
        proc send {ignore arg} {
                sleep .1
                exp_send -s -- $arg
        }
}

sirve para ralentizar el envio de las respuestas, simulando de esta manera nuestra cansina forma de teclear.

A partir de la version 5.20 se puede sustituir por la siguiente llamada:


set send_slow {1.1}

Existe tambien una nueva opcion para simular la cadencia humana al teclear:
set send_human {.2 .2 1 0.1 4}

5.2 Listados paginados

En algunos ocasiones los resultados de la ejecución de una consultan se presentan de forma paginada. Esto es el dispositivo interrogado presenta una numero de determinado de lineas y espera a que pulsamos una determinada tecla antes de presentar más información.

Para resolver esta situación en nuestros guiones podemos utilizar el siguiente codigo:


...
send -- "show test\r"
expect {
        "More" {send -- "\r";exp_continue}
        "onsole>" {}
        }
...

En el ejemplo vemos que cuando el listado se pare mostrando el mensaje 'More', expect enviara un retorno de carro y volvera a ejecutar el bucle de espera. Este ciclo se repetira hasta que, finalizado el listado, el dispositico presente de nuevo el indicador de sistema.

5.3 Comandos expect_after y expect_before

Es posible que un dispositivo cierre una conexion de forma inesperada, o un programa aborte por un fallo de programación. En estos casos nuestro guión recibiría un «eof», por lo que podríamos tratar esta situación insertando el siguiente codigo:


expect {
    "onsole>" { send -- "show\r"}
    eof {puts "Final inesperado de la conexion\n"; exit}  
}

Pero claro, hacer esto para cada secuencia expect seria una tarea tediosa, y ademas el codigo de nuestro guión seria poco claro.

la solución a este problema es usar las sentencia expect_after y expect_before. Como su nombre indica al inlcuirlas en un guión, se comprobara la presencia de la cadena indicada antes o despues de las indicadas en cada secuencia expect.


expect_after {
    eof {puts "Final inesperado de la conexion\n"; exit}  
}

send -- "show\r";
expect {
    "onsole>" { send -- "\r"}
}

En el ejemplo anterior, cada secuencia expect comprobara en primer lugar las cadenas que espera recibir y despues si se ha recibido un «eof».

También puede servir para tratar las respuestas a comandos mal tecleados:


expect_before {
    "Invalid command syntax {puts "Comando incorrecto\n"; exit}  
}

send -- "sohw -i\r";
expect {
    "onsole>" { send -- "\r"}
}

En este caso, sin expect_before, el guión quedaría bloqueado despues de ejecutar el comando, ya que no se espera la cadena "Invalid command syntax".


Next Previous Contents