web-dev-qa-db-ja.com

cmd 2>&1> log vs cmd> log 2>&1

違いは何ですか:

cmd > log 2>&1

そして

cmd 2>&1 > log

cmdはコマンドですか?

どちらを好むのか、なぜですか?

29
dogbane

順序が重要です。リダイレクトを推論する方法は、それらを左から右に読み、リダイレクトがストリームを同じ場所に向けることを認識することです。ストリームが互いにポイントすることはありません。

どういう意味ですか?あなたが言うなら 2>&1その後、stdoutが現在リダイレクトされている場所にstderrをリダイレクトしています。 stdoutがコンソールに行く場合、stderrも同様です。 stdoutがファイルに送信される場合、stderrも同様です。その後、stdoutをリダイレクトすることでこれをフォローしても、stderrはまだ指すstdout sedを指します。 stdoutを新しい場所に「フォロー」しません。

正しい

cmd > log 2>&1

これにより、stdoutがlogにリダイレクトされ、その後stderrがstdoutがリダイレクトされる場所(log)にリダイレクトされます。

最終結果: stdoutとstderrの両方がlogにリダイレクトされます。

違う

cmd 2>&1 > log

これは、stdoutが現在リダイレクトされている場所(通常はコンソール)にstderrをリダイレクトします。次に、stdoutはlogにリダイレクトされます。 stderrはstdoutを「フォロー」しないため、コンソールにリダイレクトし続けることに注意してください。

最終結果: stdoutはログファイルにリダイレクトされ、stderrは(まだ)コンソールに送信されます。これはほぼ間違いなくあなたが望むものではありません。

77
John Kugelman
cmd > log 2>&1

STDOUTをログにリダイレクトし、STDERRをリダイレクトされたSTDOUTに置き換えます。

cmd 2>&1 > log

STDERRSTDOUTに置き換えてから、元のSTDOUTをログにリダイレクトします。

6