Criando script com loop na mesma tela

2

Eu tenho um problema simples, com meu script, eu preciso de 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:

Euprecisoexibiressasinformaçõesdeumamaneiraquenãogereessasváriaslinhasdoprimeiroexemploeexibaapenasoloopdasinformaçõesemquestão,comonosegundoexemplo:

Comopossofazerisso:

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

    
por Bulfaitelo 31.10.2016 / 18:12

1 resposta

1

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

Por outro lado, se o seu terminal não está limpando a tela, isso faz parte do problema. Talvez essa linha colorida seja o prompt a partir do qual você executou o script, e você pode querer mantê-lo na parte superior da tela:

  • normalmente você definiria TERM como um valor adequado que corresponde a uma descrição do terminal.
  • uma descrição do 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ê pode deseja manter)
  • se você quiser limpar da segunda linha, você pode (na maioria dos terminais) fazer
    printf '3[2H3[J'

ou

    tput cup 1 0
    tput ed
  • mas lembre-se de que, se seu prompt originalmente não estava na parte superior da tela, isso deixaria o que estava na parte superior da tela intocada.

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

    printf '3[4H'

ou

    tput cup 3 0

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

    #!/bin/bash

    if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
    #result='sensors -A'
    count=0
    printf '3[2H3[J'
    keypress=''
    echo "linha 1"
    echo "Linha 2
    while [ "x$keypress" = "x" ]; do    
      let "count++" 
      printf '3[4H'
      echo $count
      sleep 1 
      keypress="'cat -v'"
    done
    if [ -t 0 ]; then stty sane; fi
    exit 0

Leitura adicional:

por 05.11.2016 / 16:12