use*_*064 6 bash shell linux-kernel io-redirection
我有一个可执行文件,它在终端上显示进度条。当我以下面的方式将输出重定向到文件时
以下命令嵌入到脚本文件中
usr/bin/exec >> log.txt
Run Code Online (Sandbox Code Playgroud)
这是终端输出
Progress [====================================> ] 58%
Run Code Online (Sandbox Code Playgroud)
但 log.txt 看起来像这样
Progress [=> ] 0
Progress [====> ] 5
Progress [========> ] 10
Run Code Online (Sandbox Code Playgroud)
我可以按照终端上显示的方式重定向输出吗?
如果不确切知道进度条程序正在做什么,就无法确定地回答这个问题,但是......
这种进度条的典型实现方式是输出当前进度更新,然后在行尾放置一个 ascii CR(回车),而不使用LF(换行)。这会将显示光标重置到行首,而不将光标向下移动到下一行,以便每个后续进度更新都会覆盖前一个进度。因此,如果您将其重定向到一个文件,那么该文件中可能会有相同的内容。
如果您使用 vi 查看此类文件,您实际上会看到嵌入的 CR,表示为“^M”(但请注意,LF 字符仅被解释为行尾,实际上不会显示)。如果您使用其他编辑器查看该文件,它可能会将 CR 字符解释为有效的行结束指示符,并将每一行显示为带有或不带有 LF 字符的单独行。
您没有说明如何显示 log.txt 文件。我希望如果程序使用嵌入式 CR 方法,那么使用“cat log.txt”将显示与交互式使用相同的输出:也就是说,每个进度更新“行”都会覆盖前一个,并且仅覆盖最后一个一个将在最后可见。
输出进度条的程序也可能对其是否显示到终端设备敏感:即它可能正在调用 isatty() 并相应地修改其输出。
在最终的 log.txt 文件上运行此命令以查看实际的二进制内容可能会有所帮助:
od -tx1z log.txt
Run Code Online (Sandbox Code Playgroud)
CR(又名 ^M)将显示为“0d”。LF(又名 ^J)将显示为 0a。