Ich habe ein einfaches Problem mit meinem Skript. Ich brauche ein Zeilenskript auf demselben Bildschirm und die letzten Informationen oben werden nicht angezeigt. Siehe meinen Democode:
#!/bin/bash
if [ -t 0 ]; then stty -echo -icanon -icrnl time 0 min 0; fi
#result=`sensors -A`
count=0
keypress=''
echo -ne "linha 1\nLinha 2\n " > /tmp/temp_script.log
while [ "x$keypress" = "x" ]; do
clear
let "count++"
output="$(cat /tmp/temp_script.log)"
printf "$output"\\b
echo -en $count\\n
sleep 1
keypress="`cat -v`"
done
if [ -t 0 ]; then stty sane; fi
exit 0
Der Ergebniscode:
Ich muss diese Informationen auf eine Weise anzeigen, die diese mehreren Zeilen des ersten Beispiels nicht erzeugt, und nur die Schleife der betreffenden Informationen anzeigen, wie im zweiten Beispiel:
Wie kann ich das machen:
Und so weiter, es werden also nicht die vorherigen Abdrücke der Schleife am Terminal angezeigt, sondern nur das, was jetzt gedruckt wird.
Antwort1
Unter der Annahme, dass dieclear
den Bildschirm wirklich löscht, dann wird das angezeigte Skript nicht von sich aus den ersten Screenshot erstellen. Wenn Sie einen zusätzlichen Prozess hätten, der an anfügt /tmp/temp_script.log
, dann könnte das etwas bewirken...
Wenn Ihr Terminal den Bildschirm hingegen nicht löscht, ist das ein Teil des Problems. Vielleicht ist diese farbige Linie die Eingabeaufforderung, von der aus Sie das Skript ausgeführt haben, und Sie möchten diese lieber oben auf dem Bildschirm behalten:
- normalerweise würden Sie
TERM
einen geeigneten Wert festlegen, der einer Terminalbeschreibung entspricht. - eine „geeignete“ Terminalbeschreibung gibt Auskunft darüber, wie der Bildschirm gelöscht wird.
- als Nebeneffekt bewegt das Löschen des Bildschirms (gemäß Konvention) den Cursor auch in die obere linke Ecke des Bildschirms, aber
- Wenn Sie den Bildschirm von der oberen linken Ecke des Bildschirms löschen, wird auch die farbige Linie gelöscht (die Siekönntebehalten wollen)
- Wenn Sie die zweite Zeile löschen möchten, können Sie (auf den meisten Terminals) Folgendes tun:
printf '\033[2H\033[J'
oder
tput Tasse 1 0 tput ed
- aber denken Sie daran, dass, wenn Ihre Eingabeaufforderung ursprünglich nicht am oberen Bildschirmrand war, dies einfach alles verlassen würdeWaroben auf dem Bildschirm unberührt.
Der andere Teil des Problems besteht darin, dass die drei Zeilen wiederholt gedruckt werden und den Bildschirm nach unten laufen. Sie können das ändern, indem Sie den Cursor an die Stelle bewegen, an der Sie den Zähler drucken möchten, z. B.
printf '\033[4H'
oder
tput Tasse 3 0
Wenn Sie diese zusammenfügen, könnte Ihr Skript folgendermaßen aussehen (und verwenden printf
, da etwas mit Ihrer TERM
und/oder der Terminalbeschreibung nicht zu stimmen scheint):
#!/bin/bash wenn [ -t 0 ]; dann stty -echo -icanon -icrnl Zeit 0 min 0; fi #Ergebnis=`Sensoren -A` Anzahl=0 printf '\033[2H\033[J' Tastendruck='' Echo „Linie 1“ Echo „Linie 2 während [ "x$keypress" = "x" ]; mache lass "zählen++" printf '\033[4H' echo $Anzahl Schlaf 1 Tastendruck="`cat -v`" Erledigt wenn [ -t 0 ]; dann stty sane; fi Ausfahrt 0
Weiterführende Literatur: