¿Cómo manejar el retroceso mientras lee?

10

¿Cómo manejo los espacios de retroceso ingresados, muestra ^?si se intentó y cómo readcuenta los caracteres, ya que en 12^?35 caracteres estaban completos (aunque todos ellos no eran una entrada real), pero después de 12^?3^?que devolvió el mensaje, extraño. ¡Por favor ayuda!

-bash-3.2$ read -n 5
12^?3^?-bash-3.2$
Borato de Keyshov
fuente

Respuestas:

10

Cuando lee una línea completa con opciones simples read(u read -rotras opciones que no afectan este comportamiento), el editor de línea provisto por el núcleo reconoce la Backspaceclave para borrar un carácter, así como algunos otros comandos (incluso Returnpara finalizar la entrada línea y enviarlo). Las teclas de acceso directo se pueden configurar con la sttyutilidad. Se dice que el terminal está en modo cocinado cuando su editor de línea está activo. En modo sin formato, cada carácter escrito en el teclado se transmite a la aplicación de inmediato. En el modo cocinado, los caracteres se almacenan en un búfer y solo se transmiten líneas completas a la aplicación.

Para dejar de leer después de un número fijo de caracteres para implementar read -n, bash tiene que cambiar al modo sin formato. En modo sin procesar, el terminal no procesa la Backspacetecla (cuando presiona Backspace, el carácter anterior ya se ha enviado a bash), y bash tampoco procesa nada (presumiblemente porque esto le da una mayor flexibilidad de permitir que el script haga su propio procesamiento).

Puede pasar la opción -epara habilitar el editor de línea propio de bash (readline, que es un editor de línea adecuado, no como el extremadamente crudo del núcleo). Como bash está haciendo la edición de línea, puede dejar de leer una vez que tenga el número de caracteres solicitado.

Gilles 'SO- deja de ser malvado'
fuente
9

Uso read -e:

$ read -e -n 5
13acX

read -e significa que:

Readline (ver Edición de línea de comandos ) se utiliza para obtener la línea.

Cuando haga eso, puede editar la entrada de cualquiera de las formas en que lo haría al escribir en el indicador de comandos de shell normal, incluido el espacio de retroceso, Homeetc.

Michael Homer
fuente
1

reades un bash incorporado. (ver type read.) Puede encontrar documentación con man bash:

   read [-ers] [-a aname] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
   [...]
          -e     If the standard input is coming from a terminal, readline (see READLINE above) is used to obtain the line.
                 Readline uses the current (or default, if line editing was not previously active) editing settings.

o puedes usar help read:

read: read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]
      -e                use Readline to obtain the line in an interactive shell

El -econmutador habilita el soporte de línea de lectura que básicamente permite todas las funciones disponibles en el indicador de comandos de shell, incluido el manejo de retroceso.

Por read -en 5lo tanto, debe hacer lo que quiera.

michas
fuente
-e resuelve el problema, pero la forma en que se readlee el "número de caracteres ingresados" aún no tiene respuesta.
Keyshov Borate