我尝试在 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
我对上述命令的交换文件描述符操作的理解如下。
3>&1
:将 FD3 重定向到 FD1(标准输出)1>&2
: 将 FD1 重定向到 FD2 (stderr)2>&3
:将 FD2 重定向到 FD3(标准输出)1>1.txt
:将FD1重定向到1.txt(FD1指向stderr)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
,等等……