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

8

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

Por exemplo, leve 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 algo que me deixe fazer 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, nada acima deste script que é impresso na tela do shell não deve ser apagado.

Estou usando bash

    
por GypsyCosmonaut 10.08.2017 / 14:43

3 respostas

14

Use um retorno de carro ( \r ). Este caractere especial (uma sobra dos dias das máquinas de escrever mecânicas) irá mover o cursor de volta para o início da linha. Em seguida, você precisa de tantos espaços quanto a mensagem que deseja excluir (isso sobrescreverá a mensagem) e, em seguida, um segundo carro retornará para o início antes de imprimir a próxima mensagem. Algo parecido com isto:

#!/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

Executando o script acima das impressões:

$ foo.sh
foo
Have fun        
    
por 10.08.2017 / 14:55
11

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. ( tcsh e zsh também têm o echotc embutido que você pode usar com o termcap equivalente desse terminfo el : echotc ce (também echoti el in zsh ))

    
por 10.08.2017 / 14:59
2

Existem várias maneiras de fazer isso, desde a prova de idiotas até a elegância.

O método mais infalível (embora o mais trabalhado) é o retrocesso de espaço de retrocesso repetido, porém muitas vezes necessário. Isso funciona com tudo, menos com teletipos (remover tinta do papel é um desafio).

Em seguida, a escala é o retorno de carro dos 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 (essa é uma opção que o minicom e outros podem estar configurados para ter).

Em seguida, há os truques específicos do terminal que mencionarei apenas os códigos de capacidade 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) seguido por limpar até o final da linha (ce).

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

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

    
por 14.08.2017 / 20:00