Beste Möglichkeit, eine tabellenähnliche CLI-Anzeige in Bash zu erstellen?

Beste Möglichkeit, eine tabellenähnliche CLI-Anzeige in Bash zu erstellen?

Ich arbeite an einem Bash-Skript für umfangreiche Tests von USB-Flash-Speichern ( f3unter der Haube). Ich muss eine tabellenähnliche Oberfläche mit mehreren Spalten und Zellen anzeigen.

Momentan verwende ich printfmit und es sieht folgendermaßen aus:

Bildbeschreibung hier eingeben

Ich habe für jedes Laufwerk eine separate Funktion ausgeführt, die Text in eine Protokolldatei schreibt. Diese Protokolldateien werden analysiert, um dem Benutzer die Informationen anzuzeigen.

Wie Sie sehen, haben einige Zeilen Offsets, die nicht da sein sollten, aber ich kann sie nicht beseitigen. Es scheint nicht daran zu liegen, dass lange Zeichenfolgen gedruckt werden. Ich weiß nicht, was das ist.

Ein weiteres Problem, das ich habe, ist die Aktualisierungszeit und die Notwendigkeit, den gesamten Bildschirm manchmal manuell zu löschen und neu zu zeichnen, da gelegentlich Stderr-Meldungen angezeigt werden grepoder cateinige Dateien nicht richtig gelesen werden.

Ich arbeite derzeit an einer teilweisen Neufassung dieses Skripts und bin mir nicht sicher, ob ich das Ausdrucken der Daten auf dem Bildschirm verbessern könnte. Ich habe darüber nachgedacht, mir das mal anzusehen, ncursesaber das scheint mir ein bisschen zu kompliziert und würde die Dinge für mich wahrscheinlich viel zu komplex machen, um sie zu verwalten.

Ich frage mich, ob es für mich eine Möglichkeit gibt, die echooder printBefehle in eine Textdatei zu schreiben und diese dann auf einmal auszuführen, um grundsätzlich einen Text-„Backbuffer“ zu haben, sodass meine Aktualisierung konsistenter und schneller erfolgen kann?

Ich würde auch gerne die Tastenanschläge des Benutzers abhören und im Hintergrund darauf reagieren können, aber das hat keine Priorität.

Vielleicht gibt es eine bessere Möglichkeit, so etwas in Bash zu tun, die ich nicht kenne?

Antwort1

Die Verwendung column -tsollte für Sie funktionieren.

Antwort2

Sie können tputden Cursor bewegen, zum Beispiel tput cup 0 0; echo testwird oben links auf dem Bildschirm „Test“ geschrieben.

Wenn Sie alternativ einen gepufferten Ansatz verwenden möchten, können Sie Zeilen in eine Datei schreiben, den Bildschirm löschen und die Datei mit cat überprüfen:

# 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

Kommentieren Sie die trapZeile aus, wenn Sie die temporäre Datei zum Debuggen belassen möchten.

Antwort3

Ich denke, Sie haben fast Ihr Ziel erreicht, allerdings mit ein paar kleineren Fehlern und möglicherweise einigen Leistungsproblemen. Persönlich würde ich zuerst versuchen, die Fehler zu beheben und dann herauszufinden, wo die Leistung verbessert werden könnte. Was Ihre Aktualisierungsrate betrifft, werden selbst Programme wie top oder watch normalerweise alle 2 oder 1 Sekunde aktualisiert, und das ist normalerweise ausreichend. Sie sagen nicht, welche Rate Sie erreichen möchten.

Es gibt eine ähnlicheStackexchange-Frage, das zwei Antworten/Vorschläge hat,

  1. Verwenden Sie das Programm dialog, das ist etwas ganz Besonderes.
  2. Zeigt die Erstellung von Bash-Funktionen zum Löschen, Zurücksetzen und Schreiben von Text an einer Position auf dem Bildschirm. Dabei handelt es sich um einen ähnlichen Funktionssatz, den Sie wahrscheinlich in verwenden würden , der jedoch den Vorteil hat, dass Echo (eine in Bash integrierte Funktion) verwendet wird, sodass der Mehraufwand beim Ausführen zum Formatieren der Ausgabe ncursesentfällt ./usr/bin/printf

Nehmen Sie Ihre Probleme der Reihe nach an.

  1. Fehler, die von Hintergrundbefehlen gedruckt werden. Leiten Sie stderr entweder um, /dev/nullwenn Sie es einfach verwerfen möchten, oder in eine Datei zur späteren Verarbeitung.

  2. Spaltenfehler, zeigen Sie Ihren Code, die Eingabedaten und die erforderliche Ausgabe, dann können wir Vorschläge machen. Dieser Fehler könnte eine Auswirkung von Fehler Nr. 1 sein, also lösen Sie zuerst Nr. 1 und beheben Sie dann diesen Fehler, wenn er noch vorhanden ist.

  3. Leistung (bearbeiten Sie Ihre Frage) und fügen Sie Ihren Code hinzu, damit wir sehen können, was Sie tun, und Vorschläge machen können.

Die andere Möglichkeit besteht darin, einen anderen Skriptinterpreter zu verwenden. Es gibt so viele, dass Sie auswählen können, mit welchen Sie vertraut sind. (awk, python, perl, andere Shells, ...). Wenn Sie jedoch nicht ncurses verwenden möchten, wäre das Prinzip ähnlich wie bei den bashFunktionsdefinitionen in2. Antwortüber.

verwandte Informationen