【问题标题】:Using the "alternate screen" in a bash script在 bash 脚本中使用“备用屏幕”
【发布时间】:2012-06-16 22:40:46
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: linux bash terminal terminfo


    【解决方案1】:

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

    $ tput smcup
    

    然后返回:

    $ tput rmcup
    

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

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

    还有:

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

    更多终端控制命令见man 5 terminfo

    【讨论】:

    • @leemes - 实际上,重新阅读您的问题,您谈到了ti 终端功能...但如果您仔细查看man terminfo,它只是@987654329 的术语名称@!!!
    • 大声笑?我可以发誓我搜索了ti(如问题中所述)但没有找到该功能!该死的... -.-
    • 在我的系统上,如果我不指定部分,我会得到terminfo(3ncurses),所以我使用man 5 terminfo 来获取相应的文档。 (发布给那些可能不知道的人)
    • @blalor 出于完全相同的原因,我来过这里几次。我需要弄清楚是否可以编写一个小函数来在退出 SSH/屏幕时“捕获”并运行 rmcup 以回到正确的模式。不利的一面是,当它切换时,由于终端“重置”到正常屏幕与备用屏幕,我丢失了在会话退出之前存在于缓冲区中的 SSH/屏幕输出。
    【解决方案2】:

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

    xterm 常见问题解答中有一些背景Why doesn't the screen clear when running vi?

    【讨论】:

      【解决方案3】:

      对于 C 控制台应用程序:

      诅咒

      维基百科:

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

      【讨论】:

      • 但是,我不想使用一些外部脚本语言(甚至是 C 之类的语言)。
      猜你喜欢
      • 1970-01-01
      • 2011-11-21
      • 1970-01-01
      • 1970-01-01
      • 2014-02-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多