違いは何ですか:
cmd > log 2>&1
そして
cmd 2>&1 > log
cmdはコマンドですか?
どちらを好むのか、なぜですか?
順序が重要です。リダイレクトを推論する方法は、それらを左から右に読み、リダイレクトがストリームを同じ場所に向けることを認識することです。ストリームが互いにポイントすることはありません。
どういう意味ですか?あなたが言うなら 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は(まだ)コンソールに送信されます。これはほぼ間違いなくあなたが望むものではありません。
cmd > log 2>&1
STDOUT
をログにリダイレクトし、STDERR
をリダイレクトされたSTDOUT
に置き換えます。
cmd 2>&1 > log
STDERR
をSTDOUT
に置き換えてから、元のSTDOUT
をログにリダイレクトします。