GNU/Linux >> Linux の 問題 >  >> Linux

出力をファイルと標準出力にリダイレクトする方法

必要なコマンドの名前は 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 行しか出力しない場合も問題です。このような場合、出力がプログラムによってフラッシュされない場合、何時間もパイプを介してプッシュされないため、ユーザーは何時間も出力を画面に表示することさえできません。

更新:プログラム unbufferexpect の一部 パッケージは、バッファリングの問題を解決します。これにより、stdout と stderr が画面とファイルにすぐに書き込み、結合されて tee にリダイレクトされるときに同期が維持されます。 .例:

$ unbuffer program [arguments...] 2>&1 | tee outfile

私にとって有効な別の方法は、

<command> |& tee  <outputFile>

gnu bash マニュアルに示されている

例:

ls |& tee files.txt
<ブロック引用>

「|&」が使用されている場合、command1 の標準エラー 、その標準出力に加えて 、パイプを介して command2 の標準入力に接続されます。 2>&1 の短縮形です |。この標準エラーの標準出力への暗黙的なリダイレクトは、コマンドで指定されたリダイレクトの後に実行されます。

詳細については、リダイレクトを参照してください


Linux
  1. プログラムの出力をリダイレクトし、それでもStdoutに送信する方法はありますか?

  2. >、&>、>&、および 2&> を使用して出力をリダイレクトすることの違いは何ですか?

  3. スクリプトの同じ行で stderr と stdout を別のファイルにリダイレクトする方法は?

  1. system() の出力をファイルにリダイレクトする方法は?

  2. spark-submit の出力全体をファイルにリダイレクトする方法

  3. プログラムの出力を入力としてリダイレクトする方法

  1. Linuxで出力をファイルとStdoutにリダイレクトする方法

  2. bash:stderr をファイルにリダイレクトし、stdout + stderr を画面にリダイレクトします

  3. teeを使用してSTDERRおよびSTDOUTをファイルにキャプチャする