[英]Why does less change order of output?
我正在运行一个python脚本,当以详细模式运行它时会产生某些输出。 当我将输出传递给less实用程序时,输出的顺序不同。 作为参考,该脚本几乎是以下内容:
http://svn.apache.org/repos/asf/subversion/trunk/tools/client-side/change-svn-wc-format.py
具体来说,我收到“以下字段的数据”消息,并且在运行时未将输出传递到更少的消息时,该消息最后出现。 当我将输出传递给less时,输出首先神秘地显示。
有人可以解释吗?
我已确定错误消息发送至stderr,而详细消息发送至stdout。 但是,即使我这样做:
./svnfixversion ./ 1.5 --verbose 2>&1 | less
输出与我刚离开|时的输出不同。 减。 如果将stderr重定向到stdout,是否应该少保留命令?
运行时:
./svnfixversion ./ 1.5 --verbose
其stdout
是行缓冲的, stderr
是非缓冲的。
在:
./svnfixversion ./ 1.5 --verbose 2>&1 | less
它的stdout
是完全缓冲的, stderr
是非缓冲的。
./svnfixversion
FILE* stdout
的缓冲模式使这两种情况下的输出有所不同。
如果希望第二个输出与第一个输出相同,请将stdout
缓冲模式设置为使用stdbuf
应用程序缓冲的行:
stdbuf --output=L ./svnfixversion ./ 1.5 --verbose 2>&1 | less
在现代bash
您可以替换2>&1 |
|&
更短。
实际情况是,在调用main()
之前的程序启动时, glibc
调用isatty(STDOUT_FILENO)
来确定stdout
是否已连接到终端。 如果是这样,则stdout
是行缓冲的,否则是全缓冲的。 stderr
始终是无缓冲的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.