我曾经看到一个控制台应用程序,它可视化多个进度条的多个下载进度,每个进度条都在自己的行上。我很好奇如何做到这一点,但我发现只有部分解决方案。他们在这里:
很容易用"carriage return"清除一行,从而可视化一个进度条,如e.g. in this question所述。易于使用,也存在许多辅助库。
每个人都说“使用ncurses”。但据我所知,每个ncurses程序必须以initscr()
调用开始,这真的会清除整个屏幕。您的提示消失了,终端历史记录消失了。这不是我想要的。
使用sc
中的ed
,rc
和terminfo
功能,因为这个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
。
那么还有什么其他选择?
答案 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;
}