必要なコマンドの名前は tee
です :
foo | tee output.file
たとえば、stdout のみに関心がある場合:
ls -a | tee output.file
stderr を含めたい場合は、次のようにします:
program [arguments...] 2>&1 | tee outfile
2>&1
チャネル 2 (stderr/標準エラー) をチャネル 1 (stdout/標準出力) にリダイレクトし、両方が stdout として書き込まれるようにします。 tee
の時点で、指定された出力ファイルにも送信されます。 コマンド。
さらに、追加したい場合 ログ ファイルには、tee -a
を使用します として:
program [arguments...] 2>&1 | tee -a outfile
$ 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
私にとって有効な別の方法は、
<command> |& tee <outputFile>
gnu bash マニュアルに示されている
例:
ls |& tee files.txt
<ブロック引用> 「|&」が使用されている場合、command1 の標準エラー 、その標準出力に加えて 、パイプを介して command2 の標準入力に接続されます。 2>&1 の短縮形です |。この標準エラーの標準出力への暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。
詳細については、リダイレクトを参照してください