<> == Can I do a spinner in Bash? == Sure! {{{ # Bash, with GNU sleep spin() { local i=0 local sp='/-\|' local n=${#sp} printf ' ' while sleep 0.1; do printf '\b%s' "${sp:i++%n:1}" done } }}} Each time the loop iterates, it displays the next character in the `sp` string, wrapping around as it reaches the end. (`i` is the position of the current character to display and `${#sp}` is the [[BashFAQ/007|length]] of the `sp` string). The `\b` string is replaced by a 'backspace' character. Alternatively, you could play with `\r` to go back to the beginning of the line. To slow it down, the `sleep` command is included inside the loop (after the `printf`). A POSIX equivalent would be: {{{ # POSIX sh spin() { sp='/-\|' printf ' ' while sleep 1; do printf '\b%.1s' "$sp" sp=${sp#?}${sp%???} done } }}} One way to use these spinners in a script is to run them as background processes, and kill them when you're done. For example, {{{ # POSIX sh spin & spinpid=$! # long-running commands here kill "$spinpid" }}} If you already have a loop which does a lot of work, you can write a function that "advances" the spinner one step at a time, and call it at the beginning of each iteration: {{{ # Bash sp='/-\|' sc=0 sn=${#sp} spin() { printf '\b%s' "${sp:sc++%sn:1}" } endspin() { printf '\r%s\n' "$*" } until work_done; do spin some_work ... done endspin }}} A similar technique can be used to build [[BashFAQ/044|progress bars]]. ---- CategoryShell