STDOUT
出力を生成する複数のプロセスがあり、STDERR
番号付きのファイル記述子にリダイレクトされ、すべての出力を単一のファイルに収集しようとしています。
素直に頑張った
[input processes] | cat <3 <4 <5 2>&1 >[output file]
しかし、もちろんこれはうまくいきません。なぜなら、それはSTDIN
後続のパイプから読み取る前にそのパイプが閉じるのを待つので、他のパイプのバッファがいっぱいになると私のプロセスが中断されるからです。
どんな提案がありますか?
答え1
出力を1つにまとめるのは実際には二重性ではありませんtee
。tee
入力のコピーを複数作成しますが、出力の照合にはデータのマージは含まれません。
出力ソースを結合するには、すべて同じファイル記述子にリダイレクトするだけです。一般に、ソースインターリーブはやや予測できないが、パイプへの書き込みは十分に小さい。原子性保証。 (読書側で境界を識別できることは別のことです。.)
{ data_source_1 &
data_source_2 &
wait; } >merged_output
複数のファイル記述子から入力を受け取り、それらを結合するには、各ファイル記述子を渡します。
{ cat <&3 & cat <&4 & wait; } >merged_ouput
ただし、通常、すべてのファイル記述子を同じ宛先にリダイレクトできます。
… 3>merged_ouput 4>&3
答え2
STDERRとSTDOUTは、各プロセスのSTDOUTに追加する必要があります。
例:
processA 2>&1 | processB | processC
STDOUT と STDERR は、PIPE を介して processB の STDIN にリダイレクトされます。ただし、processC は ProcessB の STDOUT を STDIN にのみインポートします。
したがって、processBのSTDOUTとSTDERRがprocessCのSTDINとして必要な場合は、次のようにします。
processA 2>&1 | processB 2>&1 | processC
実際にパイプを使用したくないが、すべてのタイプの出力を単一のファイルにリダイレクトしたい場合は、次のことができます。
(processA; processB) >./just_STDOUT.txt
(processA 2>&1; processB 2>&1) >./STDOUT_AND_STDERR.txt