グループ化コマンドを使用してstdoutとstderrを置き換えずにファイルに正しくリダイレ​​クトできないのはなぜですか?

グループ化コマンドを使用してstdoutとstderrを置き換えずにファイルに正しくリダイレ​​クトできないのはなぜですか?

bashインタラクティブシェルでstdoutとstderrを交換し、各ストリームをファイルにリダイレクトしてみました。

角かっこを使用してコマンドをグループ化すると、目的の結果が得られます。しかし、グループコマンドを使用しないと、結果が変わらない理由はわかりません。

$ # Using Grouping command. Swap operation is succeed.
$ { { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3; } 1>1.txt 2>2.txt;
$ cat 1.txt
stderr
$ cat 2.txt
stdout

$ # Not using Grouping command. Swap is failed...
$ { echo stdout; echo stderr 1>&2; } 3>&1 1>&2 2>&3 1>1.txt 2>2.txt;
$ cat 1.txt
stdout
$ cat 2.txt
stderr

上記のコマンドのスワップファイル記述子操作の私の理解は次のとおりです。

  1. 3>&1:FD3をFD1にリダイレクト(標準出力)
  2. 1>&2:FD1をFD2にリダイレクト(stderr)
  3. 2>&3:FD2をFD3にリダイレクト(標準出力)
  4. 1>1.txt:FD1を1.txtにリダイレクトします(FD1はstderrを指します)。
  5. 2>2.txt:FD2を2.txtにリダイレクトします(FD2はstdoutを指します)。

しかし、私が理解したところによると、校正装置の有無によって結果が変わってはならないと思います。

私が基本的な誤解をしているのでしょうか?上記の2つのコマンドの結果が異なるのはなぜですか?

私の環境に関する情報です。

$ bash --version
GNU bash, version 4.4.12(1)-release (x86_64-apple-darwin16.3.0)
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

答え1

Bash は、ファイル記述子を右から左に逆順に処理します。まず2>2.txt、その次1>1.txtなど…

関連情報