清除Linux终端仿真器中的最后两行(和更多行)打印的行

我曾经看到过一个控制台应用程序,该程序可视化具有多个进度条的多个下载进度,每个进度条都在各自的行上。我很好奇该怎么做,但只找到了部分解决方案。他们来了:

一个进度条很容易

很容易用“回车”清除一行,从而可视化一个进度条,例如在本问题中讨论的那样。易于使用,也存在许多帮助程序库。

“使用ncurses”

每个人都说“使用ncurses”。但是据我所知,每个ncurses程序都必须以initscr()调用开始,这确实清除了整个屏幕。您的提示消失了,您的终端历史也消失了。这不是我想要的。

使用ncurses中的terminfo

使用scedrc从功能terminfo,因为这ilustrates bash脚本(脚本取自这个问题):

这有效,但仅在中有效xterm。我的urxvt字词忽略了它,例如terminator

那么还有其他选择吗?


慕森卡
浏览 306回答 1
1回答

跃然一笑

ANSI转义序列是答案。这是对我有用的C代码。最重要的是第19行,它显示了擦除最后两行的ANSI序列(行数是任意的,在序列中有说明):#include <stdio.h>#include <unistd.h>void progressBar(int done, int total) {&nbsp; &nbsp; int i;&nbsp; &nbsp; printf("[");&nbsp; &nbsp; for (i=0; i<total; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; printf((done < i) ? " " : "=");&nbsp; &nbsp; }&nbsp; &nbsp; printf("]\n");}int main() {&nbsp; &nbsp; int i;&nbsp; &nbsp; for (i=0; i<5; ++i) {&nbsp; &nbsp; &nbsp; &nbsp; progressBar(i, 4);&nbsp; &nbsp; &nbsp; &nbsp; progressBar(2*i, 8);&nbsp; &nbsp; &nbsp; &nbsp; if (i != 4) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; printf("\033[2A");&nbsp;&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sleep(1);&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return 0;}
打开App,查看更多内容
随时随地看视频慕课网APP