これらの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
スクリプトのstdoutおよび実行エラーをログファイルに記録したいことを知っています。違いがない場合、ログ自体をログに記録するにはどうすればよいですか?
はい、違いがあります。
/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が/home/user/stdout_and_error.log
に送信され、STDERRが以前のSTDOUTに送信されます。
シェルリダイレクトを実行すると、リダイレクトの左側が、リダイレクトの右側が現在行っている場所に移動します。 2>&1
の意味は、STDOUT(1)が現在行くところにSTDERR(2)を送信することです。
しかし、後でSTDOUTを別の場所にリダイレクトすると、STDERRはそれに対応しません。 STDOUTが以前行われていた場所に移動し続けます。このため、最初の例ではSTDOUTとSTDERRの両方が同じ場所に移動しますが、2番目の例では移動しません。
最初のコマンドラインで、シェルは>>ファイルを最初に確認し、ファイルにstdoutを追加します。次の2>&1は、fd2(stderr)をfd1と同じ場所に送信します。そして、それはあなたが望むものです。
2番目のコマンドラインでは、シェルは2>&1を最初に認識します。これは、「標準エラー(ファイル記述子2)が標準出力(fd1)と同じ場所に移動するようにする」ことを意味します。 fd2とfd1の両方がすでに端末に送信されているため、効果はありません。次に>> fileはfd1(stdout)をfileに追加します。しかし、fd2(stderr)はまだターミナルに行きます。
>>
追加 stdout(ストリーム#1)からファイルへ。
2>&1
stderr(ストリーム#2)とstdout(ストリーム#1)を組み合わせる(stderrをstdoutに追加)
>
stdout(ストリーム#1)をファイルに書き込み、ファイルを上書きします。
1>
stdout(ストリーム#1)をファイルに書き込み、ファイルを上書きします。同上。
2>
stderr(ストリーム#2)をファイルに書き込み、ファイルを上書きします。
+++
あなたが最初の例では、stdoutをファイルに追加し、次にstderrをstdoutに追加します。
2つ目の例は、stderrをstdoutに追加し、次にcombined stdout(stderrを含む)をファイルに追加します。