Backspace não funciona dentro do script bash em execução

7

Estou executando um script muito simples que lê linha por linha e imprime a linha inserida de volta ao terminal:

while read CMD; do
    echo $CMD
done

Funciona bem, mas quando tento editar a linha com o caractere backspace , ele imprime ^? em vez de excluir o caractere. E quando pressiono Ctrl + backspace , a saída é ^H . Como esse comportamento pode ser corrigido, então backspace remove caracteres em vez de adicionar esses caracteres? Eu tentei o comando stty erase '^?' , mas não com sucesso.

    
por vrom911 15.08.2017 / 18:16

2 respostas

5

O problema é que existem muitas maneiras de representar um backspace, mas o comando read não entende todas elas. Você deve ser capaz de configurar exatamente o que é enviado ao pressionar a tecla ← Backspace nas configurações do seu emulador de terminal.

Supondo que você esteja usando gnome-terminal como emulador, abra o Editar manu e clique em Preferências de perfil . Mude para o separador Compatibilidade e deverá obter estas opções:

Agora você pode alterar a configuração da tecla de retrocesso: . Você tem estas cinco opções abaixo disponíveis para escolher. Eu adicionei chaves como eles se comportam no meu sistema:

  • Automático (funciona)
  • Control-H (imprime ^H )
  • ASCII DEL (padrão, funciona)
  • Sequência de escape (imprime ^[[3~ )
  • TTY Erase (funciona)
por Byte Commander 15.08.2017 / 18:34
1

Eu tive o mesmo problema, usando o bash no Gnome-Terminal.

Observe que na linha de comando, o backspace funciona como esperado, mas quando meu programa (um cliente de bate-papo baseado em soquete TCP simples) está lendo stdin, o caractere backspace é impresso (ecoa de volta à tela) ^? em vez de excluir o último caractere.

Use # stty icanon para permitir o "modo canônico (cozido)". Veja algumas explicações aqui link

Mais algumas informações sobre meu problema / solução: Eu tive um problema em que precise colar mais de 4k caracteres. E durante essa pesquisa, fui levado ao link acima. Eu usei # stty -icanon para desabilitar o limite de 4k, mas perdi a capacidade de usar backspace (apagar).

    
por roger 05.01.2018 / 17:06