在Linux上清除终端输出

37 浏览
0 Comments

在Linux上清除终端输出

我正在编写一个命令行程序,它会有一个类似于wget的状态栏。

我面临的主要问题是:如何删除我已经发送到stdout/stderr的内容?

我有一个想法:使用退格字符'\b'来擦除我发送的输出。这是最好的方法吗?它是唯一的方法吗?有更好的方法吗?

附:我不想使用类似ncurses的东西。请使用普通的C语言。

谢谢


编辑:

我也可以向上和/或向下移动吗?例如:我有10行输出,我想将第3行从Doing ABC更改为ABC: Done。我该如何做到这一点?

此外,有人可以发布更多关于VT102字符是什么的详细信息吗?它有什么功能?如果有的话,请发布好的链接。

谢谢

0
0 Comments

在Linux上擦除终端输出的原因可能是使用'\r'将光标返回到行的开头并重新编写整行。另外,可以寻找VT102控制序列,这些序列是以ESC开头的字符序列,用于控制终端。以下是解决该问题的方法:

1. 使用'\r'和适当的字符替换要擦除的输出。这将使光标回到行的开头并覆盖之前的输出。

echo -ne "Replacing output with new text\r"

2. 使用VT102控制序列来擦除终端输出。例如,使用ESC [K序列来清除光标位置后的所有字符。

echo -ne "\033[K"

通过使用这些方法,可以在Linux终端上擦除输出并重新写入新的内容。

0
0 Comments

问题的出现原因是:在Linux终端中,使用基本的格式控制字符(退格、制表符、换行和回车)可以控制输出的格式,但如果需要更多的控制,则需要使用ANSI X3.64 / ISO/IEC 6429 / ECMA-48转义序列,至少VT100子集被大多数现代终端和仿真器所识别。使用ncurses的优点是它可以查找您特定终端的功能,因此即使您的终端使用不同的转义序列集,它也可以正常工作。

解决方法是:使用ncurses库来控制终端输出。ncurses是一个用于控制终端屏幕的库,它可以通过查询终端的能力来确定使用哪种转义序列。这意味着无论终端使用的是哪种转义序列集,ncurses都可以正确地控制终端输出。使用ncurses库可以实现擦除终端输出的功能,具体实现方法如下:

#include 
int main() {
    initscr();  // 初始化ncurses
    printw("Hello, world!");  // 输出文本
    refresh();  // 刷新屏幕
    getch();  // 等待用户输入
    erase();  // 擦除屏幕上的输出
    refresh();  // 刷新屏幕
    getch();  // 等待用户输入
    endwin();  // 结束ncurses
    return 0;
}

上述代码使用ncurses库来擦除终端上的输出。首先,通过调用`initscr()`函数来初始化ncurses库。然后使用`printw()`函数来输出文本到终端上。接着调用`refresh()`函数来刷新屏幕,显示输出的文本。然后调用`getch()`函数来等待用户输入。接下来,调用`erase()`函数来擦除屏幕上的输出。最后,再次调用`refresh()`函数来刷新屏幕,清空输出。最后调用`endwin()`函数来结束ncurses库的使用。

使用上述方法,可以在Linux终端上擦除输出的内容。无论终端使用的是哪种转义序列集,都可以正常工作。

0
0 Comments

擦除Linux终端输出的问题出现的原因是,标准输出(stdout)是一个没有固有显示特性的字节流,显示特性取决于目标设备,可以是普通的VT100风格终端、硬拷贝终端、纸张进纸打印机、绘图仪等等。

解决这个问题的最佳方法是使用类似于ncurses的库,而不是尝试使用VT100转义码来编写自己的显示管理代码,即使是对于相对简单的任务也是如此。我知道你想坚持使用“纯粹的C”,但是这个任务超出了“纯粹的C”的范围。

你如何知道输出的终端理解vt100代码?同意使用curses(3)(或其变体)库。对于像这样的任务,这相当简单。

0