2>&1> output.logと2>&1 teeoutput.logの違い|

2>&1> output.logと2>&1 teeoutput.logの違い|

次の2つのコマンドの違いを知りたい

2>&1 > output.log 

そして

2>&1 | tee output.log

私は同僚の1人がリダイレクトに2番目のオプションを使用しているのを見ました。 2>&1が何であるかを知っています。唯一の質問は、teeを使用する目的が何であるかです。 ">"演算子を使用して簡単なリダイレクトを実行できますか?

答え1

2つのコマンドをそれぞれ見てください。

utility 2>&1 >output.log 

ここでリダイレクトは左から右に処理されるため、標準エラーストリームは最初に標準出力ストリームがある場所(おそらくコンソール)にリダイレクトされ、次に標準出力ストリームがファイルにリダイレクトされます。標準エラーストリームはいいえこのファイルにリダイレクトされます。

これの明白な効果は、標準エラーによって生成された内容とファイルの標準出力によって生成された内容を画面に表示できることです。

utility 2>&1 | tee output.log

ここで、標準エラーを標準出力ストリームと同じ場所にリダイレクトします。これは意味する両方teeストリームは単一の混合出力ストリームとしてユーティリティにパイプされ、対応するstdoutteeデータはteeコンソールからも再生成されます(これはteeデータストリームを直接コピーすることです)。

どちらを使用するかは、達成する目標によって異なります。

標準出力とエラーがファイルに保存されるものを>組み合わせる(as in)を使用して2番目のパイプの効果を再現することはできません。コンソールファイルと出力ファイルからデータをインポートするには、それを使用する必要があります。utility >output.log 2>&1output.logtee


その他の注意:

これ見える最初の命令の効果、

utility 2>&1 >output.log 

同じだろう

utility >output.log

つまり、標準出力はファイルに移動し、標準エラーはコンソールに移動します。

上記の各コマンドの最後に追加の処理ステップを追加すると、大きな違いがあります。

utility 2>&1 >output.log | more_stuff

utility >output.log      | more_stuff

最初のパイプラインではmore_stuff初期標準エラーストリームを標準入力データにインポートしますがutility、2番目のパイプラインではパイプを介して送信された結果の標準出力ストリームにすぎないため、more_stuffパイプラインの一部は何も得られません。標準読み取り入力。

答え2

最初のコマンドは別の操作を実行します。

後ろに

2>&1 > output.log 

前のSTDOUTはSTDERRに保存(コピー)され、次にSTDOUTがファイルにリダイレクトされます。

したがって、stdoutはファイルに移動し、stderrはコンソールに移動します。

そして

 2>&1 | tee output.log

どちらのストリームもティーにリダイレクトされます。 Teeはすべての入力を標準出力(あなたのコンソール)とファイル(output.log)にコピーします。

最初の形式には別の形式があります。

    > output.log  2>&1

これにより、STDOUTとSTDERRがこのファイルにリダイレクトされます。

答え3

前者はファイルとしてのみ出力します。 2番目は両方ともファイルとして出力されます。そして画面上。

答え4

まず、いくつかのサンプルコードを見てみましょう。

#include <stdio.h>
main() 
{
// message 1, on stdout (using  printf)
printf("%s",          "message 1, on stdout (using  printf)\n");

// message 2, on stdout (using fprintf)
fprintf(stdout, "%s", "message 2, on stdout (using fprintf)\n");

// message 3, on stderr (using fprintf)
fprintf(stderr, "%s", "message 3, on stderr (using fprintf)\n");
}

結果を比較してみましょう。
./helloerror
+ファイル:メッセージなし、コンソール:メッセージ1、2、3;

./helloerror >error.txt
+ファイル:メッセージ1,2;コンソール:メッセージ3;

./helloerror 2>&1 >error.txt
+ファイル:メッセージ1,2;コンソール: メッセージ 3
+ ./helloerror >error.txt と同じ

./helloerror >error.txt 2>&1
+ファイル:メッセージ3,1,2;コンソール:メッセージなし
+順序は3、次に1、2です。

./helloerror | tee error.txt 2>&1
+ファイル:メッセージ1,2;コンソール:メッセージ3、1、2
+の順序は3、次に1、2です。

./helloerror 2>&1 | tee error.txt
+ファイル:メッセージ3,1,2;コンソール:メッセージ3,1,2;

指示:
./helloerror >error.txt 2>&1
- >ファイル内のすべての(stdout + stderr)メッセージが欲しいが、コンソールに固定されていない

./helloerror 2>&1 | tee error.txt
- >ファイル内のすべての(stdout + stderr)メッセージが必要な場合コンソールに印刷

関連情報