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 .