Zeigen Sie die Ausgabe auf einem anderen „Bildschirm“ an und kehren Sie zum Normalzustand zurück, wenn Sie fertig sind

7

Ich möchte ein ähnliches Verhalten wie less vim nanoetc. verwendet.

Ist das mit Bash möglich?

Tyilo
quelle

Antworten:

8

Wenn Ihr Terminal - Emulator unterstützt, können Sie dies mit dem gleichen Mechanismus durch verwendet verwendet less, vimet al, nämlich die tiund teTERMCAP Fähigkeiten ( smcupund rmcupin dem moderneren term). Diese wechseln vom primären zum sekundären Bildschirm bzw. zurück zum primären.

Wenn Ihr System über den tputBefehl verfügt, können Sie Folgendes verwenden:

tput smcup # switch to secondary screen
...
tput rmcup # switch back to primary screen

Andernfalls gilt für xtermund wahrscheinlich für die meisten anderen Terminalemulatoren Folgendes:

printf '\e[7\e[?47h'

sollte zum sekundären Bildschirm wechseln, und dies:

printf '\e[2J\e[?47l\e8'

sollte zurück zum primären wechseln (und den Cursor wieder dorthin setzen, wo er war).

tcsh verfügt über einen integrierten echotcBefehl, sodass Sie Folgendes tun können:

tcsh -c 'echotc ti'
...
tcsh -c 'echotc te'

(oder einfach echotcdirekt verwenden, wenn Sie gerade tcsh verwenden).

Keith Thompson
quelle
1
tput smcupund tput rmcupscheint den Job zu machen.
Tyilo
2
Wenn Sie die Codes hart codieren möchten, anstatt sie zu verwenden tput, versuchen Sie es mit der modernen 1049Version 47. Dies wurde von Xterm eingeführt und wird von einigen anderen Terminalemulatoren unterstützt. Der alternative Bildschirm wird beim Umschalten gelöscht und der Inhalt bleibt beim Zurückschalten erhalten (sodass Sie den Inhalt nach dem Beenden des Vollbildprogramms anzeigen / kopieren können).
Chris Seite
2
Wenn Ihre Skriptsprache dies unterstützt, können Sie aus Gründen der Robustheit auch dann zur Hauptanzeige wechseln, wenn Ihr Programm vorzeitig beendet wird. In einem Bash-Skript können Sie beispielsweise einen Signalhandler mit installieren trap 'tput rmcup' EXIT.
Chris Seite
3

Dies wird als „zweiter Bildschirm“ genannt (und wie die t o p google Treffer zeigen, Sie sind insofern ungewöhnlich mögen diese Funktion). Einige Terminals unterstützen zwei Bildschirmpuffer, von denen einer von Vollbildanwendungen und der andere von zeilenorientierten Anwendungen verwendet wird. Bash weiß nichts über sie. Wenn ein Befehl einfach eine Ausgabe an das Terminal ausgibt, können Sie mithilfe von Terminalsteuerungssequenzen zum sekundären Bildschirm und zurück wechseln (diese Befehle sind in xterm ctlseqs dokumentiert ).

printf '\e[?47h'; mycommand; printf '\e[?47l'

Beachten Sie, dass es für den alternativen Bildschirm keinen Bildlauf gibt, sodass nur der letzte Bildschirm mit der Ausgabe angezeigt wird. Wenn das ein Problem ist, machen Sie einfach das Einfache:

mycommand | less 

Es gibt nur zwei Bildschirmpuffer. Wenn Sie mehr möchten, verwenden Sie einen geeigneten Bildschirmmultiplexer wie Screen oder Tmux .

Gilles 'SO - hör auf böse zu sein'
quelle
Ich bin überrascht zu sehen, wie unbeliebt es ist. Ich mag es wirklich, einen Editor ausführen zu können und trotzdem meinen Befehlsverlauf zu sehen, wenn ich fertig bin.
Keith Thompson
Danach bleiben in meiner Amtszeit leere Zeilen übrig: cl.ly/Cz4N cl.ly/Cznp
Tyilo
0

Bash weiß nichts über Bildschirme (es kann tatsächlich laufen, ohne gesehen zu werden). Sie können jedoch sowohl die Standardausgabe als auch den Standardfehler in eine beliebige Datei oder Pipe umleiten.

Choroba
quelle
0

Keine der aktuellen Antworten schien auf meinem Computer zu funktionieren, aber ich erfuhr von dem Befehl namens screen, der den Trick für mich zu tun scheint.

Tyilo
quelle
Nicht ganz das Gleiche, aber wenn es Ihren Zwecken entspricht ... Welchen Terminalemulator verwenden Sie? Ich denke, es xtermgibt eine Option, um diese Kontrollsequenzen (zu aktivieren); andere wahrscheinlich auch.
Keith Thompson
Ich benutze iTerm 2 für OS X.
Tyilo