Eu tenho brincado um pouco com o bash e queria saber se é possível fazer o texto piscar parar se eu executar outro comando. Por exemplo, echo -e '\033[5mEXAMPLE\033[0m'
produzirá um EXAMPLE
texto piscando; porém, gostaria de saber se é possível fazer o texto parar de piscar se um segundo comando for executado.
O envio da
<ESC>[5m
sequência informa ao terminal para definir os atributos piscantes dos caracteres que serão exibidos a partir de agora.Na maioria dos terminais,
<ESC>[25m
desative isso para que os caracteres que serão enviados posteriormente tenham seu atributo piscante desativado.<ESC>[0m
, o mesmo que<ESC>[m
desativa todos os atributos de renderização de caracteres, incluindo negrito, destaque, cor, etc. Não apenas piscando.O envio dessas sequências não alterará o que já foi exibido.
Para que
EXAMPLE
algum lugar na tela pare de piscar, você teria que enviar um novoEXAMPLE
na mesma posição com o piscar que o sobrescreve.Por exemplo:
Exibiria um piscando
EXAMPLE
e, 5 segundos depois, moveria o cursor de volta para o início da linha (CR, também conhecido como\r
move o cursor para o início) e o substituiria por um sem piscarEXAMPLE
.Com alguns terminais¹, também é possível alterar os atributos de todos os caracteres de uma região do display utilizando a
<ESC><top>;<left>;<bottom>;<right>25$r
sequência de escape DECCARA , padronizando a tela inteira se os limites não forem especificados. ADECSACE
sequência de escape pode ser enviada para decidir se esses dois<top>;<left>
e<bottom>;<right>
as coordenadas são o primeiro e o último caracteres ou os cantos de uma área retangular.Exemplo:
Removeria todas as piscadas em toda a tela.
Para remover o piscar de algum texto contíguo específico na tela com isso, você precisa saber as coordenadas do primeiro e do último caractere desse texto.
Você pode consultar a posição do cursor com a
<ESC>[6n
sequência de escape.Com
bash
, você pode fazer isso e ler sua<ESC>[<y>;<x>R
resposta com:assumindo que o usuário não está digitando nada ao mesmo tempo ou antes, onde:
p
romptread
para desativarecho
com-s
para que a resposta não apareça na telar
até oR
d
limitador.F
campo dividido emS
qualquer um dos caracteres<ESC>
, , armazenando os campos resultantes nas[
variáveis , e .;
_
_
$2
$1
Então você pode fazer:
E mais tarde, assumindo que não houve rolagem:
Em tudo o que foi dito acima, usamos
printf
em vez deecho
para torná-lo portátil em diferentes shells, ou diferentes compilações/versões/configurações dos mesmos. Com oprintf
built-in do bash e a maioria das outrasprintf
implementações, você pode usar\e
em vez de\33
.¹ que tem muito menos suporte do que as outras sequências de escape mencionadas aqui. Observe também que nem
tmux
nemscreen
oferece suporte, mesmo que o terminal host o faça. Embora seja possível convencê-los a passar a sequência para o host, isso ainda não funcionaria corretamente com janelas divididas.Texto piscando
Reverter características
Exemplo
Ou
Armado com isso e a capacidade de mover o cursor para cima (
tput cuu1
) ou mesmo para uma posição absoluta (tput cup Y X
- (0,0) é o canto superior esquerdo), você pode substituir o texto piscando por um texto que não pisca, como desejar.Vale a pena ler mais sobre terminfo; você pode até salvar a posição atual do cursor, mover para um novo local para escrever seu texto e, em seguida, reverter a posição. E se o seu terminal não suportar isso, desde que corresponda
$TERM
à realidade, você simplesmente voltará a uma aproximação