Por que preciso inserir 12 caracteres para limpar esta linha de comando do bash?


14

Abro um terminal xterm (80 colunas x 24 linhas), depois corro $ bash --norc --noprofilee, em seguida, $ ttypara obter o nome do arquivo do terminal: a saída é /dev/pts/9.

De outro terminal, corro:

$ printf foo >/dev/pts/9

fooé impresso na linha de comando do shell no primeiro terminal.
Se eu pressionar C-upara executar unix-line-discard(nome da função fornecida por $ bind -P | grep -i c-u), foonão será removido.
Se eu inserir 11 espaços e pressionar C-u, os espaços serão removidos, mas não serão foo.
Se eu inserir 12 espaços e pressionar C-u, os espaços serão removidos e também foo.

insira a descrição da imagem aqui

Por que não consigo removê-lo fooquando pressiono C-uenquanto meu cursor está logo depois dele e por que preciso inserir 12 caracteres para removê-lo?


Meio 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)

Respostas:


19

Quando algum programa de outro cópias foopara a /dev/pts/9comunicação entre ttys, o shell não participar no intercâmbio, ele não pode estar ciente de quantos caracteres foram impressos ou mesmo se qualquer personagem foi impresso. O shell ainda acredita que não há caracteres para apagar. De fato, se você imprimir foono terminal e tentar apagá-lo com backspace, não funcionará. O shell não tenta apagar o que acredita que não existe.

Tente no terminal onde você usou o comando --norc --noprofile:

bash-4.3$ printf 'some text'

para obter:

some textbash-4.3$

Nesse ponto, o backspace não apagará nada. Além disso, o ctrl-unão irá apagar nada. Se você digitar alguns caracteres (até 11 deles) ctrl-uremoverá apenas o que foi digitado (assim como o backspace). Porém, quando houver mais de 11 caracteres, o comando ctrl-uretornará ao que acredita ser o início da linha (uma maneira mais rápida de apagar muitos caracteres), o que deixará esse prompt:

some textb

Isso pode ser considerado um bug da IMO (ainda presente no bash 5.0). Mas muda para 20 (18 para o OP) caracteres no bash-5 se as --norc --noprofileopções não forem usadas (não tentei encontrar o motivo, não é um problema tão importante no IMnshO).


Obrigado pela resposta. Em relação ao segundo bug, com $ printf 'some text', eu posso reproduzir no bash 5.0 sem --norc --noprofilese inserir 17 caracteres ou mais.
user938271

@ user938271 Correto, o problema foi reproduzido para mim com 20 caracteres. Informações adicionadas à resposta, obrigado.
Isaac
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.