私の目標は例を挙げて説明するのが一番です。まず、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 つの異なるログを作成します。
- stdout と stderr の実行順の出力の組み合わせ (つまり、上記の出力)。
- stdout出力のみ
- 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 は常に同じで、正しい順序になっています。ただし、これは保証と同じではありません。