stdoutとstderrをマージし、それぞれ個別にコピーを作成します。

stdoutとstderrをマージし、それぞれ個別にコピーを作成します。

私の目標は例を挙げて説明するのが一番です。まず、stdout と stderr の両方にサンプル出力を生成する関数を次に示します。

output() {
  printf '%s\n' 1 2
  printf '%s\n' errA errB 1>&2
  printf '%s\n' 3 4
}

これを単独で実行すると、両方のストリームが実行順にターミナルに出力されます。

$ output
1
2
errA
errB
3
4

この関数は、ログに記録したい任意のスクリプトの出力 (stdout と stderr) を表す単なるプレースホルダーです。具体的には、次の 3 つの異なるログを作成します。

  1. stdout と stderr の実行順の出力の組み合わせ (つまり、上記の出力)。
  2. stdout出力のみ
  3. stderr出力のみ

私が思いついた最も近い解決策は次のとおりです。

$ { output > >(tee out) 2> >(tee err >&2); } > both 2>&1
$ ls
both  err  out
$ cat both
errA
errB
1
2
3
4
$ cat out
1
2
3
4
$ cat err
errA
errB

ご覧のとおり、outおよびerrファイルは希望どおりですが、結合されたファイルでbothは実行順序が維持されません。

必要な 3 つのログ ファイルを同時に作成する方法はありますか?

追加の質問ですが、関数を単独で実行する場合、実行順序の出力は実際に保証されますかoutput? 何度も実行してみましたが、ターミナルの混合 stdout と stderr は常に同じで、正しい順序になっています。ただし、これは保証と同じではありません。

関連情報