#! /usr/bin/bash spinner_pid= usage() { local name=${0##*/} cat <<-EOF Usage: ${name} {options] Run a command with an animated spinner. EOF } spinner() { local chars=('\' '|' '/' '-') local c while true; do for c in ${chars[@]}; do printf "<%s>\r" "${c}" sleep .2 done done } cleanup() { echo "done" if [[ -n ${spinner_pid} ]]; then kill "${spinner_pid}" fi echo "[$$] finished spinner" } main() { trap cleanup EXIT spinner & spinner_pid=$! if (( $# == 0)); then usage >&2 return 1 fi "$@" } main "$@"