`less`命令显示输出所用的时间

时间:2011-05-08 09:57:46

标签: linux bash time

我有一个产生大量输出的脚本。该脚本在T点暂停几秒钟。

现在我使用less命令来分析脚本的输出。 所以我执行./script | less。我让它运行足够长的时间,以便脚本完成执行。

现在我按Pg Down键输出less命令的输出。令人惊讶的是,当我在输出的T点滚动时,我会再次注意到暂停几秒钟。

脚本不期望任何输入,并且在我开始分析较少的输出时肯定会完成。

有人可以解释当脚本执行完毕后,输出中的几秒钟暂停是多少?

5 个答案:

答案 0 :(得分:8)

您的脚本通过管道less进行通信。 Pipe是一个连接两个端点的内存中的字节流:你的脚本和less程序,前者写入输出,后者从中读取。

由于管道在记忆中,如果它们随意变大,那将是不愉快的。因此,默认情况下,在任何给定时刻,管道内部(写入但尚未读取)的数据都有限制。默认情况下,它在Linux上为64k。如果管道已满,并且您的脚本尝试向其写入,则写入块。所以你的脚本实际上没有工作,它在进行write()调用时会停止。

如何克服这个?调整默认值是一个糟糕的选择;使用的是在读取器中分配一个缓冲区,以便它读入缓冲区,释放管道,从而让编写程序工作,但只显示(或处理)输出的一部分。 less有一个这样的缓冲区,默认情况下会自动展开它,但是它不会在后台填充它,它只会在你读取输入时填充它。

那么解决问题的方法是将文件读到最后(就像你通常按 G ),然后回到开头(就像你通常按 g < / KBD>)。问题是您可以通过命令行指定这些命令:

./script | less +Gg

但是,您应该注意,您必须等到整个脚本的输出加载到内存中,因此您将无法立即查看它。 less对此并不够复杂。但如果这是你真正需要的(在./script仍在计算结束时浏览输出的开头),你可能想要使用临时文件:

 ./script >x & less x ; rm x

答案 1 :(得分:2)

管道在操作系统级别已满,因此script会阻塞,直到less消耗其中一部分。

答案 2 :(得分:2)

流量控制。您的脚本实际上是暂停的,而较少的是分页。

如果要确保在交互式使用较少之前完成命令,请调用less less +G并将其读取到输入的末尾,然后可以通过键入{{1}返回到开头变少了。

答案 3 :(得分:2)

对于一些背景信息,亚历山大·桑德勒(Alexander Sandler)也发表了一篇很好的文章,名为“如何更少地处理其输入”!

http://www.alexonlinux.com/how-less-processes-its-input

答案 4 :(得分:0)

Can I externally enforce line buffering on the script? 
Is there an off the shelf pseudo tty utility I could use? 

您可以尝试使用script命令打开行缓冲输出模式。

script -q /dev/null ./script | less      # FreeBSD, Mac OS X
script -c "./script" /dev/null | less    # Linux

有关此方面的更多替代方案,请参阅:Turn off buffering in pipe