J'ai une echo
impression simple que j'ai ajoutée à mon .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
Cela imprime un message sur le terminal, mais je veux qu'il semble être en cours de frappe, avec un délai constant entre les caractères.
command-line
bash
echo
Simplement simplifié
la source
la source
Réponses:
Cela ne fonctionne pas avec Wayland; si vous utilisez Ubuntu 17.10 et n'avez pas changé pour utiliser Xorg à la connexion, cette solution n'est pas pour vous.
Vous pouvez l'utiliser
xdotool
pour cela. Si le délai entre les frappes doit être cohérent , c'est aussi simple que cela:Cela tape
something
avec un délai de quelques100
millisecondes entre chaque frappe.Si le délai entre les frappes doit être aléatoire , disons de 100 à 300 millisecondes, les choses se compliquent un peu:
Cette
for
boucle parcourt chaque lettre de la chaîne enregistrée en variabletext
, en imprimant soitkey <letter>
oukey space
dans le cas d'un espace suivi d'sleep 0.
un nombre aléatoire compris entre 1 et 3 (xdotool
ssleep
interprète le nombre en secondes). La sortie entière de la boucle est ensuite dirigée versxdotool
, qui imprime les lettres avec le retard aléatoire entre les deux. Si vous voulez changer le retard, changez simplement la partie, étant la limite inférieure et la limite supérieure - pendant 0,2 à 0,5 seconde, ce serait .(RANDOM%x)+y
y
x-1+y
(RANDOM%4)+2
Notez que cette approche n'imprime pas le texte, mais plutôt le tape exactement comme le ferait l'utilisateur, en synthétisant des touches uniques. En conséquence, le texte est tapé dans la fenêtre actuellement focalisée; si vous modifiez la partie de mise au point du texte sera tapé dans la fenêtre nouvellement mise au point, qui peut ou non être ce que vous voulez. Dans les deux cas, jetez un œil aux autres réponses ici, qui sont toutes géniales!
la source
J'ai essayé xdotool après avoir lu la réponse de @ dessert mais je n'ai pas pu le faire fonctionner pour une raison quelconque. J'ai donc trouvé ceci:
Canalisez votre texte dans le code ci-dessus et il sera imprimé comme tapé. Vous pouvez également ajouter un caractère aléatoire en le remplaçant
sleep 0.1
parsleep 0.$((RANDOM%3))
.Version étendue avec fausses fautes de frappe
Cette version introduira une fausse faute de temps en temps et la corrigera:
la source
while IFS= read -r line; do for (( i = 0; i < ${#line}; i++ )); do sleep 0.1; printf "%s" "${line:i:1}"; done; echo; done
(remplacer;
par des retours à la ligne et une bonne indentation si nécessaire). LeIFS= read -r
et faire enprintf "%s"
sorte que les caractères blancs et spéciaux ne sont pas traités différemment. Et lagrep
division de chaque ligne en caractères n'est pas nécessaire - une simplefor
boucle sur chaque caractère de la ligne suffit.Vous mentionnez un délai constant entre les caractères, mais si vous voulez vraiment qu'il ressemble à sa frappe, le timing ne sera pas parfaitement cohérent. Pour ce faire, vous pouvez enregistrer votre propre frappe avec la
script
commande et la lire avecscriptreplay
:L'enregistrement est arrêté en appuyant sur CTRL-D.
Passer le
-t
paramètre pour l'script
instruire génère également des informations de synchronisation, que j'ai redirigées vers lescript.timing
fichier. J'ai passésed d
une commande àscript
car c'est simplement un moyen d'absorber l'entrée (et cela enregistre les frappes) sans effets secondaires.Si vous voulez aussi faire toutes les choses
tput
/reset
, vous voudrez peut-être faire unscript
enregistrement pour chacune de vos lignes, et les lire, entrelacées avec les commandestput
/reset
.la source
Une autre possibilité consiste à utiliser Demo Magic , ou, pour être plus précis, la fonction d'impression de cette collection de scripts, ce qui revient à
Sous le capot, cela utilise du pv , que vous pouvez bien sûr également utiliser pour obtenir directement l'effet souhaité, la forme de base se présente comme suit:
la source
echo
verspv
, utilisez simplementpv -qL20 <<< "Hello world"
si votre coque prend en charge les chaînes de caractères.Conformément à mon surnom, je peux proposer une autre solution:
Ça a l'air bizarre, non?
-MTime::HiRes=usleep
importe la fonctionusleep
(veille microseconde) duTime::HiRes
module car l'habituelsleep
n'accepte que des secondes entières.-F''
divise l'entrée donnée en caractères (le délimiteur étant vide''
) et place les caractères dans le tableau@F
.BEGIN {$|=1}
désactive la mise en mémoire tampon de sortie afin que chaque caractère soit immédiatement imprimé.for (@F) { print; usleep(100_000+rand(200_000)) }
itère juste sur les personnages1_000
(==1000
) ou même1_0_00
si nous considérons que c'est plus facile à lire.rand()
renvoie un nombre aléatoire compris entre 0 et l'argument donné, donc ensemble, il dort entre 100 000 et 299 999 microsecondes (0,1-0,3 secondes).la source
rand()
renvoie un nombre de 0 à l'argument (100k à 300k dans votre exemple) ou entre eux (100k + 1 à 300k-1 dans votre exemple)?[0,200k)
, c'est-à-dire incluant 0 mais excluant 200k. Le comportement exact est documenté ici : "Renvoie un nombre fractionnaire aléatoire supérieur ou égal à 0 et inférieur à la valeur de EXPR. (EXPR doit être positif.)"-F
implique-a
et-a
implique-n
.Un autre outil qui pourrait fonctionner, qui ne dépend pas de x11 ou autre, est l' asciicinema . Il enregistre tout ce que vous faites dans votre terminal et vous permet de rejouer cela comme s'il s'agissait d'une capture d'écran, alors il est uniquement basé sur ascii! Vous devrez peut-être désactiver temporairement votre invite pour qu'elle soit purement visuellement propre. Comme d'autres l'ont souligné, l'ajout d'un retard cohérent ne semblera pas naturel, et le taper vous-même pourrait être l'un des looks les plus naturels que vous puissiez obtenir.
Après avoir enregistré le texte, vous pouvez faire quelque chose comme:
la source
Je suis surpris que personne n'en ait encore parlé, mais vous pouvez le faire avec des outils de stock et une boucle:
Il boucle simplement le caractère entré caractère par caractère et les imprime avec un retard après chacun. Le seul problème est que vous devez définir votre IFS sur une chaîne vide afin que bash n'essaie pas de séparer vos espaces.
Cette solution est extrêmement simple, donc ajouter des délais variables entre les caractères, les fautes de frappe, tout ce qui est super facile.
EDIT (merci, @dessert): Si vous voulez une interface légèrement plus naturelle, vous pouvez plutôt faire
Cela vous permettrait d'appeler la fonction
typeit foo bar
plutôt quetypeit 'foo bar'
. Sachez que sans guillemets, les arguments sont sujets au fractionnement des mots de bash, donc par exempletypeit foo<space><space>bar
s'imprimentfoo<space>bar
. Pour préserver les espaces, utilisez des guillemets.la source
typeit foo<space>bar
se traduira parfoo bar
, tandis quetypeit foo<space><space>bar
se traduira également parfoo bar
. Vous devez le citer pour vous assurer qu'il est textuel. @dessert n'hésitez pas à suggérer une modification. Je peux le faire moi-même, mais je veux vous donner la chance d'en avoir le mérite.read -n1
(qui, en fait, estread -k1
en zsh)Tout d'abord, "on dirait qu'il est en train d'être tapé, avec un décalage constant entre les caractères ..." est un peu contradictoire, comme d'autres l'ont souligné. Un élément tapé n'a pas de délai constant. Lorsque vous voyez quelque chose produit avec un retard incohérent, vous aurez des frissons. "Qu'est-ce qui a pris mon ordinateur !!! ??!?"
En tous cas...
Je dois faire un cri à
expect
, qui devrait être disponible sur la plupart des distributions Linux. Old School, je sais, mais - en supposant qu'il soit installé - cela pourrait difficilement être plus simple:Depuis la page de manuel:
Voir https://www.tcl.tk/man/expect5.31/expect.1.html
la source