Como suprimir a saída do comando bash

0

Eu encontrei desta forma de verificar se um host está acessível em uma determinada porta, no entanto, estou interessado apenas no código de status do comando, portanto estou tentando algo assim:

[CptBartender@somewhere ~]$ <dev/tcp/host/port ; echo $?
0

Isso funciona bem se eu tentar em uma porta aberta, no entanto, se eu verificar uma porta fechada, recebo:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port ; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Agora, meu próximo passo foi tentar descartar as saídas do primeiro comando, então tentei:

[CptBartender@somewhere ~]$ <dev/tcp/host/blocked_port >/dev/null/ 2>&1; echo $?
-bash: connect: Connection refused
-bash: /dev/tcp/host/blocked_port: Connection refused
1

Mesma saída. Minhas perguntas são, por que o primeiro comando está imprimindo qualquer saída e como posso evitar isso?

    
por CptBartender 15.04.2016 / 17:13

1 resposta

2

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.

    
por 15.04.2016 / 17:21