From f6500de2213173f742e0cd7af69f063cdb6bc8ce Mon Sep 17 00:00:00 2001 From: Andre Lademann Date: Mon, 22 May 2017 17:01:22 +0200 Subject: [PATCH 1/4] Use colour codes that also works with OSX --- spinner.sh | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/spinner.sh b/spinner.sh index 423e49b..a74cef0 100755 --- a/spinner.sh +++ b/spinner.sh @@ -29,10 +29,10 @@ function _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" + local white="\033[0;37m" + local green="\033[01;32m" + local red="\033[01;31m" + local nc="\033[0m" case $1 in start) @@ -90,4 +90,3 @@ function stop_spinner { _spinner "stop" $1 $_sp_pid unset _sp_pid } - From fb101dafa32e00e6717bc8db927f920b3936c483 Mon Sep 17 00:00:00 2001 From: Andre Lademann Date: Mon, 22 May 2017 18:29:19 +0200 Subject: [PATCH 2/4] Align the spinner on the left side --- spinner.sh | 54 ++++++++++++++++++++++++------------------------------ test.sh | 11 +++++------ 2 files changed, 29 insertions(+), 36 deletions(-) diff --git a/spinner.sh b/spinner.sh index a74cef0..9d87884 100755 --- a/spinner.sh +++ b/spinner.sh @@ -1,34 +1,30 @@ -#!/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" + # $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" @@ -36,33 +32,31 @@ function _spinner() { 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} + # Display message and position the cursor in $column column while : do - printf "\b${sp:i++%${#sp}:1}" + echo -en "\r[ ${sp:i++%${#sp}:1} ] ${2}" 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 +65,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,7 +79,7 @@ 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 $? From 44d54ae4577ed05839b574a054597381775303b9 Mon Sep 17 00:00:00 2001 From: Andre Lademann Date: Mon, 22 May 2017 21:29:48 +0200 Subject: [PATCH 3/4] Added optional timer --- README | 16 ---------------- README.md | 22 ++++++++++++++++++++++ spinner.sh | 23 +++++++++++++++++++---- 3 files changed, 41 insertions(+), 20 deletions(-) delete mode 100644 README create mode 100644 README.md 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..ec57838 --- /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 9d87884..0fb1961 100755 --- a/spinner.sh +++ b/spinner.sh @@ -15,7 +15,6 @@ # spinner_stop [your command's exit status] # # Also see: test.sh - function _spinner() { # $1 start/stop @@ -37,13 +36,29 @@ function _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 - echo -en "\r[ ${sp:i++%${#sp}:1} ] ${2}" - 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 ;; From 06ab56b17134ab4f73c1559f34b3f58639a92507 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Lademann?= Date: Mon, 22 May 2017 21:30:55 +0200 Subject: [PATCH 4/4] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index ec57838..54832ab 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # spinner.sh - Display an awesome 'spinner' while running your long shell commands + Display an awesome 'spinner' while running your long shell commands Do *NOT* call _spinner function directly. Use spinner_{start,stop} wrapper functions!