Tengo una echo
impresión simple que he agregado a mi .bashrc
:
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
sleep 2s
echo "$(tput setaf 2)Wake up....."
sleep 2s
reset
echo "$(tput setaf 2)Wake up neo....."
sleep 2s
echo "$(tput setaf 2)The Matrix has you......"
sleep 2s
reset
echo "$(tput setaf 2)Follow the white rabbit......"
sleep 2s
reset
cmatrix
Esto imprime un mensaje en la terminal, pero quiero que parezca que se está escribiendo, con un retraso constante entre los caracteres.
command-line
bash
echo
Simplemente simplificado
fuente
fuente
Respuestas:
Esto no funciona con Wayland; Si estás usando Ubuntu 17.10 y no cambiaste a Xorg al iniciar sesión, esta solución no es para ti.
Puedes usar
xdotool
para eso. Si el retraso entre las pulsaciones de teclas debe ser constante , es tan simple como eso:Esto escribe
something
con un retraso de100
milisegundos entre cada pulsación de tecla.Si el retraso entre las pulsaciones de teclas debe ser aleatorio , digamos de 100 a 300 milisegundos, las cosas se vuelven un poco más complicadas:
Este
for
bucle pasa a través de cada letra de la cadena guardado en la variabletext
, la impresión, ya seakey <letter>
okey space
en el caso de un espacio seguido desleep 0.
y un número aleatorio entre 1 y 3 (xdotool
'ssleep
interpreta el número como segundos). Luego se canaliza toda la salida del buclexdotool
, que imprime las letras con el retraso aleatorio en el medio. Si desea cambiar la demora, simplemente cambie la parte, siendo el límite inferior y el superior, durante 0.2 a 0.5 segundos sería .(RANDOM%x)+y
y
x-1+y
(RANDOM%4)+2
Tenga en cuenta que este enfoque no imprime el texto, sino que lo escribe exactamente como lo haría el usuario, sintetizando pulsaciones de teclas individuales. En consecuencia, el texto se escribe en la ventana actualmente enfocada; si cambia el foco, la parte del texto se escribirá en la ventana recién enfocada, que puede o no ser lo que desea. En cualquier caso, eche un vistazo a las otras respuestas aquí, ¡todas las cuales son brillantes!
fuente
Intenté xdotool después de leer la respuesta de @ dessert pero no pude hacerlo funcionar por alguna razón. Entonces se me ocurrió esto:
Canalice su texto en el código anterior y se imprimirá como mecanografiado. También puede agregar aleatoriedad reemplazando
sleep 0.1
consleep 0.$((RANDOM%3))
.Versión extendida con errores tipográficos
Esta versión introducirá un error tipográfico de vez en cuando y lo corregirá:
fuente
while IFS= read -r line; do for (( i = 0; i < ${#line}; i++ )); do sleep 0.1; printf "%s" "${line:i:1}"; done; echo; done
(reemplazar;
con nuevas líneas y buena sangría según sea necesario). ElIFS= read -r
yprintf "%s"
asegúrese de que los espacios en blanco y los caracteres especiales no se traten de manera diferente. Ygrep
en cada línea para dividir en caracteres es innecesario: solo unfor
bucle sobre cada carácter en la línea es suficiente.Mencionas un retraso constante entre los caracteres, pero si realmente quieres que parezca que está siendo tipeado, el tiempo no será perfectamente consistente. Para lograr esto, puede grabar su propia escritura con el
script
comando y reproducirlo conscriptreplay
:La grabación se detiene presionando CTRL-D.
Pasar el
-t
parámetro ascript
instrucciones también genera información de tiempo, que he redirigido alscript.timing
archivo. He pasadosed d
como un comando a,script
ya que esta es simplemente una forma de absorber la entrada (y esto registra las pulsaciones de teclas) sin efectos secundarios.Si desea hacer todas las cosas
tput
/reset
también, es posible que desee hacer unascript
grabación para cada una de sus líneas y reproducirlas, intercaladas con los comandostput
/reset
.fuente
Otra posibilidad es usar Demo Magic o, para ser más precisos, solo la función de impresión de esta colección de scripts, que básicamente equivale a
Debajo del capó, esto usa pv , que por supuesto también puede usar para obtener directamente el efecto deseado, la forma básica se ve de la siguiente manera:
fuente
echo
apv
, sólo tiene que utilizarpv -qL20 <<< "Hello world"
si es que admite la concha herestrings.En línea con mi apodo, puedo ofrecer otra solución:
Se ve raro, ¿no?
-MTime::HiRes=usleep
importa la funciónusleep
(suspensión de microsegundos) delTime::HiRes
módulo porque lo habitualsleep
solo acepta segundos enteros.-F''
divide la entrada dada en caracteres (el delimitador está vacío''
) y coloca los caracteres en la matriz@F
.BEGIN {$|=1}
desactiva el almacenamiento en búfer de salida para que cada carácter se imprima inmediatamente.for (@F) { print; usleep(100_000+rand(200_000)) }
solo itera sobre los personajes1_000
(==1000
) o incluso1_0_00
si consideramos que es más fácil de leer.rand()
devuelve un número aleatorio entre 0 y el argumento dado, por lo que juntos duerme entre 100,000 y 299,999 microsegundos (0.1-0.3 segundos).fuente
rand()
Devuelve un número de 0 al argumento (100k a 300k en su ejemplo) o entre ellos (100k + 1 a 300k-1 en su ejemplo)?[0,200k)
, es decir, incluye 0 pero excluye 200k. El comportamiento exacto se documenta aquí : "Devuelve un número fraccionario aleatorio mayor o igual a 0 y menor que el valor de EXPR. (EXPR debe ser positivo)"-F
implica-a
e-a
implica-n
.Otra herramienta que podría funcionar, que no depende de x11 o lo que sea, es el asciicinema . Registra todo lo que haces en tu terminal y te permite reproducirlo como si fuera una captura de pantalla, ¡solo entonces está basado exclusivamente en ASCII! Sin embargo, es posible que deba deshabilitar temporalmente su solicitud para que sea puramente visualmente limpio. Como otros han señalado, agregar un retraso constante no se verá natural, y escribirlo usted mismo podría ser uno de los looks más naturales que puede lograr.
Después de haber grabado el texto, puede hacer algo como:
fuente
Me sorprende que nadie haya mencionado esto todavía, pero puede lograr esto con herramientas de stock y un bucle:
Simplemente recorre la entrada carácter por carácter y los imprime con un retraso después de cada uno. Lo único complicado es que debe configurar su IFS en una cadena vacía para que bash no intente separar sus espacios.
Esta solución es muy simple, por lo que agregar retardos variables entre caracteres, errores tipográficos, lo que sea súper fácil.
EDITAR (gracias, @dessert): si quieres una interfaz un poco más natural, puedes hacerlo
Esto le permitiría llamar a la función en
typeit foo bar
lugar detypeit 'foo bar'
. Tenga en cuenta que sin comillas, los argumentos están sujetos a la división de palabras de bash, por lo que, por ejemplo,typeit foo<space><space>bar
se imprimiránfoo<space>bar
. Para preservar los espacios en blanco, use comillas.fuente
typeit foo<space>bar
dará como resultadofoo bar
, mientrastypeit foo<space><space>bar
que también dará como resultadofoo bar
. Tienes que citarlo para asegurarte de que sea literal. @dessert no dude en sugerir una edición. Puedo hacerlo yo mismo, pero quiero darle la oportunidad de obtener crédito por ello.read -n1
(que, por cierto, estáread -k1
en zsh)Primero, "parece que está siendo mecanografiado, con un retraso constante entre los caracteres ..." es un poco contradictorio, como han señalado otros. Algo que se está escribiendo no tiene un retraso constante. Cuando vea algo producido con un retraso inconsistente, obtendrá escalofríos. "¡¿Qué ha tomado mi computadora ?!"
De todas formas...
Tengo que gritar
expect
, que debería estar disponible en la mayoría de las distribuciones de Linux. Old School, lo sé, pero, suponiendo que esté instalado, difícilmente podría ser más simple:Desde la página del manual:
Ver https://www.tcl.tk/man/expect5.31/expect.1.html
fuente