¿Cómo crear una animación de rotación usando el script de shell?

10

Busco a una secuencia de comandos que crea una animación de giro con carácter /, -, |y \.

Si cambia continuamente entre estos caracteres, debería verse como si estuviera girando. ¿Cómo hacer esto?

Ornitorrinco anónimo
fuente

Respuestas:

21

Usa ese script:

#!/bin/bash

chars="/-\|"

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

El whilebucle es infinito. El forbucle recorre cada carácter de la cadena dada en $chars. echoimprime el personaje, con un retorno de carro \r, pero sin salto de línea -n. -efuerza el eco para interpretar secuencias de escape como \r. Hay un retraso de 0.5 segundos entre cada cambio.

caos
fuente
Inteligente, +1, pero ¿por qué no printf "%s\r" "${chars:$i:1}"?
terdon
1
El primer pensamiento de @terdon fue echo... pero, por supuesto, printftambién funciona. ^^
caos
20

Aquí hay un ejemplo de uso \b, que le dice al emulador de terminal que mueva el cursor una columna hacia la izquierda, para seguir sobrescribiendo el mismo carácter una y otra vez.

#!/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'

Ver BashFAQ 34 para más información.

geirha
fuente
77
Gran código Sin embargo, haría una pequeña modificación. Después de ejecutar spinner &, almacenaría el pid en una variable local spinner_pid=$!y luego reemplazaría la llamada de matar conkill $spinner_pid &>/dev/null
dberm22
1

Como no pides explícitamente bash, un pequeño tapón para la concha de pescado , donde esto se puede resolver maravillosamente IMO:

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

En este caso, symbolses una variable de matriz, y los contenidos si se giran / desplazan, porque $symbols[2..-1]son todas las entradas menos la primera.

Pompeya2
fuente