将可执行进度条重定向到日志文件

时间:2014-05-21 09:07:39

标签: bash shell linux-kernel io-redirection

我有一个可执行文件,显示终端上的进度条。当我以明确的方式将输出重定向到文件时

以下命令嵌入在脚本文件中

usr/bin/exec >> log.txt

这是终端输出

Progress [====================================>                          ]  58%

但是log.txt看起来像这样

Progress [=>                          ]  0
Progress [====>                          ]  5
Progress [========>                          ]  10

我可以按照终端上显示的方式重定向输出。

2 个答案:

答案 0 :(得分:2)

A related answer on a different site,建议使用col命令。

要在写入文件之前禁止标准输出上的覆盖输出:

usr/bin/exec | col -b >> log.txt

要在抑制覆盖字符的同时查看文件内容:

col -b < log.txt | less

您的进度条可能通过使用回车来表示应该覆盖当前行。 col实用程序缓冲输出,以便它只能打印每个位置的最后一个字符。

答案 1 :(得分:1)

如果不确切知道您的进度条计划正在做什么,我们无法肯定地回答这个问题,但是......

这种进度条通常是通过输出当前进度更新的方式,但是然后在行的末尾放置一个ascii CR(回车符)而不用一个LF(换行) 。这会将显示光标重置为行的开头,而不会将光标向下移动到下一行,以便每个后续进度更新都会覆盖前一行。因此,如果您将其重定向到文件,则可能会在文件中包含相同的内容。

如果您要使用vi查看此类文件,您实际上会看到嵌入式CR,表示为&#34; ^ M&#34; (但请注意,LF字符只是被解释为行尾并且实际上并未显示)。如果您使用其他编辑器查看该文件,它可能会将CR字符解释为有效的行尾指示符,并将每行显示为包含或不包含LF字符的单独行。

您不会说您如何显示log.txt文件。我希望如果程序使用嵌入式CR方法,那么使用&#34; cat log.txt&#34;将显示与交互式使用中相同的输出:即每个进度更新&#34; line&#34;将覆盖前一个,最后只有最后一个可见。

输出进度条的程序也可能对它是否显示到终端设备敏感:即它可能正在调用isatty()并相应地修改其输出。

在最终的log.txt文件上运行此命令以查看实际的二进制内容可能是有益的:

od -tx1z log.txt

CR(又名^ M)将显示为&#34; 0d&#34;。 LF(aka ^ J)将显示为0a。