可以将 stdout 和 stderr 重定向到同一个文件 mangle 行吗?

Dan*_*ete 8 shell io-redirection stdout stderr

我读过的重定向时stdoutstderr同一个文件使用2>&1stdout通常,嵌段缓冲,而stderr不是缓冲。

如果写入了很长的一行stdout,需要两次单独刷新缓冲区,是否会发生一行从stderr中间滑落?像这样的东西:

stdout:   aaaaaaaa.....really long line......aaaaaaaaaaaa<newline>

stderr:   eee<newline>

combined: aaaaaaaaaaaaaaaaeee<newline>
          aaaaaaa<newline>
Run Code Online (Sandbox Code Playgroud)

gre*_*eke 7

是的,如果行stdout足够长,这确实会发生。

#!/usr/bin/perl
use strict;
use warnings;

for (1..10) {
    print "START"; print "-" x 100000; print "END\n";
    warn "!\n";
}
Run Code Online (Sandbox Code Playgroud)

跑步:

./writer.pl > out 2>&1
Run Code Online (Sandbox Code Playgroud)

检查:out在编辑器中打开文件并!在 之间找到标准错误-,而不总是在ENDSTART

这将因操作系统、语言和系统而有所不同,但您的基本假设是正确的。通过改变标准输出线长度实验:print "-" x 100print "-" x 10000