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.
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.
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.
cat
eine Datei, wäre es umgekehrte Reihenfolge?bash
Dies ist nicht möglich, dabash
nicht einmal die Bildschirmpositionen bekannt sind: Es wird nur in eine Ausgabedatei geschrieben. Sie benötigen einen Terminalemulator, der diebash
interaktive Eingabeaufforderung von kennt , um zu wissen, wann der Cursor zurückgesetzt und wann das Fenster gescrollt werden muss.Antworten:
Fügen Sie diese Zeilen hinzu zu
.bashrc
:bash
have PROMPT_COMMAND , die den Befehl enthalten, wird vor derbash
show-Eingabeaufforderung ausgeführt. Hier stellen wir die Funktion einprompt_on_top
, die tput verwendet , um den Cursor am oberen Bildschirmrand zu positionieren.bash
Sie können auch einen Befehl ausführen, bevor Sie einen Befehl ausführen. Verwenden Sie dabei trap , um das Signal zu verarbeitenDEBUG
. Hier stellen wir die Funktion einpre_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ührenBASH_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_top
Aktion außer Kraft gesetzt . In diesem Fall müssen Sie die Ausgabe an einen Pager leiten, um die gesamte Ausgabe zu lesen.quelle
cat file
wirdfile
Inhalt 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.