#!/bin/bash # Shows a spinner while another command is running. Randomly picks one of 12 spinner styles. # @args command to run (with any parameters) while showing a spinner. # E.g. ‹spinner sleep 10› function shutdown() { tput cnorm # reset cursor } trap shutdown EXIT function cursorBack() { echo -en "\033[$1D" } function spinner() { # make sure we use non-unicode character type locale # (that way it works for any locale as long as the font supports the characters) local LC_CTYPE=C local pid=$1 # Process Id of the previous running command case $(($RANDOM % 12)) in 0) local spin='⠁⠂⠄⡀⢀⠠⠐⠈' local charwidth=3 ;; 1) local spin='-\|/' local charwidth=1 ;; 2) local spin="▁▂▃▄▅▆▇█▇▆▅▄▃▂▁" local charwidth=3 ;; 3) local spin="▉▊▋▌▍▎▏▎▍▌▋▊▉" local charwidth=3 ;; 4) local spin='←↖↑↗→↘↓↙' local charwidth=3 ;; 5) local spin='▖▘▝▗' local charwidth=3 ;; 6) local spin='┤┘┴└├┌┬┐' local charwidth=3 ;; 7) local spin='◢◣◤◥' local charwidth=3 ;; 8) local spin='◰◳◲◱' local charwidth=3 ;; 9) local spin='◴◷◶◵' local charwidth=3 ;; 10) local spin='◐◓◑◒' local charwidth=3 ;; 11) local spin='⣾⣽⣻⢿⡿⣟⣯⣷' local charwidth=3 ;; esac local i=0 tput civis # cursor invisible while kill -0 $pid 2>/dev/null; do local i=$(((i + $charwidth) % ${#spin})) printf "%s" "${spin:$i:$charwidth}" cursorBack 1 sleep .1 done tput cnorm wait $pid # capture exit code echo "123" return $? } ("$@") & spinner $!