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. ただ標準出力
  3. ただ標準エラー出力

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

$ { 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は常に同じで正しい順序です。ただし、これは保証と同じではありません。

ベストアンサー1

おすすめ記事