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 backspace
carácter, se imprime en ^?
lugar de eliminar el carácter. Y cuando presiono Ctrl
+ backspace
la salida es ^H
. ¿Cómo podría solucionarse este comportamiento para backspace
eliminar el carácter en lugar de agregar estos caracteres? Intenté el stty erase '^?'
comando pero no con éxito.
command-line
bash
vrom911
fuente
fuente
read CMD
porread -e CMD
.terminator
lugar degnome-terminal
. Funciona como se esperaba-e
opción. Pero en la máquina de @ vrom911 no es el caso. Me pregunto por qué sucede y dónde se puede configurar.Respuestas:
El problema es que hay muchas formas de representar un retroceso, pero el
read
comando 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-terminal
como emulador, abra el menú Editar y haga clic en Preferencias de perfil . Cambie a la pestaña Compatibilidad y debería obtener estas opciones: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:
^H
lugar)^[[3~
lugar)fuente
type read
dice y qué$SHELL --version
informes de shell / versión ?type read
diceread is a shell builtin
. y$SHELL --version
diceGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
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
backspace
carácter imprime (hace eco en la pantalla) en^?
lugar de eliminar el último carácter.Use
# stty icanon
para permitir el "modo canónico (cocido)". Vea alguna explicación aquí /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalAlgunos 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 -icanon
deshabilitar el límite de 4k, pero perdí la capacidad de usar retroceso (borrar).fuente