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

14

J'ouvre un terminal xterm (80 colonnes x 24 lignes), puis je lance $ bash --norc --noprofile, puis $ ttypour obtenir le nom de fichier du terminal: la sortie est /dev/pts/9.

Depuis un autre terminal, je lance:

$ printf foo >/dev/pts/9

fooest imprimé sur la ligne de commande du shell dans le premier terminal.
Si j'appuie sur C-upour exécuter unix-line-discard(nom de la fonction donnée par $ bind -P | grep -i c-u), foon'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 également supprimés foo.

entrez la description de l'image ici

Pourquoi ne puis-je pas supprimer foolorsque j'appuie C-ualors que mon curseur se trouve 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)
user938271
la source

Réponses:

19

Quand un autre programme s'imprime foosur la /dev/pts/9communication 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 caractère à effacer. En fait, si vous imprimez foosur 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. De plus, ctrl-ucela n'effacera rien. Si vous saisissez certains caractères (jusqu'à 11 d'entre eux) ctrl-u, seuls les éléments saisis seront supprimés (tout comme le retour arrière). Mais lorsqu'il y a plus de 11 caractères, la commande ctrl-ureviendra à ce qu'elle pense être le début de la ligne (un moyen plus rapide d'effacer de nombreux caractères) ce 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 les --norc --noprofileoptions ne sont pas utilisées (je n'ai pas essayé de trouver la raison, pas un problème si important IMnshO).

Isaac
la source
Merci pour la réponse. Concernant le second bug, avec $ printf 'some text', je peux reproduire sur bash 5.0 sans --norc --noprofileque j'insère 17 caractères ou plus.
user938271
@ user938271 Correct, le problème s'est reproduit pour moi à 20 caractères, info ajoutée à la réponse, merci.
Isaac