我正在尝试编写一个简单的脚本,该脚本采用标准输出和标准错误并将单词STDERR:
放在标准错误的每一行的开头。为了进行测试,我有一个简单的脚本,它在标准输出和标准错误之间交替输出几行:
#!/usr/bin/perl
print "OUT 1\n";
print STDERR "ERR 1\n";
print "OUT 2\n";
print STDERR "ERR 2\n";
当我运行它时:
lorkenpeist$ ./testscript.pl
OUT 1
ERR 1
OUT 2
ERR 2
这是我stderr.awk
要添加的脚本STDERR:
#!/bin/awk -f
{print "STDERR: " $0}
如果我运行./testscript.pl | ./stderr.awk
(这显然是错误的,因为我正在输出标准而不是标准错误):
lorkenpeist$ ./testscript.pl | ./stderr.awk
ERR 1
ERR 2
STDERR: OUT 1
STDERR: OUT 2
我看到标准错误立即输出,而标准输出由于管道而延迟。不保留打印语句的原始顺序。
我还可以将标准错误重定向到标准输出:
lorkenpeist$ ./testscript.pl 2>&1 | ./stderr.awk
STDERR: ERR 1
STDERR: ERR 2
STDERR: OUT 1
STDERR: OUT 2
不仅所有内容都由stderr.awk
标准 err 处理,而且打印语句的顺序也没有被保留。有没有办法只发送标准 err 到stderr.awk
,并保留打印语句的顺序?我真正想看到的是:
OUT 1
STDERR: ERR 1
OUT 2
STDERR: ERR 2
我开始怀疑 IO 重定向根本不是答案,但我不知所措。
编辑: 鉴于标准输出是缓冲的,标准错误不是,看起来我无法完全控制终端上打印语句出现的顺序。话虽如此,我更愿意至少在一定程度上保留订单,而不是在任何标准输出之前打印所有标准错误。或者,有没有办法使标准输出和/或管道无缓冲?