A única diferença entre as sintaxes <&
e >&
é que o primeiro verifica se o descritor de arquivo de destino está aberto para entrada e o segundo verifica se ele está aberto para saída. A operação real é a mesma em ambos os casos (provavelmente uma chamada dup2
). Enquanto isso, > /dev/tcp/HOST/PORT
não está fazendo open
syscall, como a maioria dos redirecionamentos; a sintaxe /dev/tcp
é um caso especial bash e, de fato, o bash está abrindo um soquete (que então se comporta como um descritor de arquivo normal w.r.t. as chamadas read
e write
). Sockets não têm a propriedade que os arquivos abertos têm de ser abertos apenas para leitura ou gravação; um soquete permite ler e escrever (embora você possa shutdown(2)
da metade disso, se quiser). Assim, o bash não faz erro de redirecionamento das duas sintaxes usadas, e como a chamada dup2
é a mesma, o comportamento é idêntico.