/ Dev / {udp, tcp} стандартизированы или доступны везде?

17

Я недавно узнал о /dev/udpи /dev/tcpпсевдо-устройствах здесь . Они специфичны для некоторых дистрибутивов GNU / Linux или я могу найти их в других системах Unix?

Они стандартизированы каким-то образом?

До сих пор я был в состоянии успешно использовать их на OS X, Arch Linux и CentOS.

Antoine
источник

Ответы:

26

Это особенность оболочки, а не операционной системы.

Так, например, на Solaris 10 с ksh88оболочкой:

% cat < /dev/tcp/localhost/22
ksh: /dev/tcp/localhost/22: cannot open

Однако если мы переключимся на bash:

% bash
bash-3.2$ cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_1.1.5

Так bashинтерпретирует /dev/tcpно ksh88 не сделал.

На Солярисе 11 ksh93в качестве оболочки:

% cat < /dev/tcp/localhost/22
SSH-2.0-Sun_SSH_2.2

Таким образом, мы видим, что это очень зависит от используемой оболочки.

Стивен Харрис
источник
4
Также зависит от параметров времени компиляции - не во всех сборках bash он будет включен.
Чарльз Даффи
@CharlesDuffy Достаточно верно; также верно для ksh (ksh-88 пытался автоопределить, но я не уверен, что он работал правильно).
Стивен Харрис,
1
Что касается первого предложения, POSIX действительно стандартизирует некоторые базовые функции оболочки (хотя /dev/tcp/...не является одной из них).
Tanz87
3

Чтобы добавить, из узла Bash Info :

Bash обрабатывает несколько имен файлов, особенно когда они используются в перенаправлениях, как описано в следующей таблице. Если операционная система, в которой работает Bash, предоставляет эти специальные файлы, bash будет использовать их; в противном случае он будет эмулировать их внутреннее поведение, описанное ниже.

'/ dev / fd / FD' Если FD является допустимым целым числом, дескриптор файла FD дублируется.

'/ dev / stdin' Дескриптор файла 0 дублирован.

'/ dev / stdout' Дескриптор файла 1 дублирован.

'/ dev / stderr' Дескриптор файла 2 дублирован.

'/ dev / tcp / HOST / PORT' Если HOST является допустимым именем хоста или интернет-адресом, а PORT является целочисленным номером порта или именем службы, Bash пытается открыть соответствующий сокет TCP.

'/ dev / udp / HOST / PORT' Если HOST является допустимым именем хоста или интернет-адресом, а PORT является целочисленным номером порта или именем службы, Bash пытается открыть соответствующий сокет UDP.

extremeaxe5
источник