A melhor maneira de criar uma exibição de CLI semelhante à tabela no Bash?

0

Estou trabalhando em um script Bash para um enorme teste de memória flash USB (usando f3 no capô). Preciso exibir uma interface semelhante a uma tabela com várias colunas e células.

Atualmente, estou usando printf com e é assim:

Eutenhoumafunçãoseparadaemexecuçãoparacadaunidadequeescrevetextoemumarquivodelog.Essesarquivosdelogsãoanalisadosparaexibirasinformaçõesparaousuário.

Comovocêpodever,algumaslinhastêmdeslocamentosquenãodeveriamestarlá,masnãoconsigomelivrardelas.Nãoparecesercausadopelaimpressãodestringslongas.Eunãoseioqueéisso.

Outroproblemaquetenhoéotempodeatualizaçãoeanecessidadedelimparmanualmenteeredesenhartodaatelaàsvezes,devidoàsmensagensocasionaisstderrqueaparecemládegrepoucatquandoalgunsarquivosnãolêemcorretamente./p>

Atualmenteestoufazendoumareescritaparcialdessescripteoqueeupoderiafazermelhoremrelaçãoàimpressãodosdadosnatela.Penseiemolharparancurses,masissopareceseralgomuitocomplicadoeprovavelmentetornariaascoisascomplexasparaeumanter.

Gostariadesaberseháumamaneiradecopiaroscomandosechoouprintparaumarquivodetextoeexecutá-lostodosdeumavezparabasicamenteterumtexto"backbuffer" para que minha atualização seja mais consistente e mais rápido?

Eu também gostaria de poder ouvir as teclas digitadas pelo usuário e reagir a isso em segundo plano, mas isso não é uma prioridade.

Talvez exista uma maneira melhor de fazer esse tipo de coisa no Bash, que eu não conheço?

    
por unfa 29.11.2017 / 12:43

2 respostas

0

Você pode usar tput para mover o cursor, por exemplo, tput cup 0 0; echo test colocará "teste" na parte superior esquerda da tela.

Como alternativa, se você quiser usar uma abordagem em buffer, pode despejar linhas em um arquivo, limpar a tela e ativar o arquivo:

# In program setup
TEMPFILE=$(mktemp) # Create temporary file
trap "rm -f $TEMPFILE" EXIT # Remove temporary on exit

# Main lopp
while true
do
  echo "TEST" >$TEMPFILE # Clear file and set first line with >
  date >>$TEMPFILE # Append lines to file with >>

  clear # Clear the screen
  cat $TEMPFILE # Dump the file
  sleep 1 # Just for testing to avoid high CPU
done

Comente a linha trap se quiser deixar o arquivo temporário para depuração.

    
por 29.11.2017 / 14:43
0

Acho que você quase conseguiu o que se propôs a fazer, embora com alguns bugs menores e possivelmente alguns problemas de desempenho. Pessoalmente, eu tentaria primeiro resolver os bugs, depois tentaria entender onde o desempenho poderia ser melhorado. No entanto, no que diz respeito à sua taxa de atualização, até programas como o top ou o relógio geralmente são executados com uma atualização a cada 2 ou 1 segundos, e isso geralmente é suficiente. Você não diz qual a taxa que você está tentando alcançar.

Existe uma pergunta Stackexchange semelhante, que tem duas respostas / sugestões,

  1. Use o programa dialog , que é outra coisa para aprender.
  2. Mostra a criação de funções bash, para limpar, redefinir, escrever texto em uma posição na tela, que é um conjunto semelhante de funções que você provavelmente usaria em ncurses , mas tem a vantagem de usar echo (a bash construído em função) para não suportar a sobrecarga de executar /usr/bin/printf para formatar a saída.

Respondendo aos seus problemas.

  1. erros sendo impressos de comandos em segundo plano. Redirecione, stderr para /dev/null se você quiser apenas descartá-lo ou para um arquivo para processamento posterior.

  2. Colunas de erro, mostre seu código, insira os dados necessários e, em seguida, podemos fazer sugestões. Este bug pode ser um efeito do bug # 1, então resolva primeiro o primeiro e depois responda se ainda existe.

  3. Desempenho (edite sua pergunta) e adicione seu código para que possamos ver o que você está fazendo e fazer sugestões.

A outra maneira é usar um interpretador de scripts diferente, há muitos que escolher dependendo de quais você está familiarizado. (awk, python, perl, outras shells, ...). No entanto, se você não usasse ncurses, o princípio seria semelhante às definições da função bash mostradas na segunda resposta acima.

    
por 29.11.2017 / 14:50