Criando script com looping na mesma tela

Criando script com looping na mesma tela

Estou com um problema simples, com meu script, preciso do script de linha na mesma tela e não exibe as últimas informações acima, veja meu código de demonstração:

#!/bin/bash

if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
#result=`sensors -A`
count=0
keypress=''
echo -ne "linha 1\nLinha 2\n " > /tmp/temp_script.log
while [ "x$keypress" = "x" ]; do    
  clear  
  let "count++" 
  output="$(cat /tmp/temp_script.log)"
  printf  "$output"\\b
  echo -en $count\\n
  sleep 1 
keypress="`cat -v`"
done
if [ -t 0 ]; then stty sane; fi
exit 0

O código do resultado:

código atual

Preciso exibir essas informações de uma forma que não gere essas múltiplas linhas do primeiro exemplo, e exibir apenas o looping das informações em questão, como no segundo exemplo:

Como posso fazer isso:

meu objetivo

E assim por diante, para que não haja impressões anteriores do loop no terminal, apenas o que está sendo impresso agora.

Responder1

Supondo que oclearrealmente limpa a tela, então o script mostrado, por si só, não produzirá a primeira captura de tela. Se você tivesse um processo adicional anexado a /tmp/temp_script.log, isso poderia fazer alguma coisa ...

Por outro lado, se o seu terminal não estiver limpando a tela, isso é parte do problema. Talvez essa linha colorida seja o prompt a partir do qual você executou o script, e você gostaria de mantê-la no topo da tela:

  • normalmente você definiria TERMum valor adequado que corresponde a uma descrição do terminal.
  • uma descrição de terminal "adequada" informa como limpar a tela.
  • como efeito colateral, limpar a tela (por convenção) também move o cursor para o canto superior esquerdo da tela, mas
  • limpar a tela do canto superior esquerdo da tela também limparia a linha colorida (que vocêpoderquero manter)
  • se você quisesse limpar a partir da segunda linha, você poderia (na maioria dos terminais) fazer
    imprimirf '\033[2H\033[J'

ou

    coloque xícara 1 0
    tput ed
  • mas tenha em mente que se o seu prompt originalmente não estivesse no topo da tela, isso deixaria o que quer que fosse.erana parte superior da tela intocada.

A outra parte do problema é que as três linhas são impressas repetidamente, descendo pela tela. Você pode alterar isso para mover o cursor para onde deseja imprimir o contador, por exemplo,

    imprimirf '\033[4H'

ou

    coloque o copo 3 0

Juntando tudo isso, seu script pode ficar assim (e usando printf, já que algo parece errado com sua TERMdescrição e/ou terminal):

    #!/bin/bash

    se [ -t 0 ]; então stty -echo -icanon -icrnl tempo 0 min 0; fi
    #resultado=`sensores -A`
    contagem=0
    imprimirf '\033[2H\033[J'
    pressionamento de tecla=''
    eco "linha 1"
    eco "Linha 2
    enquanto ["x$keypress" = "x"]; fazer    
      deixe "contar++"
      imprimirf '\033[4H'
      eco $contar
      dormir 1
      keypress="`gato -v`"
    feito
    se [ -t 0 ]; então muito são; fi
    saída 0

Leitura adicional:

informação relacionada