我试图理解 bash 重定向,但我偶然发现了一个奇怪的例子。考虑以下交互。
1: $ echo "Hello" 11>txt 11<&1
2: Hello
3: $ cat txt
4: $ echo "Hello" 11>txt 1>&11
5: $ cat txt
6: Hello
第 1 行和第 4 行在我看来完全对称,为什么它们不产生相同的结果?
答案1
@choroba 给出了很好的答案,但没有解释。这就是原因。
echo "Hello" 11>txt 11<&1
- 标准输出 -> 终端
11>txt
打开文件 txt 作为 fd/x 将 fd/11 重定向到 fd/x (将 fd/x 中的编号复制到 fd/11)11<&1
将 fd/11 重定向到 fd/1(将 fd/1 中的编号复制到 fd/11)。
现在 fd/11 相当于 fd/1 (终端)。 fd/x 指向文件(但我们不知道 x)。
echo "Hello" 11>txt 1>&11
- 标准输出 -> 终端
11>txt
打开文件 txt 作为 fd/x 将 fd/11 重定向到 fd/x (将 fd/x 中的编号复制到 fd/11)1>&11
将 1 重定向到 11(将 fd/11 中的编号复制到 fd/1)。
现在 fd/1、fd/11 和 fd/x 指向文件。
答案2
在第一种情况下,您将 fd11 指向 txt,但随后将 fd11 更改为指向 fd1,因此输出将转到终端。
在第二种情况下,您将 fd11 指向 txt,然后更改 stdout 以指向它,因此输出将转到该文件。
<&
如果交换描述符,您可以使用运算符实现相同的行为:
echo Hello 11>txt 1<&11