aboutsummaryrefslogtreecommitdiff
path: root/bin/try.m4
diff options
context:
space:
mode:
authorTom Ryder <tom@sanctum.geek.nz>2016-08-16 18:38:49 +1200
committerTom Ryder <tom@sanctum.geek.nz>2016-08-16 18:38:49 +1200
commit0b1c99ffb1c3019e8afb9dcc542fbc5e868baef1 (patch)
tree9712aa161c25232e0f6561ee181b82eb42af347a /bin/try.m4
parentPut "all" subtargets on their own line (diff)
downloaddotfiles-0b1c99ffb1c3019e8afb9dcc542fbc5e868baef1.tar.gz
dotfiles-0b1c99ffb1c3019e8afb9dcc542fbc5e868baef1.zip
Template traps in scripts depending on mktd(1)
Diffstat (limited to 'bin/try.m4')
-rw-r--r--bin/try.m463
1 files changed, 63 insertions, 0 deletions
diff --git a/bin/try.m4 b/bin/try.m4
new file mode 100644
index 00000000..359a4280
--- /dev/null
+++ b/bin/try.m4
@@ -0,0 +1,63 @@
+#!/bin/sh
+# Attempt a certain number of times to perform a task, buffer stderr unless and
+# until all command attempts fail
+self=try
+
+# Parse options
+while getopts 's:n:' opt ; do
+ case $opt in
+ n)
+ attn=$OPTARG
+ ;;
+ s)
+ sleep=$OPTARG
+ ;;
+ \?)
+ printf >&2 '%s: Unknown option\n' "$self"
+ exit 2
+ ;;
+ esac
+done
+shift "$((OPTIND-1))"
+
+# Check we have at least one argument left (the command to run)
+if [ "$#" -eq 0 ] ; then
+ printf >&2 '%s: Need a command to run\n' "$self"
+ exit 2
+fi
+
+include(`include/mktd.trap.sh')
+# Open a filehandle to the error buffer, just to save on file operations
+errbuff=$td/errbuff
+exec 3>"$errbuff"
+
+# Keep trying the command, writing error output to the buffer file, and exit
+# if we succeed on any of them
+attc=1
+: "${attn:=3}" "${sleep:=0}"
+while [ "$attc" -le "$attn" ] ; do
+
+ # Try running the command; if it succeeds, we're done, and any previous
+ # failures get their errors discarded
+ if "$@" 2>&3 ; then
+ exit
+
+ # If the command failed, record the exit value
+ else
+ ex=$?
+ fi
+
+ # If this isn't the last run, have a sleep
+ if [ "$attc" -lt "$attn" ] ; then
+ sleep "${sleep:=0}"
+ fi
+
+ # Increment the attempt count
+ attc=$((attc + 1))
+done
+
+# Attempts were exhausted, and all failed; print the error output from all of
+# the failures and exit with the non-zero exit value of the most recent one
+exec 3>&-
+cat -- "$td"/errbuff >&2
+exit "$ex"