Estoy escribiendo una Espera de secuencia de comandos y estoy teniendo problemas para lidiar con el intérprete de comandos (en Linux). Mi Esperar secuencia de comandos genera rlogin y el sistema remoto está utilizando ksh. El símbolo en el sistema remoto contiene el directorio actual, seguido por " > " (espacio mayor que el espacio). Un fragmento de secuencia de comandos puede ser:

send "some command here\r"
expect " > "

Esto funciona por comandos simples, pero las cosas empiezan a ir mal cuando el comando estoy enviando supera el ancho de la terminal (o más precisamente, lo que ksh piensa que es el ancho de la terminal). En ese caso, ksh hace un poco raro el desplazamiento horizontal de la interactiva de línea de comandos, que parece volver a escribir el símbolo del sistema del palo y un extra «> » en la salida. Naturalmente, esto hace que la Espera script para obtener confundido y fuera de sincronización cuando parece haber más de un mensaje en la salida después de la ejecución de un comando (mi script contiene varios send/expect pares).

He intentado cambiar PS1 en el sistema remoto para algo más distintivo como «símbolo del sistema>» pero un problema similar se plantea que me indica que no es la forma correcta de solucionar esto.

Lo que estoy pensando que podría ayudar es la capacidad para la secuencia de comandos para decirle a Esperar que «sé que estoy correctamente sincronizado con el sistema remoto en este punto, así vaciar el búfer de entrada ahora.» El expect declaración tiene el -notransfer de la bandera que no descartar el búfer de entrada, incluso si el patrón no coincide, por lo que creo que necesito el opuesto.

Existen otras técnicas útiles que puede utilizar para hacer que el shell remoto se comportan de manera más previsible? Entiendo que Esperar que pasa a través de un montón de trabajo para asegurarse de que el generado sesión aparece a ser interactivos para el sistema remoto, pero prefiero que algunos de los más molestos con funciones interactivas (como el desplazamiento horizontal de ksh) se apagará.

OriginalEl autor Greg Hewgill | 2009-12-09

3 Comentarios

  1. 7

    Si quieres tirar por la borda todo la salida de Esperar que se ha visto hasta ahora, intente

    expect -re $
    

    Este es un regexp partido en dólares que significa el final del búfer de entrada, por lo que se acaba de saltar todo lo recibido hasta el momento. Más detalles en el Esperar que el hombre de la página.

    Excelente, que parece ser justo lo que yo necesitaba.

    OriginalEl autor Colin Macleod

  2. 1

    Usted podría tratar de «set -o de varias líneas» o COLUMNAS=1000000 (o algún otro convenientemente gran valor).

    El ksh en este sistema no parece tener la multiline opción, pero he descubierto que si me set +o emacs (apagar el emacs de la edición en línea de la opción, que parece ser el predeterminado aquí), el desplazamiento horizontal también está deshabilitada.

    OriginalEl autor Andru Luvisi

  3. 0

    He tenido dificultad con ksh y Esperar que en el pasado. Mi solución fue usar algo distinto
    ksh para un shell de inicio de sesión.

    Si se puede cambiar el inicio de sesión remoto a otros que ksh (usando el comando chsh o la edición de /etc/passwd), entonces usted puede intentar esto con /bin/sh como la cáscara.

    Otra alternativa es decir KSH que el terminal es un terminal tonta – no permitir que realizar algún tratamiento especial.

    $ export TERM=""
    

    podría hacer el truco.

    Por desgracia, en esta situación un montón de otras cosas que dependen de la shell se ksh. Voy a tratar de anular la definición de TERM, que es una buena idea.

    OriginalEl autor Philip Schlump

Dejar respuesta

Please enter your comment!
Please enter your name here