/dev/{udp,tcp} 是标准化的还是随处可用?

Ant*_*ine 22 devices tcp udp portability

我最近在这里了解了/dev/udp/dev/tcp伪设备。它们是特定于某些 GNU/Linux 发行版还是我可以在其他 unix 系统上找到它们?

它们是否以某种方式标准化?

到目前为止,我已经能够在 OS X、Arch Linux 和 CentOS 上成功地使用它们。

Ste*_*ris 29

这是shell 的一个特性,而不是操作系统的特性。

因此,例如,在 Solaris 10 上使用ksh88shell:

% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open
Run Code Online (Sandbox Code Playgroud)

但是,如果我们切换到bash

% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5
Run Code Online (Sandbox Code Playgroud)

所以bash解释了/dev/tcp但是ksh88没有。

在 Solaris 11 上ksh93作为 shell:

% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2
Run Code Online (Sandbox Code Playgroud)

所以我们可以看到它非常依赖于使用的外壳。

  • 还取决于编译时选项——并非所有 bash 构建都会启用它。 (5认同)

ext*_*xe5 5

要添加,从Bash Info 节点

Bash 会在重定向中使用多个文件名时专门处理它们,如下表所述。如果运行 Bash 的操作系统提供这些特殊文件,bash 将使用它们;否则,它将使用下面描述的行为在内部模拟它们。

'/dev/fd/FD' 如果 FD 是有效整数,则文件描述符 FD 是重复的。

'/dev/stdin' 文件描述符 0 重复。

'/dev/stdout' 文件描述符 1 重复。

'/dev/stderr' 文件描述符 2 重复。

'/dev/tcp/HOST/PORT' 如果 HOST 是有效的主机名或 Internet 地址,而 PORT 是整数端口号或服务名,Bash 会尝试打开相应的 TCP 套接字。

'/dev/udp/HOST/PORT' 如果 HOST 是有效的主机名或 Internet 地址,而 PORT 是整数端口号或服务名,Bash 会尝试打开相应的 UDP 套接字。