2013-10-08 31 views
0

对于长时间运行的任务,我想要显示进度。我目前在printf命令的开头使用\33[2K\r,最后没有换行符或任何内容。我不喜欢这种方法的是,打印到相同终端(stderr,例如,没有重定向)的消息出现在行尾,而不是新行。C printf term progress display with error messages on next line

如果我将\r放在进度显示的末尾,其他消息(全部用\n终止)将在视觉上覆盖进度显示,并且如果它们比这短,则与剩余物混合。另外,我不希望必须/不能适应打印其他消息的行,因为其中一些消息来自外部库。

我没有问题,如果我的进度显示将继续在新的行后,但我想有其他消息出现在自己的行(主要是错误消息,但我试图正常恢复尽可能多,所以这个过程将持续大部分时间)

任何想法?

我不需要可移植性,如果它只在Linux bash上运行,那就很好。

UPD:关于什么是我所要求的更好的可视化:

目前,我可以这样做:

status1ERR 
status2 

或者

ERRtus1 
status2 

或者

status1 
status2 <--- ERR is overriden by status2 here 

但我想要的是:

status1 
ERR 
status2 

或者

ERR  
status2 

在最后一个例子ERR覆盖一个完整的状态行 - 我知道我可以清晰的线条与上述VT100字符序列,但我不能改变一些错误信息,所以它需要与他们一起工作总是格式为error message\n

+0

打印状态行为“status,\ r \ n”。然后每个后续的状态行(没有其他正常printf发生)与“光标向上,状态,\ r \ n”。 – chux

+0

也考虑过这种情况,但是如果出现错误,我会在下一个状态下自动覆盖它:( – griffin

回答

1

哇。这是我过去的一次爆炸。

您可以使用ANSI或VT100字符序列做一些光标定位。 这将让你分开屏幕上的输出类型。 这里有一个好的起始页面:http://wiki.bash-hackers.org/scripting/terminalcodes

+0

我已经在使用VT100字符序列擦除行(这是我的问题;) ) - 所以,虽然你的答案很好,但它不回答我的问题:(让我换句话说:我将如何使用这些字符序列来完成我所要求的? – griffin

+0

在发送输出之前使用上,下,前,后向命令来定位光标。将状态和输出定位在屏幕上的不同位置,你应该很好。 – Jay

+0

是的,这就是我想要实现的,但是我会怎么做?正如你在我的例子中看到的,我已经尝试了各种可以想到的方式,但是他们并没有把我引向想要的行为。 – griffin

0

只需在错误消息的开头使用\n。这当然不起作用,如果你调用一些其他代码也会产生stderr-output。

+0

这就是问题 - 我无法控制所有的错误信息。 – griffin

+0

然后你可以自己捕获stderr,向标准输出输出'\ n',只是将它回显给原始标准错误(脏的技巧)。 – urzeit

+0

对于这样一个简单的问题听起来很麻烦 - 同样,如果两者之间的部分无论出于何种原因都可能失败,那么这就是它自己的问题。我真的无法想象有没有简单的解决方案......? – griffin