web-dev-qa-db-fra.com

Pourquoi dois-je insérer 12 caractères pour effacer cette ligne de commande bash?

J'ouvre un terminal xterm (80 colonnes x 24 lignes), puis exécute $ bash --norc --noprofile, et alors $ tty pour obtenir le nom de fichier du terminal: la sortie est /dev/pts/9.

Depuis un autre terminal, je lance:

$ printf foo >/dev/pts/9

foo est imprimé sur la ligne de commande Shell dans le premier terminal.
Si j'appuie sur C-u courir unix-line-discard (nom de la fonction donnée par $ bind -P | grep -i c-u), foo n'est pas supprimé.
Si j'insère 11 espaces et appuie sur C-u, les espaces sont supprimés mais pas foo.
Si j'insère 12 espaces et appuie sur C-u, les espaces sont supprimés ainsi que foo.

enter image description here

Pourquoi ne puis-je pas supprimer foo lorsque j'appuie sur C-u alors que mon curseur est juste après, et pourquoi dois-je insérer 12 caractères pour le supprimer?


Environnement:

$ 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)
14
user938271

Lorsqu'un autre programme imprime foo dans le /dev/pts/9 la communication est entre ttys, le Shell ne participe pas à l'échange, il ne peut pas savoir combien de caractères ont été imprimés ou même si un caractère a été imprimé. Le Shell croit toujours qu'il n'y a aucun personnage à effacer. En fait, si vous imprimez foo sur le terminal et essayez de l'effacer avec un retour arrière, cela ne fonctionne pas. Le Shell n'essaie pas d'effacer ce qu'il pense ne pas être là.

Essayez dans le terminal où vous avez utilisé la commande --norc --noprofile:

bash-4.3$ printf 'some text'

obtenir:

some textbash-4.3$

À ce stade, le retour arrière n'effacera rien. Également ctrl-u n'effacera rien. Si vous saisissez certains caractères (jusqu'à 11 d'entre eux) ctrl-u supprimera uniquement ce qui a été tapé (comme le fait le retour arrière). Mais lorsqu'il y a plus de 11 caractères, la commande ctrl-u reviendra à ce qu'il pense être le début de la ligne (un moyen plus rapide d'effacer de nombreux caractères) qui laissera cette invite:

some textb

Cela pourrait être considéré comme un bug IMO (toujours présent dans bash 5.0). Mais passe à 20 (18 pour l'OP) caractères dans bash-5 si le --norc--noprofile les options ne sont pas utilisées (je n'ai pas essayé de trouver la raison, pas un problème si important IMnshO).

19
Isaac