Leer la cadena de respuesta del terminal en una variable

Leer la cadena de respuesta del terminal en una variable

Usandointento, ¿cómo puedo leer la respuesta del terminal en una variable sin interacción del usuario? Aún es necesario Enterpresionar una vez la siguiente frase :

echo -ne '\005' && read -s && echo ${REPLY}

Además, ¿cómo puedo configurar?xtermenviar algo significativo en respuesta a ^E? Hasta ahora, el único emulador de terminal que he visto enviando una respuesta esMasilla.

Respuesta1

La cadena de respuesta se puede configurar en xterm usando elanswerbackStringrecurso. Ese recurso fue agregado en1998. Inicialmente regresando "xterm", ya que1999por defecto es una cadena vacía porque algunos usuarios notaron el potencial de abuso de las secuencias de control que podrían enviar un comando inesperado a la computadora.

Otros terminales pueden devolver siempre una cadena vacía (konsole, mlterm, vte). Pero rxvt (y rxvt-unicode) devuelven una respuesta inesperada: el dispositivo atribuye una respuesta para VT102 (una secuencia de escape). PuTTY devuelve "PuTTY"(probablemente debido a la influencia temprana de xterm).

En una comprobación rápida, la consola de Linux muestra una "a" (probablemente un error).

Debido a que el VT100 original proporcionaba esto como una característica de instalación/configurable, eso se habría limitado aimprimiblecaracteres. Por ese motivo, la respuesta de rxvt/urxvt es inesperada. La página del manual hace un comentario oscuro sobre esto:

answerbackString:cadena
Especifique la respuesta que rxvt-unicode envía al shell cuando se pasa un carácter ENQ (control-E). Puede contener valores de escape como se describe en la entrada enkeysymsiguiente.

(falta la descripción prometida).

Debido a que se desconoce la longitud de la cadena de respuesta, una aplicación que la lea debe permitir la espera (en caso de que los caracteres lleguen en más de una operación de lectura). Por supuesto, existe la TMOUTcaracterística específica de ksh/bash que puede ayudar con el scripting de shell, junto con la -topción para el readcomando. Para uso general, evito eso, usando stty, por ejemplo, (verdynamic.sh):

stty raw -echo min 0 time 5

para configurar temporalmente el terminal para que readexpire en 0,5 segundos y permita que regrese sin leer ningún carácter. Para ver cómo se guardan/restauran las configuraciones, es útil leer el script.

Otras lecturas:

Respuesta2

Incluso con un tiempo de espera y (algo) de caracteres para leer, parece que bash( version 4.2.46(1)-release) no puede guardar el archivo REPLY, aquí emitiendo la secuencia de control "Informar posición del cursor", primero con una nueva línea ingresada y segundo esperando el tiempo de espera:

$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31 52                        .[24;1R
$ echo -ne '\033[6n' && read -n 16 -s -t 3; echo -n $REPLY | xxd
$ 

El problema aquí es que -nes mayor que el número de bytes devueltos; Si -n, por el contrario, es exactamente del tamaño correcto o más pequeño, la respuesta se leerá sin que sea necesaria ninguna entrada (o tiempo de espera). Si conoce un carácter único final de la cadena de respuesta, puede obtener una respuesta dividiendo "líneas" por ese carácter; para la posición del carácter del informe, solicite que se pueda considerar que el delimitador es R:

$ echo -ne '\033[6n' && read -n 999 -d R -s; echo -n $REPLY | xxd
0000000: 1b5b 3234 3b31                           .[24;1
$ 

Dada una entrada desconocida de longitud desconocida, tendría que presentar un error basho tal vez mordisquear los bytes uno por uno hasta que se active el tiempo de espera:

$ out="got "; echo -ne '\033[6n'; while read -n 1 -s -t 1; do out="$out$REPLY"; done
$ echo -n $out | xxd
0000000: 676f 7420 1b5b 3234 3b31 52              got .[24;1R
$ 

Por control+elo que supongoun terminal podría enviar algo de vuelta, pero habría que configurarlo para hacerlo:

ENQ       Return Terminal Status (Ctrl-E).  Default response is an empty
          string, but may be overridden by a resource answerbackString.

información relacionada