备用屏幕被许多“用户交互”终端应用程序使用,如vim,htop,screen,alsamixer,less,......它就像终端内容的不同缓冲区,应用程序退出时消失,因此整个终端恢复,看起来应用程序没有输出任何内容。
我想在我自己的shell(bash)脚本中实现完全相同的东西,除了它不必是那么可移植。我坚持只使用linux和基于xterm的终端模拟器;但是如果可能的话,解决方案应该使用tput
之类的东西。但是,我不想使用某种外部脚本语言(甚至是C语言)。
虽然我不想使用C(因为它应该是尽可能少的依赖关系的bash脚本),但我看了一下less的源代码。它似乎使用terminfo作为数据库,并在其初始化中查找“ti”终端功能。删除行时,它不使用备用的sceen,所以我假设我找到了负责的代码行。
但是,我在man terminfo
找不到这样的功能。但也许我在错误的道路上寻找解决方案。也许terminfo / tput不是我的朋友。
那么(如何)我可以在bash脚本中使用备用屏幕?有人知道一个简单的应用程序,我可以在其中找到源代码提示吗? (C应用程序或bash脚本或其他......)
答案 0 :(得分:49)
您可以使用以下命令切换到备用屏幕:
$ tput smcup
回到:
$ tput rmcup
这些命令只输出终端的相应转义序列。如果它是XTERM,它们将等同于(更为人所知但不那么优雅或便携):
$ echo -e "\e[?1049h"
和
$ echo -e "\e[?1049l"
有关更多终端控制命令,请参阅man 5 terminfo
。
答案 1 :(得分:5)
使用smcup / rmcup,但仅用于副作用:在正常/备用屏幕之间切换的转义序列通常嵌入在那些terminfo功能中 - 并非总是如此。
中有一些背景知识答案 2 :(得分:2)
对于C控制台应用程序:
<强> ncurses的强>
百科:
ncurses(新curses)是一个编程库,它提供了一个API,允许程序员以独立于终端的方式编写基于文本的用户界面。
less
使用此库。
来自here的hello world程序,需要在gcc中编译它,标志-lncurses是必需的。
#include <ncurses.h>
int main()
{
initscr(); /* Start curses mode */
printw("Hello World !!!"); /* Print Hello World */
refresh(); /* Print it on to the real screen */
getch(); /* Wait for user input */
endwin(); /* End curses mode */
return 0;
}