TCP连接,只有bash

我在脚本中find了这一行。 虽然我全面理解它的function – 打开双向TCP连接,但我需要对语法进行一些解释。 这里是行:

exec 5<>"/dev/tcp/${SERVER}/${PORT}" 

和我的问题:

  1. 通常用于redirectIO。 这是什么意思? 它在另一种情况下可用吗? 怎么样?
  2. 为什么它工作,而/dev/tcp不存在?
  3. 为什么5? 可以是另一个号码吗? 什么是允许的价值?
  4. 为什么exec是必要的? (没有任何实际执行

谢谢。

Solutions Collecting From Web of "TCP连接,只有bash"

通常用于重定向IO。 这是什么意思? 它在另一种情况下可用吗? 怎么样?

它是一样的 – 输入和输出被重定向到fd 5。

为什么它工作,而/ dev / tcp不存在?

这是一个特殊的文件:如果主机是一个有效的主机名或Internet地址,并且端口是一个整数端口号或服务名称,bash将尝试打开一个TCP连接到相应的套接字。

为什么5? 可以是另一个号码吗? 什么是允许的价值?

是的,它可以是任何价值,但你需要确保你不使用已经在使用的FD。

为什么exec是必要的? (没有任何实际执行)

exec意味着重定向发生在当前shell中,而不是在子shell中。

我只能回答执行部分:

没有给出命令的exec可能被用来改变I / O重定向。 在这种情况下,意味着打开读取和写入。 5是频道号(或文件描述符)。 这是有道理的,如果其他命令发送他们的输出/从通道5读取他们的输入。

对于“/ dev / tcp / $ {SERVER} / $ {PORT}”我不知道它是否是特定Linux版本的功能,或者是否是bash功能(我认为是后者)。

– 编辑:从bash手册页: –

  Bash handles several filenames specially when they are used in redirections, as described in the following table: /dev/fd/fd If fd is a valid integer, file descriptor fd is duplicated. /dev/stdin File descriptor 0 is duplicated. /dev/stdout File descriptor 1 is duplicated. /dev/stderr File descriptor 2 is duplicated. /dev/tcp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a TCP connection to the corresponding socket. /dev/udp/host/port If host is a valid hostname or Internet address, and port is an integer port number or service name, bash attempts to open a UDP connection to the corresponding socket.