#!/usr/bin/env bash # # Waits TIMEOUT seconds, makes probes every second, until COMMAND returns # OUTPUT=/dev/null if [[ "${DEBUG}" == "true" ]]; then set -x OUTPUT=/dev/stderr fi function die(){ [[ "${WAIT_VERBOSE}" == "true" ]] && echo echo "[ ERROR ]" echo "${@}" exit 1 } function signal_progress(){ [[ "${WAIT_VERBOSE}" == "true" ]] && echo -n "=" } function success(){ [[ "${WAIT_VERBOSE}" == "true" && ${WAIT_TIME} -gt 0 ]] && echo "|" exit 0 } [[ ${#} -ge 3 ]] || die "Usage: wait_for true|false TIMEOUT COMMAND" [[ ${1} == "true" || ${1} == "false" ]] || die "'true' or 'false' for the first argument please!" declare -r RESOLUTION=${1}; shift declare -r TIMEOUT=${1}; shift declare -r COMMAND="${@}" WAIT_TIME=0 while [[ ${WAIT_TIME} -lt ${TIMEOUT} ]]; do bash -c "${COMMAND}" >${OUTPUT} RETVAL=${?} if [[ "${RESOLUTION}" == "true" ]]; then [[ ${RETVAL} -eq 0 ]] && success else [[ ${RETVAL} -ne 0 ]] && success fi sleep 1 let WAIT_TIME+=1 signal_progress done if [[ "${RESOLUTION}" == "true" ]]; then FAIL_STATE=fails else FAIL_STATE=succeeds fi die "\"${@}\" still ${FAIL_STATE} after ${TIMEOUT} seconds"