Wait until a TCP port accepts connections

Bash
#!/usr/bin/env bash
# Wait until a TCP host:port accepts connections before starting.
set -euo pipefail

host="${1:-127.0.0.1}"
port="${2:-5432}"
timeout_s="${3:-30}"

# Bash's /dev/tcp redirection avoids extra tools like nc.
port_open() {
  (exec 3<>"/dev/tcp/$host/$port") 2>/dev/null
}

deadline=$((SECONDS + timeout_s))
until port_open; do
  if ((SECONDS >= deadline)); then
    printf 'timed out after %ss waiting for %s:%s\n' \
      "$timeout_s" "$host" "$port" >&2
    exit 1
  fi
  sleep 1
done

printf '%s:%s ready after %ss\n' "$host" "$port" "$SECONDS"