stdoutとstderrの両方をファイルにリダイレクトするときに、stderrをstdoutにリダイレクトすることを最後に配置する必要があるのはなぜですか? [コピー]

stdoutとstderrの両方をファイルにリダイレクトするときに、stderrをstdoutにリダイレクトすることを最後に配置する必要があるのはなぜですか? [コピー]

stdoutとstderrをファイルにリダイレクトするには:

curl 'https://example.com' > myfile 2>&1

これはうまくいきますが、なぜstderrをstdoutにリダイレクトするのは最後になされるべきですか?

なぜできないのですか?

curl 'https://example.com' 2>&1 > myfile

この回避策が機能しない理由は理解できません。 stderrをファイルにリダイレクトしません。左から右に読む:「Webページのダウンロード、stderrをstdoutにリダイレクト、stdoutをファイルにリダイレクト」ですが、これは明らかにBashがコマンドを解釈する方法ではありません。 Bashが2>&1最後に来ると予想されます。なぜ2>&1一番最後に入れなければならないのでしょうか?

答え1

私を信じてください。私は長い間この質問を受けました。今私はそれを簡単な言葉で覚えています。

ここでの意味fdはですfile descriptor

2番目のケースでは、以前にあった場所をfd2指します。fd1それからfd2他の場所を指します。

理解しやすくするには、次の点を考慮してください。

fd1 --> stdout
2>&1, means fd2 --> stdout
then >some_file means fd1 --> some_file

fd2したがって、従うのでfd1はなく、目標に従うことですfd1

関連情報