Estou executando um script muito simples que lê linha por linha e imprime a linha inserida no terminal:
while read CMD; do
echo $CMD
done
Funciona bem, mas quando estou tentando editar a linha com o backspace
caractere, ele é impresso em ^?
vez de excluí-lo. E quando eu pressiono Ctrl
+ backspace
a saída é ^H
. Como esse comportamento pode ser corrigido para backspace
remover caracteres em vez de adicionar esses caracteres? Eu tentei stty erase '^?'
comando, mas não com sucesso.
command-line
bash
vrom911
fonte
fonte
read CMD
porread -e CMD
.terminator
vez degnome-terminal
. Seu trabalho como esperado-e
opção. Mas na máquina do @ vrom911 não é o caso. Eu me pergunto por que isso acontece e onde isso pode ser configurado.Respostas:
O problema é que existem muitas maneiras de representar um backspace, mas o
read
comando não entende todas elas. Você poderá configurar exatamente o que é enviado ao pressionar a ← Backspacetecla nas configurações do emulador de terminal.Supondo que você esteja usando
gnome-terminal
como emulador, abra o menu Editar e clique em Preferências do perfil . Mude para a guia Compatibilidade e você deve obter estas opções:Agora você pode alterar a chave Backspace gera: configuração. Você tem essas cinco opções abaixo disponíveis para você escolher. Eu adicionei no aparelho como eles se comportam no meu sistema:
^H
)^[[3~
)fonte
type read
diz e quais$SHELL --version
relatórios de shell / versão ?type read
dizread is a shell builtin
. e$SHELL --version
dizGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
Eu tive o mesmo problema, usando o bash no Gnome-Terminal.
Observe que na linha de comando, o backspace funciona conforme o esperado, mas quando meu programa (um cliente de bate-papo baseado em soquete TCP simples) está lendo do stdin, o
backspace
caractere é impresso (ecoa de volta para a tela) em^?
vez de excluir o último caractere.Use
# stty icanon
para permitir o "modo canônico (cozido)". Veja algumas explicações aqui /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminalUm pouco mais sobre o meu problema / solução: tive um problema em que preciso colar mais de 4k caracteres. E durante essa pesquisa, fui levado ao link acima. Eu costumava
# stty -icanon
desativar o limite de 4k, mas perdi a capacidade de usar o backspace (apagar).fonte