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

时间:2018-05-06 15:04:14

标签: linux terminal console-application

我曾经看到一个控制台应用程序,它可视化多个进度条的多个下载进度,每个进度条都在自己的行上。我很好奇如何做到这一点,但我发现只有部分解决方案。他们在这里:

一个进度条很容易

很容易用"carriage return"清除一行,从而可视化一个进度条,如e.g. in this question所述。易于使用,也存在许多辅助库。

“使用ncurses”

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

使用ncurses中的terminfo

使用sc中的edrcterminfo功能,因为这个Bash脚本(脚本来自this question):

tput sc; while [ true ]; do tput ed; echo -e "$SECONDS\n$SECONDS\n$SECONDS"; sleep 1; tput rc; done

这样可行,但仅限于xterm。我的urxvt术语忽略了它,与例如terminator

那么还有什么其他选择?

1 个答案:

答案 0 :(得分:0)

正如@Marged用户正确指出的那样,ANSI escape sequences就是答案。

这是适用于我的C代码。至关重要的是第19行打印ANSI序列,删除最后两行(行数是任意的,在序列中说明):

#include <stdio.h>
#include <unistd.h>

void progressBar(int done, int total) {
    int i;
    printf("[");
    for (i=0; i<total; ++i) {
        printf((done < i) ? " " : "=");
    }
    printf("]\n");
}

int main() {
    int i;
    for (i=0; i<5; ++i) {
        progressBar(i, 4);
        progressBar(2*i, 8);
        if (i != 4) {
            printf("\033[2A");  // This erases last two lines!
            sleep(1);
        }
    }
    return 0;
}