¿Por qué necesito insertar 12 caracteres para borrar esta línea de comando bash?

14

Abro un terminal xterm (80 columnas x 24 líneas), luego ejecuto $ bash --norc --noprofiley luego $ ttyobtengo el nombre del archivo del terminal: la salida es /dev/pts/9.

Desde otra terminal corro:

$ printf foo >/dev/pts/9

foose imprime en la línea de comandos del shell en el primer terminal.
Si presiono C-upara ejecutar unix-line-discard(nombre de la función dada por $ bind -P | grep -i c-u), foono se elimina.
Si inserto 11 espacios y presiono C-u, los espacios se eliminan pero no foo.
Si inserto 12 espacios y presiono C-u, los espacios también se eliminan foo.

ingrese la descripción de la imagen aquí

¿Por qué no puedo eliminar foocuando presiono C-umientras mi cursor está justo después y por qué debo insertar 12 caracteres para eliminarlo?


Ambiente:

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 16.04.6 LTS
Release:        16.04
Codename:       xenial

$ bash --version | head -n1
GNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)

$ xterm -version
XTerm(322)
usuario938271
fuente

Respuestas:

19

Cuando algún otro programa se imprime fooen la /dev/pts/9comunicación entre ttys, el shell no participa en el intercambio, no puede saber cuántos caracteres se imprimieron o incluso si se imprimió algún carácter. El caparazón sigue creyendo que no hay caracteres para borrar. De hecho, si imprime fooen el terminal e intenta borrarlo con retroceso, no funciona. El shell no intenta borrar lo que cree que no está allí.

Pruebe en la terminal donde utilizó el comando --norc --noprofile:

bash-4.3$ printf 'some text'

Llegar:

some textbash-4.3$

En ese punto, el espacio de retroceso no borrará nada. Además ctrl-u, no borrará nada. Si escribe algunos caracteres (hasta 11 de ellos) ctrl-ueliminará solo lo que se escribió (al igual que la tecla de retroceso). Pero cuando hay más de 11 caracteres, el comando ctrl-uvolverá a lo que cree que es el comienzo de la línea (una forma más rápida de borrar muchos caracteres) que dejará este mensaje:

some textb

Eso podría considerarse un error de la OMI (todavía presente en bash 5.0). Pero cambia a 20 (18 para el OP) caracteres en bash-5 si --norc --noprofileno se usan las opciones (no he tratado de encontrar la razón, no es un problema tan importante IMnshO).

Isaac
fuente
Gracias por la respuesta. Con respecto al segundo error, con $ printf 'some text', puedo reproducir en bash 5.0 sin --norc --noprofilesi inserto 17 caracteres o más.
user938271
@ user938271 Correcto, el problema se reprodujo para mí con 20 caracteres, información agregada a la respuesta, gracias.
Isaac