Избавиться от ошибки «connection reject» в скрипте bash

У меня есть эта строка:

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

который проверяет, доступен ли порт 9091. Если соединение не может быть выполнено, я получаю эту ошибку:

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

конечно, эта ошибка не плохая новость, это означает, что порт свободен. Как я могу предотвратить запись журнала ошибок? Я попытался отправить stdout / stderr в / dev / null, но, видимо, это не трюк.

Бонус:

Я set -e в верхней части скрипта – все остановится, если соединение будет отклонено – как я могу предотвратить эту остановку, если ожидается ошибка на определенной строке, подобной приведенной выше?

Итак, у меня есть две цели:

  1. Избавьтесь от сообщения об ошибке, потому что он ожидается, и мне не нужны мои пользователи библиотеки, чтобы это увидеть.

  2. Игнорируйте ошибку, как и ожидалось, и я по-прежнему хочу использовать set -e, если это возможно.

Чтобы использовать set -e но допустить известную ошибку, используйте это заклинание:

 /bin/false || : 

Это использует || оператора, чтобы «потреблять» ошибку, чтобы она считалась нефатальной для среды, в которой set -e .

Вы уже используете 2>/dev/null для подавления стандартной ошибки, так что вы уверены, что ошибка исходит из строки, которую вы цитируете здесь? Кроме того, вместо использования exec я предлагаю в качестве более читаемой альтернативы:

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

Поскольку код возврата nc проверяется оператором if , это также безопасно после set -e .