在 bash 脚本中使用"alternate screen"



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

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

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

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

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

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

$ tput smcup

并返回:

$ tput rmcup

这些命令仅输出终端的相应转义序列。如果是XTERM,它们将等同于(更知名但不太优雅或可移植):

$ echo -e "e[?1049h"

和:

$ echo -e "e[?1049l"

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

使用

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

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

对于 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;
}

要构建:

$ gcc hello-world-ncurses.c -lncurses

相关内容

  • 没有找到相关文章

最新更新