次の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>&1
output.log
tee
その他の注意:
これ見える最初の命令の効果、
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)メッセージが必要な場合コンソールに印刷