Ich arbeite an einem Bash-Skript für umfangreiche Tests von USB-Flash-Speichern ( f3
unter der Haube). Ich muss eine tabellenähnliche Oberfläche mit mehreren Spalten und Zellen anzeigen.
Momentan verwende ich printf
mit und es sieht folgendermaßen aus:
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 grep
oder cat
einige 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, ncurses
aber 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 echo
oder print
Befehle 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 -t
sollte für Sie funktionieren.
Antwort2
Sie können tput
den Cursor bewegen, zum Beispiel tput cup 0 0; echo test
wird 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 trap
Zeile 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,
- Verwenden Sie das Programm
dialog
, das ist etwas ganz Besonderes. - 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
ncurses
entfällt ./usr/bin/printf
Nehmen Sie Ihre Probleme der Reihe nach an.
Fehler, die von Hintergrundbefehlen gedruckt werden. Leiten Sie stderr entweder um,
/dev/null
wenn Sie es einfach verwerfen möchten, oder in eine Datei zur späteren Verarbeitung.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.
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 bash
Funktionsdefinitionen in2. Antwortüber.