stdin、stderr、リダイレクト、ログ

stdin、stderr、リダイレクト、ログ

これらの2行の間に違いはありますか?

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1
/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

スクリプトの標準出力と実行エラーをログファイルに保存したいと思います。違いがなければ、ロギング自体を記録したい場合はどうすればよいですか?

答え1

はい、少し違います。

/home/user/script.sh >> /home/user/stdout_and_error.log  2>&1

それからSTDOUTとSTDERRが/home/user/stdout_and_error.log

/home/user/script.sh 2>&1 >> /home/user/stdout_and_error.log  

これにより、STDOUTが前のSTDOUTに送信され、/home/user/stdout_and_error.logSTDERRが以前のSTDOUTに送信されます。

 

シェルリダイレクトを実行すると、リダイレクトの左側が現在のリダイレクトの右側の位置に移動します。つまり2>&1、現在 STDOUT(1) があるところに STDERR(2) を送ります。
ただし、STDOUTを別の場所にリダイレクトすると、STDERRはフォローしません。 STDOUT が以前にあったところから続く。そのため、最初の例ではSTDOUTとSTDERRの両方が同じ位置に移動しますが、2番目の例ではそうではありません。

答え2

最初のコマンドラインでは、シェルは最初に>> fileをチェックし、stdoutをfileに追加します。次の2>&1は、fd1が行くのと同じ場所(ファイル)にfd2(stderr)を送信します。これがあなたが望むものです。

2番目のコマンドラインでは、シェルは最初に2>&1をチェックします。これは、「標準エラー(ファイル記述子2)を標準出力(fd1)と同じ位置に移動させます」を意味します。 fd2とfd1はすでに端末にあるため、効果はありません。その後、>> fileはfd1(stdout)をfileに追加します。ただし、fd2(stderr)は依然として端末に移動します。

答え3

>> 追加stdout(ストリーム#1)をファイルに変換します。

2>&1stderr(ストリーム#2)をstdout(ストリーム#1)と結合します(stdoutにstderrを追加します)。

>stdout(ストリーム#1)をファイルに書き込み、ファイルを上書きします。

1>stdout(ストリーム#1)をファイルに書き込み、ファイルを上書きします。同じ上記と。

2>ファイルにstderr(ストリーム#2)を書き、ファイルを上書きします。

+++

最初の例では、stdoutをファイルに追加し、stderrをstdoutに追加します。

2番目の例では、stdoutにstderrを追加してから追加します。結合されたstdout(stderrを含む)をファイルに変換します。

関連情報