Eu acho que a documentação do Bash é um pouco enganadora sobre esse tópico. Observando o código, até voltando à versão 2.04, onde os redirecionamentos de rede foram introduzidos, /dev/tcp
e /dev/udp
funciona da seguinte maneira:
- no momento da criação, o
configure
script verifica se há suporte para vários recursos de rede; se assim for, se os redirecionamentos de rede estiverem ativados (que é o caso por padrão), o código de rede interno é incorporado;
- em tempo de execução, se o código de rede interno estiver incorporado
/dev/tcp
e /dev/udp
(no formato correto) for tratado internamente; caso contrário, um aviso será produzido (“/ dev / (tcp | udp) / host / porta não suportado sem rede”) e o Bash tenta abrir o caminho especificado no sistema;
- se os redirecionamentos de rede estiverem configurados, nada de especial será feito.
O que isso se resume é:
- se o redirecionamento de rede estiver ativado:
- se a rede é suportada na plataforma de destino
/dev/tcp
e /dev/udp
sempre será tratada internamente;
- caso contrário, o Bash avisará e tentará abrir o arquivo “às cegas”; se o sistema de alguma forma suportar
/dev/(tcp|udp)/host/port
, isso será usado; caso contrário, com toda a probabilidade, o redirecionamento falhará;
- se o redirecionamento de rede estiver desativado, nenhum tratamento especial será executado; como acima, se o sistema de alguma forma suportar
/dev/(tcp|udp)/host/port
, isso será usado; caso contrário, com toda a probabilidade, o redirecionamento falhará.
/dev/tcp
existe em alguns sistemas, mas até onde eu sei, nenhum suporta a mesma abstração que o Bash. No Solaris, /dev/tcp
é usado com a ndd
ferramenta para consultar e alterar a configuração da rede. No XTI (consulte também o Open Group, se você for um membro), a t_open
função pode ser usada /dev/tcp
para abrir uma conexão TCP, mas não usa a configuração baseada em caminhos, existe uma estrutura de dados separada para especificar o host de destino e porta (e outros parâmetros).
/dev
é um tmpfs nos linuxes atuais e estava na partição raiz nos mais antigos. É por isso que é impossível atualmente. Poderia ser possível facilmente com uma extensão sysfs ou procfs (ambos os fs são muito flexíveis e semelhantes (na verdade, provavelmente ninguém sabe por que eles não são os mesmos)), ninguém faz isso hoje, mas pode ser feito em cerca de 100 linhas de código.