eu uso printf "input: "; read -e
. Eu digito algo e pressiono Backspace
. Ao chegar ao último caractere, apaga a input:
parte junto com ele. Backspace
não se comporta mal se eu não tivesse digitado nada antes ou se eu usasse simples read
(sem Readline).
read
inbash
é um comando interno.read -e
usa abash
edição em tela cheia através dareadline
biblioteca (ou seja, ele entende como voltar para a linha anterior, mover o cursor para a esquerda e para a direita no texto inserido, etc.). Ele pode usar códigos de endereçamento de cursor para otimizar a saída para a tela.No entanto, ele espera que o cursor esteja no início da linha quando ela começa e, às vezes, é mais rápido limpar a linha inteira ao remover a entrada do que remover os caracteres individuais. Isso é o que está atrapalhando seu prompt, que move o cursor para a direita sem que o bash saiba disso.
A mesma coisa pode acontecer ao usar escapes de terminal em seu prompt (por exemplo, para definir uma cor ou para definir o título do terminal). Para isso
bash
possui escapes especiais para indicar quais bytes não movem o cursor.Você deve usar
read -p 'input: ' -e
, a-p
opção de solicitação é feita especialmente para isso.A
read -e
chama a biblioteca readline. Que dá acesso a diversas ferramentas de edição que um flatread
não possui. No entanto, ele assume uma "linha vazia".Uma solução para esse problema é fornecer algo (como um espaço) para evitar a suposição de "linha vazia":
Mas como isso já está usando a
-p
opção, pode ser mais simples escrever: