Belassen Sie die Bash-Eingabe in der obersten Zeile des Bildschirms


12

Ich möchte, dass die bashEingabeaufforderung am oberen Bildschirmrand angezeigt wird, damit die Ausgaben älterer Befehle nach unten und nicht nach oben verschoben werden.

Wie kann ich das erreichen?


6
Also, wenn Sie cateine Datei, wäre es umgekehrte Reihenfolge?
Chaos

Nein, aber ich möchte, dass die Ausgabestücke nach unten gedrückt werden
Tom Price,

1
bashDies ist nicht möglich, da bashnicht einmal die Bildschirmpositionen bekannt sind: Es wird nur in eine Ausgabedatei geschrieben. Sie benötigen einen Terminalemulator, der die bashinteraktive Eingabeaufforderung von kennt , um zu wissen, wann der Cursor zurückgesetzt und wann das Fenster gescrollt werden muss.
Chepner

Vielen Dank an @chepner, ich habe dieses Problem noch einmal untersucht, und Ihr Kommentar hat mich dazu gebracht, außerhalb von Bash zu schauen und den gesamten Anzeigestapel zu betrachten. Ich möchte in den textbasierten virtuellen Konsolen (dh ohne X Windows) bleiben, um Terminalemulatoren zu vermeiden, aber für meine GUI-Sitzungen werde ich das auf jeden Fall prüfen. Falls jemand auf diese Frage stößt, ich vermute, es hat mit tty zu tun, und ich suche derzeit hier nach Inspiration ... linusakesson.net/programming/tty
Tom Price

Antworten:


7

Fügen Sie diese Zeilen hinzu zu .bashrc:

prompt_on_top() {
  tput cup 0 0
  tput el
  tput el1
}

pre_cmd() {
  if [ "$BASH_COMMAND" = "$PROMPT_COMMAND" ] || [ -n "$COMP_LINE" ]; then
    return
  fi
  printf "\33[2J"
}

PROMPT_COMMAND="prompt_on_top"
trap 'pre_cmd' DEBUG

bashhave PROMPT_COMMAND , die den Befehl enthalten, wird vor der bashshow-Eingabeaufforderung ausgeführt. Hier stellen wir die Funktion ein prompt_on_top, die tput verwendet , um den Cursor am oberen Bildschirmrand zu positionieren.

bashSie können auch einen Befehl ausführen, bevor Sie einen Befehl ausführen. Verwenden Sie dabei trap , um das Signal zu verarbeiten DEBUG. Hier stellen wir die Funktion ein pre_cmd, die den alten Bildschirm löscht und nichts unternimmt, wenn wir den Vorgang abgeschlossen haben ( COMP_LINE ist nicht leer) oder den Befehl ausführen BASH_PROMPT.


Bei diesem Ansatz gibt es eine Einschränkung: Wenn die Befehlsausgabe zu lang ist und nicht in einen Bildschirm passt, wird die Ausgabe durch eine prompt_on_topAktion außer Kraft gesetzt . In diesem Fall müssen Sie die Ausgabe an einen Pager leiten, um die gesamte Ausgabe zu lesen.


1
Vielen Dank für Ihre gut erläuterte Antwort. Ich kann viel nachlesen und lernen. Ich habe Ihr Skript getestet und derzeit löscht es die alte Ausgabe vom Bildschirm zwischen den Befehlen. Ich möchte die vorherigen Ausgaben auf dem Bildschirm unterhalb der Eingabeaufforderung belassen und sie so haben, dass neue Ausgaben zwischen der Eingabeaufforderung und der alten Ausgabe eingefügt werden, wodurch die alte Ausgabe auf dem Bildschirm nach unten verschoben wird.
Tom Price

Für diejenigen, die über eine Websuche hierher kommen, bietet dieser Code " github.com/swirepe/alwaysontop " auch eine Reihe weiterer Funktionen. Beantwortet die ursprüngliche Frage jedoch nicht: Ältere Befehlsausgaben werden wie bei cuonglms Code gelöscht.
WillC

Ein weiterer Nachteil dieser Lösung ist, dass Sie keine Rückmeldung darüber haben, welcher Befehl zuletzt ausgeführt wurde. Das heißt, es cat filewird fileInhalt angezeigt, aber Sie erhalten keine sofortige Rückmeldung über den exakten ausgeführten Befehl. Im Idealfall folgt auf die Eingabeaufforderung eine nicht erweiterte + erweiterte Version des ausgeführten Befehls, gefolgt von der Standardausgabe.
Psychosklave
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.