备用屏幕被许多"用户交互"终端应用程序使用,如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