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?
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?
Respuestas:
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 while
bucle es infinito. El for
bucle recorre cada carácter de la cadena dada en $chars
. echo
imprime el personaje, con un retorno de carro \r
, pero sin salto de línea -n
. -e
fuerza el eco para interpretar secuencias de escape como \r
. Hay un retraso de 0.5 segundos entre cada cambio.
echo
... pero, por supuesto, printf
también funciona. ^^
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.
spinner &
, almacenaría el pid en una variable local spinner_pid=$!
y luego reemplazaría la llamada de matar conkill $spinner_pid &>/dev/null
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, symbols
es una variable de matriz, y los contenidos si se giran / desplazan, porque $symbols[2..-1]
son todas las entradas menos la primera.
printf "%s\r" "${chars:$i:1}"
?