对称的重定向不会产生相同的结果

对称的重定向不会产生相同的结果

我试图理解 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

相关内容