Jak utworzyć animację obrotu za pomocą skryptu powłoki?

10

Szukam skrypt, który tworzy animację obrotu za pomocą znaku /, -, |i \.

Jeśli ciągle przełączasz się między tymi postaciami, powinno to wyglądać, jakby się obracało. Jak to zrobić?

Anonimowy Dziobak
źródło

Odpowiedzi:

21

Użyj tego skryptu:

#!/bin/bash

chars="/-\|"

while :; do
  for (( i=0; i<${#chars}; i++ )); do
    sleep 0.5
    echo -en "${chars:$i:1}" "\r"
  done
done

whilePętla uruchamia nieskończona. W forbiegnie pętla koryta każdy znak w ciągu danego $chars. echowypisuje znak ze znakiem powrotu karetki \r, ale bez podziału linii -n. -ezmusza echo do interpretowania sekwencji ucieczki, takich jak \r. Pomiędzy każdą zmianą występuje opóźnienie 0,5 sekundy.

chaos
źródło
Sprytnie, +1, ale dlaczego nie printf "%s\r" "${chars:$i:1}"?
terdon
1
@terdon na początku pomyślał echo... ale oczywiście printfteż działa. ^^
chaos
20

Oto przykład użycia \b, który mówi emulatorowi terminala, aby przesunął kursor o jedną kolumnę w lewo, aby ciągle nadpisywać ten sam znak.

#!/usr/bin/env bash

spinner() {
    local i sp n
    sp='/-\|'
    n=${#sp}
    printf ' '
    while sleep 0.1; do
        printf "%s\b" "${sp:i++%n:1}"
    done
}

printf 'Doing important work '
spinner &

sleep 10  # sleeping for 10 seconds is important work

kill "$!" # kill the spinner
printf '\n'

Więcej informacji w BashFAQ 34 .

geirha
źródło
7
Świetny kod. Dokonałbym jednak jednej małej modyfikacji. Po uruchomieniu spinner &spinner_pid=$!kill $spinner_pid &>/dev/null
zapisałbym
Chciałbym dodać tput civis #hide cursoritput cnorm #show cursor
Ishtiyaq Husain
1

Ponieważ nie pytasz wprost o bash, małą wtyczkę do skorupy ryby , gdzie można to pięknie rozwiązać IMO:

set -l symbols    
while sleep 0.5
    echo -e -n "\b$symbols[1]"
    set -l symbols $symbols[2..-1] $symbols[1]
end

W tym przypadku symbolsjest zmienną tablicową, a zawartość, jeśli jest obrócona / przesunięta, ponieważ $symbols[2..-1]są to wszystkie wpisy oprócz pierwszego.

Pompei2
źródło