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

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

Estou trabalhando em um script Bash para testes massivos de memória flash USB (usando f3nos bastidores). Preciso exibir uma interface semelhante a uma tabela com várias colunas e células.

Atualmente estou usando printfwith e fica assim:

insira a descrição da imagem aqui

Eu tenho uma função separada em execução para cada unidade que grava texto em um arquivo de log. Esses arquivos de log são analisados ​​para exibir as informações ao usuário.

Como você pode ver, algumas linhas têm deslocamentos que não deveriam estar lá, mas não consigo me livrar deles. Não parece ser causado pela impressão de strings longas. Eu não sei o que é isso.

Outro problema que tenho é o tempo de atualização e a necessidade de limpar e redesenhar manualmente a tela inteira às vezes, devido a mensagens stderr ocasionais que aparecem lá grepou catquando alguns arquivos não são lidos corretamente.

Atualmente estou reescrevendo parcialmente este script e descobri o que pude fazer de melhor em relação à impressão dos dados na tela. Pensei em investigar, ncursesmas isso parece uma coisa um pouco complicada e provavelmente tornaria as coisas muito complexas para eu manter.

Gostaria de saber se existe uma maneira de despejar os comandos echoou printem um arquivo de texto e, em seguida, executá-los todos de uma vez para basicamente ter um "backbuffer" de texto para que minha atualização possa ser mais consistente e rápida?

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 haja uma maneira melhor de fazer esse tipo de coisa no Bash, que eu não conheça?

Responder1

Usar column -tdeve funcionar para você.

Responder2

Você pode usar tputpara mover o cursor, por exemplo, tput cup 0 0; echo testcolocará a escrita "teste" no canto superior esquerdo da tela.

Alternativamente, se você quiser usar uma abordagem com buffer, poderá despejar linhas em um arquivo, limpar a tela e cat 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 traplinha se quiser deixar o arquivo temporário para depuração.

Responder3

Acho que você quase alcançou o que pretendia fazer, embora com alguns pequenos bugs e possivelmente alguns problemas de desempenho. Pessoalmente, eu primeiro tentaria resolver os bugs e depois tentaria entender onde o desempenho poderia ser melhorado. No entanto, em relação à sua taxa de atualização, mesmo programas como top ou watch geralmente são executados com uma atualização a cada 2 ou 1 segundo e isso geralmente é suficiente. Você não diz qual taxa está tentando alcançar.

Existe um semelhantePergunta sobre Stackexchange, que tem duas respostas/sugestões,

  1. Use o programa dialogque é 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 no ncurses, mas tem a vantagem de usar echo (uma função interna do bash) então não suporta a sobrecarga de execução /usr/bin/printfpara formatar a saída.

Resolvendo seus problemas por sua vez.

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

  2. Bug de colunas, mostre seu código, dados de entrada e saída necessária, então podemos fazer sugestões. Este bug pode ser um efeito do bug nº 1, então resolva o nº 1 primeiro e depois resolva isso se ainda existir.

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

A outra maneira é usar um interpretador de script diferente, há muitos que escolher depende de quais você está familiarizado. (awk, python, perl, outros shells, ...). No entanto, se você não fosse usar ncurses, o princípio seria semelhante às bashdefinições de funções mostradas no2ª respostaacima.

informação relacionada