如何重定向使用'\ r'“刷新”的终端输出?

时间:2018-02-14 17:44:44

标签: python bash shell

我正在尝试编写一个包含第三方python脚本的(Bash)shell脚本,并将所有输出(错误和标准输出)捕获到日志文件中,并且每次都使用新的一批数据重新启动脚本它成功完成。我在标准的Linux发行版上做这个,但希望这个解决方案可以独立于平台。

所以这里是shell脚本的简化版本,省略了除日志记录之外的所有内容:

#!/bin/bash
/home/me/script.py &>> /home/me/logfile

问题是第三方python脚本的输出主要是在一行上,通过使用回车符(“\ r”)定期刷新(〜每90秒)。这是我的意思是输出类型的一个例子:

#!/usr/bin/env python3
import time

tracker = 1

print("This line is captured in the logfile because it ends with a newline")

while tracker < 5:
    print(" This output isn't captured in the log file. Tracker = " + str(tracker),end="\r")
    tracker += 1
    time.sleep(1)

print("This line does get captured. Script is done.         ")

如何在每次刷新时编写一个简单的shell脚本来捕获输出,或者至少定期捕获当前输出,如果我在终端中运行脚本时它将显示在屏幕上?

显然我可以尝试修改python脚本来改变它的输出行为,但我使用的实际脚本非常复杂,我认为我的能力超出了我的能力。

1 个答案:

答案 0 :(得分:0)

当输出不是tty时,程序应该禁用此行为。

输出已完全捕获,只是当您cat文件时,您会立即看到所有更新。在文本编辑器中打开它,亲眼看看。

要使文件更易于使用,您只需使用换行符替换回车符:

/home/me/script.py | tr '\r' '\n'

如果进程通常立即生成输出,但不使用此命令,则可以禁用Python的输出缓冲。