在Shell脚本中如何禁止Tee命令输出进度条?

6

我正在尝试使用tee记录整个脚本。脚本的一部分涉及下载文件,其中包含一个进度条以跟踪下载百分比。但是,我注意到在使用tee记录整个脚本后,终端上不再显示进度条。

是否有解决方法可以让进度条再次显示在终端上?


2
大多数软件在输出到管道而不是TTY时会关闭交互式功能(例如进度条)。这通常是一件好事 - 如果您重新打开TTY并且进度条实现有点花哨,您会发现记录的文件几乎无法理解。那么...您确定要这样做吗? - Charles Duffy
如果您确定,可以查看 EmPTY:http://empty.sourceforge.net/ - Charles Duffy
据我回忆,Expect还附带了一个类似的模拟TTY的工具。 - Charles Duffy
谢谢您的建议。有没有办法在终端上同时开启交互式功能,并在管道到文件时关闭(或类似效果)?这将是最理想的,因为我不太喜欢下载工具来解决这个问题。 - user2554585
只有软件明确编写允许此操作,而我很少见到有这样的软件。 - Charles Duffy
2个回答

5
一般来说,写得好的程序会在写入FIFO(或更一般地,没有关联TTY的FD)时抑制诸如进度条之类的交互式内容,以使它们的日志更易于阅读或解析,这就是为什么将其管道传输到tee会产生此效果的原因。(使用stderr而不是stdout作为进度条的程序可能更具有抵抗力,在stderr为非TTY显示时禁用该栏)。
如果您想伪造拥有TTY,可以使用EmPTY等工具。然而,这将意味着所有与进度条相关的杂乱内容都将出现在日志文件中,这可能会使其变得庞大且难以阅读或解析。
不幸的是,只有当您运行的软件明确允许这样做时(包括stderr的非栏内容写入文件),才能同时实现这两种方式(栏到TTY,非栏内容到文件),这很少被实现。

2
有时候,您仍然想要查看进度条。例如:如果您的程序正在使用tee,但实际上在交互式shell上运行。

为了实现这一点,请使用script而不是tee

script -c 'yourcommand' <some_log_file>

这样,您就可以将输出捕获到文件中,并且还可以看到进度条(例如docker正在拉取镜像时的当前进度)。
文档:https://www.man7.org/linux/man-pages/man1/script.1.html 我是这样发现的: https://forum.restic.net/t/how-to-get-verbose-progress-updates-but-also-log-with-tee/2825/2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接