Retroceso no funciona dentro de ejecutar script bash

8

Estoy ejecutando un script muy simple que lee línea por línea e imprime la línea ingresada de nuevo a la terminal:

while read CMD; do
    echo $CMD
done

Funciona bien, pero cuando intento editar la línea con el backspacecarácter, se imprime en ^?lugar de eliminar el carácter. Y cuando presiono Ctrl+ backspacela salida es ^H. ¿Cómo podría solucionarse este comportamiento para backspaceeliminar el carácter en lugar de agregar estos caracteres? Intenté el stty erase '^?'comando pero no con éxito.

vrom911
fuente
Tenga en cuenta que 16.10 llegó al final de su ciclo de soporte el mes pasado. Debería actualizar a 17.04 lo antes posible.
Byte Commander
1
Sugiero reemplazar read CMDpor read -e CMD.
Cyrus
1
intente en terminatorlugar de gnome-terminal. Funciona como se esperaba
Severus Tux
1
@whtyger esto funcionó para este script. En mi situación real, tengo información del programa, que no llama lectura. No tengo oportunidad de cambiar el script del programa, este fue solo un ejemplo que representó mi problema. ¿Hay alguna configuración global donde pueda hacer esta configuración para todas las entradas?
vrom911
1
@Cyrus My Backspace funciona como quiero: elimina el último carácter siempre, incluso para este script de la pregunta sin -eopción. Pero en la máquina de @ vrom911 no es el caso. Me pregunto por qué sucede y dónde se puede configurar.
Shersh

Respuestas:

6

El problema es que hay muchas formas de representar un retroceso, pero el readcomando no las comprende todas. Debería poder configurar exactamente lo que se envía al presionar la ← Backspacetecla en la configuración del emulador de terminal.

Suponiendo que lo esté utilizando gnome-terminalcomo emulador, abra el menú Editar y haga clic en Preferencias de perfil . Cambie a la pestaña Compatibilidad y debería obtener estas opciones:

gnome-terminal → preferencias de perfil → compatibilidad

Ahora puede cambiar la tecla Retroceso que genera: configuración. Tiene estas cinco opciones a continuación disponibles para elegir. Agregué entre paréntesis cómo se comportan en mi sistema:

  • Automático (funciona)
  • Control-H (imprime en su ^Hlugar)
  • ASCII DEL (predeterminado, funciona)
  • Secuencia de escape (imprime en su ^[[3~lugar)
  • TTY Erase (funciona)
Byte Commander
fuente
Actualmente tengo ASCII DEL. He probado las 5 opciones, pero ninguna solucionó el problema.
vrom911
Eso es extraño. ¿Puedes decirme qué type readdice y qué $SHELL --versioninformes de shell / versión ?
Byte Commander
Sé que es extraño Traté de googlear mi problema mucho pero no encontré una solución que funcione para mí. type readdice read is a shell builtin. y $SHELL --versiondiceGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911
1

Tuve el mismo problema, usando bash en Gnome-Terminal.

Tenga en cuenta que en la línea de comando, el espacio de retroceso funciona como se esperaba, pero cuando mi programa (un simple cliente de chat basado en socket TCP) está leyendo desde stdin, el backspacecarácter imprime (hace eco en la pantalla) en ^?lugar de eliminar el último carácter.

Use # stty icanonpara permitir el "modo canónico (cocido)". Vea alguna explicación aquí /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Algunos antecedentes de mi problema / solución: tuve un problema en el que necesitaba pegar más de 4k caracteres. Y durante esa investigación, me llevaron al enlace anterior. Solía # stty -icanondeshabilitar el límite de 4k, pero perdí la capacidad de usar retroceso (borrar).

Roger
fuente