Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use colour codes that also works with OSX #4

Open
wants to merge 4 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 0 additions & 16 deletions README

This file was deleted.

22 changes: 22 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -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_
84 changes: 46 additions & 38 deletions spinner.sh
Original file line number Diff line number Diff line change
@@ -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 <[email protected]>
# @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
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I get this error with zsh

$ source fidget.sh

$ spinner_start sleep 1
_spinner:40: unrecognized modifier `i'

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@gianpaj
Okay, but it's made for bash.

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
Expand All @@ -71,23 +80,22 @@ 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
_sp_pid=$!
disown
}

function stop_spinner {
function spinner_stop {
# $1 : command exit status
_spinner "stop" $1 $_sp_pid
unset _sp_pid
}

11 changes: 5 additions & 6 deletions test.sh
Original file line number Diff line number Diff line change
@@ -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 $?