Livre-se do erro "conexão recusada" no script bash

1

Eu tenho esta linha:

exec 3<>/dev/tcp/127.0.0.1/9091 > /dev/null 2>&1 ||  { PORT_IS_FREE="yes"; };

que está verificando se a porta 9091 está disponível. Se não for possível estabelecer uma conexão, recebo este erro:

my-script: connect: Connection refused
my-script: line 6: /dev/tcp/127.0.0.1/9091: Connection refused

claro, esse erro não é uma má notícia, significa que a porta é gratuita. Como posso evitar que o rastreamento de erro seja registrado? Eu tentei enviar stdout / stderr para / dev / null, mas aparentemente isso não está dando certo.

Bônus:

Eu tenho set -e no topo do script - tudo será interrompido se a conexão for recusada - como posso evitar que isso ocorra, se um erro for esperado em uma linha específica como a acima?

Então eu tenho dois objetivos:

  1. Livre-se da mensagem de erro, porque ela é esperada e não preciso que os usuários da minha biblioteca a vejam.

  2. Ignore o erro como esperado e ainda quero usar set -e, se possível.

por Alexander Mills 12.07.2017 / 22:18

1 resposta

2

Para continuar usando set -e , mas ainda permitir um erro conhecido, use este encantamento:

/bin/false || :

Isso usa o operador || para "consumir" o erro, de modo que ele seja considerado não fatal em um ambiente no qual set -e esteja ativo.

Você já está usando 2>/dev/null para suprimir o erro padrão, então tem certeza de que o erro está vindo da linha que você cita aqui? Além disso, em vez de usar exec , proponho uma alternativa mais legível:

if ! nc -z localhost 9091 1> /dev/null 2>&1; then
    port_free="yes"
fi

Como o código de retorno de nc é verificado pela instrução if , isso também é seguro após set -e .

    
por 12.07.2017 / 22:39

Tags