Estoy trabajando en un script Bash para pruebas masivas de memoria flash USB (usando f3
bajo el capó). Necesito mostrar una interfaz similar a una tabla con varias columnas y celdas.
Actualmente estoy usando printf
y se ve así:
Tengo una función separada ejecutándose para cada unidad que escribe texto en un archivo de registro. Estos archivos de registro se analizan para mostrar la información al usuario.
Como puede ver, algunas filas tienen desplazamientos que no deberían estar allí, pero no puedo deshacerme de ellos. No parece deberse a la impresión de cadenas largas. No sé qué es esto.
Otro problema que tengo es el tiempo de actualización y la necesidad de borrar y volver a dibujar manualmente toda la pantalla en ocasiones, debido a mensajes stderr ocasionales que aparecen allí grep
o cat
cuando algunos archivos no se leen correctamente.
Actualmente estoy haciendo una reescritura parcial de este script y sé lo que podría hacer mejor con respecto a imprimir los datos en la pantalla. Pensé en investigarlo, ncurses
pero eso parece algo demasiado complicado y probablemente haría que las cosas fueran demasiado complejas de mantener.
Me pregunto si hay alguna manera de volcar los comandos echo
o print
a un archivo de texto y luego ejecutarlos todos a la vez para básicamente tener un "backbuffer" de texto para que mi actualización pueda ser más consistente y rápida.
También me gustaría poder escuchar las pulsaciones de teclas del usuario y reaccionar ante ellas en segundo plano, pero eso no es una prioridad.
¿Quizás haya una mejor manera de hacer este tipo de cosas en Bash, que no conozco?
Respuesta1
El uso column -t
debería funcionar para usted.
Respuesta2
Puede utilizarlo tput
para mover el cursor; por ejemplo, tput cup 0 0; echo test
escribirá "prueba" en la parte superior izquierda de la pantalla.
Alternativamente, si desea utilizar un enfoque almacenado en búfer, puede volcar líneas en un archivo, borrar la pantalla y capturar el archivo:
# 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 la trap
línea si desea dejar el archivo temporal para depurarlo.
Respuesta3
Creo que casi has logrado lo que te propusiste, aunque con algunos errores menores y posiblemente algunos problemas de rendimiento. Personalmente, primero intentaría resolver los errores y luego intentaría comprender dónde se podría mejorar el rendimiento. Sin embargo, en cuanto a la frecuencia de actualización, incluso programas como top o watch suelen ejecutarse con una actualización cada 2 o 1 segundos y esto suele ser suficiente. No dices qué tasa estás tratando de lograr.
Hay uno parecidopregunta de intercambio de pila, que tiene dos respuestas/sugerencias,
- Utilice el programa
dialog
que es algo más que aprender. - Muestra la creación de funciones bash, para borrar, restablecer y escribir texto en una posición de la pantalla, que es un conjunto similar de funciones que probablemente usarías en
ncurses
, pero tiene la ventaja de usar echo (una función integrada de bash), por lo que no soporta la sobrecarga de ejecutar/usr/bin/printf
para formatear la salida.
Tomando sus problemas a su vez.
errores que se imprimen desde comandos en segundo plano. Redirija, stderr a
/dev/null
si solo desea descartarlo o a un archivo para su posterior procesamiento.Error de columnas, muestre su código, datos de entrada y salida requerida, luego podemos hacer sugerencias. Este error podría ser un efecto del error n.° 1, así que resuelva primero el n.° 1 y luego solucione este problema si aún existe.
Rendimiento (edite su pregunta) y agregue su código para que podamos ver lo que está haciendo y hacer sugerencias.
La otra forma es utilizar un intérprete de script diferente, hay tantos que elegir depende de cuáles conoce. (awk, python, perl, otros shells, ...). Sin embargo, si no fuera a utilizar ncurses, el principio sería similar a las bash
definiciones de funciones que se muestran en la2da respuestaarriba.