Estou trabalhando em um script Bash para testes massivos de memória flash USB (usando f3
nos bastidores). Preciso exibir uma interface semelhante a uma tabela com várias colunas e células.
Atualmente estou usando printf
with e fica assim:
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á grep
ou cat
quando 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, ncurses
mas 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 echo
ou print
em 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 -t
deve funcionar para você.
Responder2
Você pode usar tput
para mover o cursor, por exemplo, tput cup 0 0; echo test
colocará 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 trap
linha 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,
- Use o programa
dialog
que é outra coisa para aprender. - 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/printf
para formatar a saída.
Resolvendo seus problemas por sua vez.
erros sendo impressos a partir de comandos em segundo plano. Redirecione, stderr para
/dev/null
se você deseja apenas descartá-lo ou para um arquivo para processamento posterior.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.
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 bash
definições de funções mostradas no2ª respostaacima.