我有一个可以产生大量输出的脚本。脚本在该点暂停几秒钟T
.
现在我正在使用less
命令来分析脚本的输出。
所以我执行./script | less
。我让它运行足够的时间,以便脚本完成执行。
现在,我按 Pg Down 键查看 less 命令的输出。令人惊讶的是,当滚动到这一点时T
我注意到输出再次暂停了几秒钟。
该脚本不需要任何输入,并且在我开始分析 less 的输出时肯定已经完成。
有人可以解释当脚本执行完毕时, less 的输出中几秒钟的暂停是如何明显的吗?
您的脚本正在与less
via a pipe。管道是连接两个端点的内存中字节流:您的脚本和less
程序,前者将输出写入其中,后者从中读取。
由于管道是在内存中的,所以如果它们任意增大,那就不好受了。因此,默认情况下,在任何给定时刻管道内可以写入的数据(已写入,但尚未读取)都是有限的。 Linux 上默认为 64k。如果管道已满,并且您的脚本尝试写入该管道,则写入会阻塞。所以你的脚本实际上并没有工作,它在执行某个操作时在某个时刻停止了write()
call.
如何克服这个问题?调整默认值是一个糟糕的选择;相反,使用的是在读取器中分配一个缓冲区,以便它读入缓冲区,释放管道,从而让写入程序工作,但只向您显示(或处理)输出的一部分。less
有这样一个缓冲区,并且默认情况下会自动扩展它,但是,它不会在后台填充它,它只会在您读取输入时填充它。
So what would solve your problem is reading the file until the end (like you would normally press G), and then going back to the beginning (like you would normally press g). The thing is that you may specify these commands via command line like this:
./script | less +Gg
但您应该注意,您必须等到整个脚本的输出加载到内存中,因此您将无法立即查看它。less
对此还不够复杂。但如果这就是您真正需要的(浏览输出的开头,而./script
仍在计算其结束),您可能需要使用临时文件:
./script >x & less x ; rm x
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)