web-dev-qa-db-ja.com

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  

スクリプトのstdoutおよび実行エラーをログファイルに記録したいことを知っています。違いがない場合、ログ自体をログに記録するにはどうすればよいですか?

7
4m1nh4j1

はい、違いがあります。

/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番目の例では移動しません。

14
Patrick

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

2番目のコマンドラインでは、シェルは2>&1を最初に認識します。これは、「標準エラー(ファイル記述子2)が標準出力(fd1)と同じ場所に移動するようにする」ことを意味します。 fd2とfd1の両方がすでに端末に送信されているため、効果はありません。次に>> fileはfd1(stdout)をfileに追加します。しかし、fd2(stderr)はまだターミナルに行きます。

5
cioby23

>>追加 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を含む)をファイルに追加します。

3
Baard Kopperud