Tornar o texto desaparecer após a entrada do usuário

9

Existe uma maneira de fazer com que o conteúdo exibido desapareça logo após a entrada do usuário?

Por exemplo, pegue este arquivo abaixo

#!/bin/bash
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    echo 'Have fun'
else
    echo 'Go to Doctor'
fi

Se você executar isso, a saída será

how are you ? yHave fun

Estou procurando por algo que me permita how are you ?desaparecer assim que o usuário pressionar uma tecla

E depois de desaparecer, imprima Have fun

Então, eu quero que a última saída do programa acima seja apenas

Have fun

Nota: Além disso, qualquer coisa acima desse script impresso na tela do shell não deve ser apagada.

estou usando bash

CiganoCosmonauta
fonte
2
usando clearentre echos não é uma opção?
sebasth
1
Não, clearlimpará a saída que já está impressa acima na tela, se houver alguma. @sebasth
GypsyCosmonaut
De onde Are you finevem? Isso não deveria ser How are you?
Barmar
@Barmar sim, desculpe daquele por engano, corrigido agora
GypsyCosmonaut

Respostas:

12

Você pode usar:

tput cr

(ou printf '\r') para mover o cursor para o início da linha. Seguido por:

tput el

para excluir tudo até o final da linha. ( tcshe zshtambém possui o echotcbuilt-in que você pode usar com o termcapequivalente a isso terminfo el: echotc ce(também echoti elem zsh))

Stéphane Chazelas
fonte
14

Use um retorno de carro ( \r). Esse caractere especial (restante dos dias das máquinas de escrever mecânicas) moverá o cursor de volta ao início da linha. Então, você precisa de tantos espaços quanto a mensagem que deseja excluir (isso substituirá a mensagem) e, em seguida, um segundo retorno de carro para voltar ao início antes de imprimir a próxima mensagem. Algo assim:

#!/bin/bash
echo foo
read -n 1 -p 'how are you ? ' var
if [ "$var" == "y" ]
then
    printf '\r                \rHave fun\n'
else
    printf '\r                \rGo to Doctor\n'
fi

A execução do script acima é impressa:

$ foo.sh
foo
Have fun        
terdon
fonte
1
Em vez de dois, \rvocê pode colocar todos os espaços entre \rHave fune \n.
Barmar
2

Existem várias maneiras de fazer isso, variando de prova de idiota a elegante.

O método mais infalível (embora seja mais trabalhoso) é o backspace space backspace repetido quantas vezes forem necessárias. Isso funciona em tudo, exceto nos teletipos (remover a tinta do papel é um desafio).

Em seguida, na escala, estão os espaços de retorno de carro. Isso não funciona com emuladores de terminal que inserem um avanço de linha antes ou depois de cada retorno de carro (esta é uma opção minicom e outras podem ser configuradas para ter).

Depois, há os truques específicos do terminal. Mencionarei apenas os códigos de capacidade do termcap, pois os bancos de dados termcap e terminfo podem mostrar o uso. (Aqui está uma lista.)

Simples para uma única linha é mover para a coluna (ch) seguida de limpar para o final da linha (ce).

Para casos mais complicados, incluindo respostas de várias linhas, é possível salvar a posição absoluta (sc), prompt, resposta de leitura, restaurar a posição do cursor (rc), limpar até o final da tela (cd).

Na maioria dos casos, você pode codificar os valores do vt100 para as duas últimas respostas, pois a maioria dos emuladores de terminal é compatível com ele. É claro que nem todos os terminais suportam essas opções, mas aqueles que não são raros e obsoletos.

hildred
fonte