$ program [arguments...] 2>&1 | tee outfile
2>&1
stderrとstdoutストリームをダンプします。
tee outfile
取得したストリームを取得して、画面とファイル「outfile」に書き込みます。
これはおそらくほとんどの人が探しているものです。考えられる状況は、一部のプログラムまたはスクリプトが長時間懸命に働いており、大量の出力を生成していることです。ユーザーは定期的に進行状況を確認したいが、出力をファイルに書き込むことも望んでいる。
問題(特にstdoutとstderrストリームを混合する場合)は、プログラムによってフラッシュされるストリームに依存していることです。たとえば、stdoutへのすべての書き込みがフラッシュされないが、stderrへのすべての書き込みがフラッシュされる場合、それらは出力ファイルと画面上で時系列順ではなくなります。
また、プログラムが進行状況を報告するために数分ごとに1行または2行しか出力しない場合も問題があります。このような場合、プログラムによって出力がフラッシュされなかった場合、何時間もパイプを介してプッシュされないため、ユーザーは何時間も画面に出力を見ることはありません。
更新:パッケージのunbuffer
一部であるプログラムはexpect
、バッファリングの問題を解決します。これにより、stdoutとstderrはすぐに画面とファイルに書き込み、結合してにリダイレクトされたときに同期を保ちますtee
。例えば:
$ unbuffer program [arguments...] 2>&1 | tee outfile