Porque esse é um recurso do shell (do ksh, copiado pelo bash) e apenas do shell.
/dev/tcp/...
não são arquivos reais, o shell intercepta as tentativas de redirecionar para um /dev/tcp/...
arquivo e, em seguida, executa socket(...);connect(...)
(faz uma conexão TCP) em vez de open("/dev/tcp/..."...)
(abre esse arquivo) nesse caso.
Note que tem que ser escrito assim. cat < /dev/./tcp/...
ou ///dev/tcp/...
não funcionará e, em vez disso, tentará abrir esses arquivos (que na maioria dos sistemas não existem e você receberá um erro).
A direção do redirecionamento também não importa. Se você usa 3< /dev/tcp/...
ou 3> /dev/tcp/...
ou 3<> /dev/tcp/...
ou até mesmo 3>> /dev/tcp/...
não vai fazer qualquer diferença, você vai ser capaz de ler e escrever de / para que descritor de arquivo para receber dados / enviar mais que o soquete TCP.
Quando você faz cat /dev/tcp/...
isso, isso não funciona porque cat
não implementa o mesmo tratamento especial, é open("/dev/tcp/...")
semelhante a todos os arquivos (exceto -
), apenas o shell (ksh, somente bash), e apenas o destino dos redirecionamentos.
Esse cat -
é outro exemplo de um caminho de arquivo tratado especialmente. Em vez de fazer a open("-")
, ele lê diretamente do descritor de arquivo 0 (stdin). cat
e muitos utilitários de texto fazem isso, o shell não faz por seus redirecionamentos. Para ler o conteúdo do -
arquivo, você precisa cat ./-
, ou cat < -
(ou cat - < -
). Em sistemas que não possuem /dev/stdin
, bash
no entanto, fará algo semelhante para redirecionamentos desse arquivo (virtual). GNU awk
faz o mesmo para /dev/stdin
, /dev/stdout
, /dev/stderr
mesmo em sistemas que têm tais arquivos que podem causar algumas surpresas em sistemas como o Linux, onde esses arquivos se comportar de forma diferente.
zsh
também possui suporte a soquetes TCP (e fluxo de domínio Unix), mas isso é feito com um ztcp
(e zsocket
) built-in, por isso é menos limitado que a abordagem ksh / bash. Em particular, ele também pode atuar como um servidor que o ksh / bash não pode fazer. Ainda é muito mais limitado do que o que você pode fazer em uma linguagem de programação real.