1

標準出力と標準エラーを取得し、標準エラー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

パイプのために標準出力が遅れているのに対し、標準エラーはすぐに出力されることがわかります。print ステートメントの元の順序は保持されません。

標準エラーを標準出力にリダイレクトすることもできます。

lorkenpeist$ ./testscript.pl 2>&1 | ./stderr.awk
STDERR: ERR 1
STDERR: ERR 2
STDERR: OUT 1
STDERR: OUT 2

stderr.awk標準の err だけでなくすべてが処理されるだけでなく、print ステートメントの順序も保持されません。標準エラーのみを に送信しstderr.awk、print ステートメントの順序を保持する方法はありますか? 私が本当に見たいのは:

OUT 1
STDERR: ERR 1
OUT 2
STDERR: ERR 2

IO リダイレクションは単に答えではないのではないかと疑い始めていますが、代替手段が見つからないのです。

編集: 標準出力がバッファリングされ、標準エラーがバッファリングされていないことを考えると、printステートメントが端末に表示される順序を完全に制御できないようです。そうは言っても、すべての標準エラーが標準出力の前に出力されるのではなく、順序が少なくともある程度保持されていることをお勧めします。または、標準出力やパイプをバッファリングしないようにする方法はありますか?

4

2 に答える 2