Bashマニュアルには、順序が重要であることを示す明確な例(あなたのものに似ています)があり、違いも説明しています。抜粋された関連部分は次のとおりです(強調は私のものです):
リダイレクトの順序は重要であることに注意してください。たとえば、コマンド
ls >ディレクトリリスト2>&1
コマンドは、標準出力 (ファイル記述子 1) と標準エラー (ファイル記述子 2) の両方をファイルdirlistに送ります。
ls 2>&1 >ディレクトリリスト
標準出力がdirlistにリダイレクトされる前に、標準エラーは標準出力のコピーが作成されたため、標準出力のみをファイルdirlistに送信します。
この投稿では、POSIX の観点から説明します。
混乱は、重要な違いが原因で発生します。左のオペランド ( ) を右のオペランド ( ) に向けるのではなく、右のオペランドのコピーを作成して左に代入することによって>
リダイレクトします。概念的には、参照ではなくコピーによる代入です。stderr
stdout
したがって、左から右への読み取りは、これが Bash によって解釈される方法です: file へのls > dirlist 2>&1
リダイレクトを意味し、その後、現在のもの (既に file )へのリダイレクトが続きます。ただし、現在のもの(画面/端末)にリダイレクトしてから、にリダイレクトします。stdout
dirlist
stderr
stdout
dirlist
ls 2>&1 > dirlist
stderr
stdout
stdout
dirlist