leia 1 ou várias linhas no bash - faça funcionar ao colar (além de digitar manualmente)

0

Eu leio várias respostas com complexidades variadas. A maioria está funcionando bem quando a entrada é digitada manualmente.

Por exemplo: link .

Aqui está o meu código de exemplo, muito próximo daquele na resposta:

_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do 
  theanswer="${theanswer}${more}"
done

Isso também funciona muito bem quando digito a resposta manualmente, por exemplo: caractere por caractere ...

Mas se eu colar uma linha (ou várias): ecoa o "buffer restante" depois que cada caractere for lido ... causando confusão na exibição.

Ainda não encontrei uma maneira de esconder isso, mantendo o eco normal na tela. (ou seja, se digitar ou colar, ainda quero ver o que é digitado / colado)

Exemplo curto: aqui está o prompt (bom) enquanto digito manualmente "abcd", caractere por caractere:

answer: abcd

Mas se eu fornecer "abcd" colando-o em um único momento com o mouse, ele estraga o eco repetindo depois que cada caractere for lido no buffer inteiro restante:

answer: abcdbcdcdd

tl / dr: o snippet funciona muito bem ao digitar caractere por caractere, mas ecoa o buffer de leitura restante depois de ler cada caractere de uma entrada colada.

    
por Olivier Dulac 11.07.2016 / 21:50

1 resposta

0

Eu posso ter encontrado uma solução alternativa ... Mas também espero que alguém dê algo melhor.

Código corrigido: oculto o eco normal e faço um eco a cada leitura:

stty_orig='stty -g'  ### added this
stty -echo           ### added this
_delay_end_input_=2
printf "%s\n" "answer: "
IFS= read -d '' -n 1 theanswer
printf "$theanswer" >&2 ;  ### added this
while IFS= read -d '' -n 1 -t ${_delay_end_input_} more ; do
  printf "$more" >&2 ;  ### added this
  theanswer="${theanswer}${more}"
done

stty $stty_orig  ### added this

Parece até agora fazer tudo o que eu precisava ... Mas eu não gosto de imprimir para stderr dessa maneira ... (talvez seja melhor imprimir em / dev / tty em vez disso?)

edit : uma desvantagem grande é difícil de lidar com "backspaces" ou dels: se a pessoa que digitar 1 ou várias linhas de texto quiser alterar alguma coisa, muito peludo para interpretar as chaves corretivas ... Ter uma readline permitindo 1 ou várias linhas de entrada seria a melhor aqui ... (talvez perl tenha uma?)

    
por 11.07.2016 / 22:11