在bash脚本中使用“备用屏幕”

时间:2012-06-13 21:57:52

标签: linux bash terminal terminfo

备用屏幕被许多“用户交互”终端应用程序使用,如vim,htop,screen,alsamixer,less,......它就像终端内容的不同缓冲区,应用程序退出时消失,因此整个终端恢复,看起来应用程序没有输出任何内容。

我想在我自己的shell(bash)脚本中实现完全相同的东西,除了它不必是那么可移植。我坚持只使用linux和基于xterm的终端模拟器;但是如果可能的话,解决方案应该使用tput之类的东西。但是,我不想使用某种外部脚本语言(甚至是C语言)。

虽然我不想使用C(因为它应该是尽可能少的依赖关系的bash脚本),但我看了一下less的源代码。它似乎使用terminfo作为数据库,并在其初始化中查找“ti”终端功能。删除行时,它不使用备用的sceen,所以我假设我找到了负责的代码行。

但是,我在man terminfo找不到这样的功能。但也许我在错误的道路上寻找解决方案。也许terminfo / tput不是我的朋友。

那么(如何)我可以在bash脚本中使用备用屏幕?有人知道一个简单的应用程序,我可以在其中找到源代码提示吗? (C应用程序或bash脚本或其他......)

3 个答案:

答案 0 :(得分:49)

您可以使用以下命令切换到备用屏幕:

$ tput smcup

回到:

$ tput rmcup

这些命令只输出终端的相应转义序列。如果它是XTERM,它们将等同于(更为人所知但不那么优雅或便携):

$ echo -e "\e[?1049h"

$ echo -e "\e[?1049l"

有关更多终端控制命令,请参阅man 5 terminfo

答案 1 :(得分:5)

使用smcup / rmcup,但仅用于副作用:在正常/备用屏幕之间切换的转义序列通常嵌入在那些terminfo功能中 - 并非总是如此。

xterm faq Why doesn't the screen clear when running vi?

中有一些背景知识

答案 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;
}