diff --git a/README b/README deleted file mode 100644 index c3b7058..0000000 --- a/README +++ /dev/null @@ -1,16 +0,0 @@ -spinner.sh - -Display an awesome 'spinner' while running your long shell commands - -Do *NOT* call _spinner function directly. -Use {start,stop}_spinner wrapper functions - -usage: - 1. source this script in your's - 2. start the spinner: - start_spinner [display-message-here] - 3. run your command - 4. stop the spinner: - stop_spinner [your command's exit status] - -Also see: test.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..54832ab --- /dev/null +++ b/README.md @@ -0,0 +1,22 @@ +# spinner.sh + + Display an awesome 'spinner' while running your long shell commands + +Do *NOT* call _spinner function directly. +Use spinner_{start,stop} wrapper functions! + +## Usage + + 1. source this script in your's + 2. start the spinner: + spinner_start [display-message-here] + 3. run your command + 4. stop the spinner: + spinner_stop [your command's exit status] + +### Options + + 1. Use timer with ``SPINNER_TIMER=true`` + 2. Configure spin speed with ``SPINNER_DELAY=0.5`` + +_See also: test.sh_ diff --git a/spinner.sh b/spinner.sh index 423e49b..0fb1961 100755 --- a/spinner.sh +++ b/spinner.sh @@ -1,68 +1,77 @@ -#!/bin/bash +#!/usr/bin/env bash -# Author: Tasos Latsas - -# spinner.sh -# -# Display an awesome 'spinner' while running your long shell commands +# St. Benno # -# Do *NOT* call _spinner function directly. -# Use {start,stop}_spinner wrapper functions - -# usage: +# @project BashSpinner +# @author Tasos Latsas +# @author André Lademann +# @link http://fitnr.com/showing-a-bash-spinner.html +# @example # 1. source this script in your's # 2. start the spinner: -# start_spinner [display-message-here] +# spinner_start [display-message-here] # 3. run your command # 4. stop the spinner: -# stop_spinner [your command's exit status] +# spinner_stop [your command's exit status] # # Also see: test.sh - - function _spinner() { + # $1 start/stop # # on start: $2 display message # on stop : $2 process exit status - # $3 spinner function pid (supplied from stop_spinner) - - local on_success="DONE" - local on_fail="FAIL" - local white="\e[1;37m" - local green="\e[1;32m" - local red="\e[1;31m" - local nc="\e[0m" + # $3 spinner function pid (supplied from spinner_stop) + local on_success=" ok " + local on_fail="fail" + local white="\033[0;37m" + local green="\033[01;32m" + local red="\033[01;31m" + local nc="\033[0m" case $1 in start) - # calculate the column where spinner and status msg will be displayed - let column=$(tput cols)-${#2}-8 - # display message and position the cursor in $column column - echo -ne ${2} - printf "%${column}s" + # Calculate the column where spinner and status msg will be displayed - # start spinner + # Start spinner i=1 sp='\|/-' - delay=${SPINNER_DELAY:-0.15} + delay=${SPINNER_DELAY:-0.25} + counter=0 + timer=0 + # Display message and position the cursor in $column column while : do - printf "\b${sp:i++%${#sp}:1}" - sleep $delay + + # Display seconds or minutes it takes + if [[ ${SPINNER_TIMER} ]]; then + counter=$(echo "(${counter} + ${delay})" | bc) + timer=$(echo $counter/1 | bc) + if [[ "${timer}" -lt 60 ]]; then + timer="${timer} sec" + else + timer="$(echo ${timer} / 60 | bc) min " + fi + echo -en "\r[ ${sp:i++%${#sp}:1} ] ${timer}\t${2}" + else + echo -en "\r[ ${sp:i++%${#sp}:1} ]\t${2}" + fi + + sleep ${delay} done + ;; stop) if [[ -z ${3} ]]; then - echo "spinner is not running.." + echo -en "[${red}${on_fail}${nc}] Spinner is not running." exit 1 fi kill $3 > /dev/null 2>&1 - # inform the user uppon success or failure - echo -en "\b[" + # Inform the user upon success or failure + echo -en "\r[" if [[ $2 -eq 0 ]]; then echo -en "${green}${on_success}${nc}" else @@ -71,13 +80,13 @@ function _spinner() { echo -e "]" ;; *) - echo "invalid argument, try {start/stop}" + echo -en "[${red}${on_fail}${nc}] Invalid argument, try {start/stop}" exit 1 ;; esac } -function start_spinner { +function spinner_start { # $1 : msg to display _spinner "start" "${1}" & # set global spinner pid @@ -85,9 +94,8 @@ function start_spinner { disown } -function stop_spinner { +function spinner_stop { # $1 : command exit status _spinner "stop" $1 $_sp_pid unset _sp_pid } - diff --git a/test.sh b/test.sh index ff3ab64..10dc05c 100755 --- a/test.sh +++ b/test.sh @@ -1,17 +1,16 @@ #!/bin/bash -source "$(pwd)/spinner.sh" +. "$(pwd)/spinner.sh" # test success -start_spinner 'sleeping for 2 secs...' +spinner_start 'sleeping for 2 secs...' sleep 2 -stop_spinner $? +spinner_stop $? # test fail -start_spinner 'copying non-existen files...' +spinner_start 'copying non-existen files...' # use sleep to give spinner time to fork and run # because cp fails instantly sleep 1 cp 'file1' 'file2' > /dev/null 2>&1 -stop_spinner $? - +spinner_stop $?