为什么在不使用 Grouping 命令交换 stdout 和 stderr 时无法正确重定向到文件?

为什么在不使用 Grouping 命令交换 stdout 和 stderr 时无法正确重定向到文件?

我尝试在 bash 交互式 shell 中交换 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)

但根据我的理解,我认为结果不应该根据是否有大括号而改变。

我是否犯了一些基本的误解?为什么上面两个命令结果不同呢?

信息我的环境。

$ 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,等等……

相关内容