Backspace não funciona dentro de execução de script bash

8

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 backspacecaractere, ele é impresso em ^?vez de excluí-lo. E quando eu pressiono Ctrl+ backspacea saída é ^H. Como esse comportamento pode ser corrigido para backspaceremover caracteres em vez de adicionar esses caracteres? Eu tentei stty erase '^?'comando, mas não com sucesso.

vrom911
fonte
Observe que 16.10 chegou ao final de seu ciclo de suporte no mês passado. Você deve atualizar para 17.04 o mais rápido possível.
Byte Commander
1
Eu sugiro substituir read CMDpor read -e CMD.
Cyrus
1
tente em terminatorvez de gnome-terminal. Seu trabalho como esperado
Severus Tux
1
@whtyger isso funcionou para este script. Na minha situação real, tenho entrada do programa, que não chama de leitura. Não tenho oportunidade de alterar o script do programa, este foi apenas um exemplo que representou meu problema. Existe alguma configuração global em que eu possa fazer essas configurações para todas as entradas?
precisa saber é o seguinte
1
@Cyrus My Backspace funciona como eu quero - exclui sempre o último caractere, mesmo para este script da pergunta sem -eopção. Mas na máquina do @ vrom911 não é o caso. Eu me pergunto por que isso acontece e onde isso pode ser configurado.
Shersh

Respostas:

6

O problema é que existem muitas maneiras de representar um backspace, mas o readcomando 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-terminalcomo emulador, abra o menu Editar e clique em Preferências do perfil . Mude para a guia Compatibilidade e você deve obter estas opções:

gnome-terminal → preferências de perfil → compatibilidade

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:

  • Automático (obras)
  • Control-H (imprime ^H)
  • ASCII DEL (padrão, funciona)
  • Sequência de escape (imprime ^[[3~)
  • Apagar TTY (obras)
Byte Commander
fonte
Atualmente eu tenho ASCII DEL. Eu tentei todas as 5 opções, mas nenhuma delas corrigiu o problema.
precisa saber é o seguinte
Isso é estranho. Você pode me dizer o que type readdiz e quais $SHELL --versionrelatórios de shell / versão ?
Byte Commander
Eu sei que é estranho. Tentei pesquisar muito no meu problema, mas não encontrei a solução que funcionasse para mim. type readdiz read is a shell builtin. e $SHELL --versiondizGNU bash, version 4.3.48(1)-release (x86_64-pc-linux-gnu)
vrom911 15/17
1

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 backspacecaractere é impresso (ecoa de volta para a tela) em ^?vez de excluir o último caractere.

Use # stty icanonpara permitir o "modo canônico (cozido)". Veja algumas explicações aqui /unix/131105/how-to-read-over-4k-input-without-new-lines-on-a-terminal

Um 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 -icanondesativar o limite de 4k, mas perdi a capacidade de usar o backspace (apagar).

Roger
fonte