Não é o comando que imprime a saída. Você não tem o comando any - o < /dev/tcp/…
é apenas o redirecionamento de entrada regular e é processado pelo próprio shell.
(E não apenas isso, mas os redirecionamentos são processados da esquerda para a direita, portanto, o redirecionamento <
é processado antes do 2>&1
, portanto, ele não pode ser redirecionado de qualquer maneira .)
Você pode contornar isso executando o "comando" em um subshell. Por exemplo:
( </dev/tcp/$host/$port ) 2>/dev/null
Na verdade, parece que, neste caso, uma subcamada não é necessária; um grupo de comando funcionará mesmo se estiver dentro do mesmo processo - ele ainda força os redirecionamentos "externos" a serem processados primeiro:
{ </dev/tcp/$host/$port; } 2>/dev/null
Nota: /dev/tcp
é um caminho mágico que é manipulado pelo próprio bash - ele não existe realmente no / dev do Linux, mas pode ser usado com redirecionamentos de bash. No entanto, esse truque não funcionará com #!/bin/sh
e ainda há uma chance de que ele não funcione com o bash em alguns sistemas mais antigos (que costumavam desativar esse recurso) ou em alguns sistemas não-Linux.