#!/bin/sh set -eu usage() { cat <<-'EOF' Usage: until [-n SECONDS] -- COMMAND... until -h EOF } help() { cat <<-'EOF' Options: -n SECONDS the amount of seconds to sleep between attempts (default: 5) -h, --help show this message Runs COMMAND until it eventually succeeds. Sleep SECONDS between attempts. Examples: Try flaky build until it succeeds: $ until guix home build home.scm Try to build until a new version is successfull, waiting 30 seconds between attempts: $ until -n 30 -- x git pull AND make EOF } for flag in "$@"; do case "$flag" in --) break ;; --help) usage help exit ;; *) ;; esac done _SECONDS=5 while getopts 'n:h' flag; do case "$flag" in n) _SECONDS="$OPTARG" ;; h) usage help exit ;; *) usage >&2 exit 2 ;; esac done shift $((OPTIND - 1)) ATTEMPT=1 while true; do printf 'Attempt %s.\n' "$ATTEMPT" >&2 ATTEMPT=$((ATTEMPT + 1)) if "$@"; then break fi sleep "$_SECONDS" done