Skip to main content

How to create a spinner for your Bash scripts. If you have a long running process and don't want to try to tell the user approximately how much of that process is left to run, showing them a spinner is a great alternative.

#!/usr/bin/env bash

#
# From Show a Bash spinner for long running tasks
# http://fitnr.com/showing-a-bash-spinner.html
spinner() {
    local pid=$1
    local delay=0.20
    # shellcheck disable=SC1003
    local spinstr='|/-\'

    while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
        local temp=${spinstr#?}
        printf " [%c]  " "$spinstr"
        local spinstr=$temp${spinstr%"$temp"}
        sleep $delay
        printf "\b\b\b\b\b\b"
    done

    printf "    \b\b\b\b"
}

#
# Example usage
#

do_fake_work() {
    echo -n "Doing work... "
    sleep 3
}

(do_fake_work) &
spinner $! && echo "Done"