54

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

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

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

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

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

4

3 回答 3

78

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

$ tput smcup

并返回:

$ tput rmcup

这些命令只是为您的终端输出适当的转义序列。如果它是 XTERM,它们将等同于(更知名但不太优雅或便携):

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

和:

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

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

于 2012-06-13T22:25:52.470 回答
9

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

一些背景在 xterm 常见问题解答中 为什么运行 vi 时屏幕不清晰?

于 2015-02-05T00:56:58.717 回答
3

对于 C 控制台应用程序:

诅咒

维基百科:

ncurses(新curses)是一个提供API的编程库,允许程序员以独立于终端的方式编写基于文本的用户界面。

less使用这个库。

一个 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;
}
于 2014-11-02T08:12:58.533 回答