Ich habe einen einfachen echo
Ausdruck, den ich meinem hinzugefügt habe .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
Dies gibt eine Nachricht an das Terminal aus, aber ich möchte, dass sie so aussieht, als würde sie gerade getippt, mit einer gleichmäßigen Verzögerung zwischen den Zeichen.
command-line
bash
echo
SimplySimplified
quelle
quelle
Antworten:
Dies funktioniert nicht mit Wayland. Wenn Sie Ubuntu 17.10 verwenden und beim Anmelden nicht auf Xorg umgestellt haben, ist diese Lösung nichts für Sie.
Sie können dafür verwenden
xdotool
. Wenn die Verzögerung zwischen den Tastenanschlägen konsistent sein soll , ist es so einfach:Dies erfolgt
something
mit einer Verzögerung von100
Millisekunden zwischen jedem Tastendruck.Wenn die Verzögerung zwischen den Tastenanschlägen zufällig sein sollte , sagen wir zwischen 100 und 300 Millisekunden, wird es etwas komplizierter:
Diese
for
Schleife geht durch jeden einzelnen Buchstaben der Zeichenfolge in Variablen gespeicherttext
, das Drucken entwederkey <letter>
oderkey space
in dem Fall eines Raums , gefolgt vonsleep 0.
und eine Zufallszahl zwischen 1 und 3 (xdotool
‚ssleep
die Zahl als Sekunden interpretiert). Die gesamte Ausgabe der Schleife wird dann weitergeleitetxdotool
, wodurch die Buchstaben mit der zufälligen Verzögerung dazwischen gedruckt werden. Wenn Sie die Verzögerung ändern möchten, ändern Sie einfach den Teil, wobei es sich um die untere und die obere Grenze handelt - für 0,2 bis 0,5 Sekunden wäre dies der Fall .(RANDOM%x)+y
y
x-1+y
(RANDOM%4)+2
Beachten Sie, dass dieser Ansatz nicht funktioniert drucken den Text, sondern geben Sie es genau wie der Benutzer tun würde, die Synthese einzelner Tastenfolgen . Infolgedessen wird der Text in das aktuell fokussierte Fenster eingegeben. Wenn Sie den Fokus ändern, wird ein Teil des Texts in das neu fokussierte Fenster eingegeben, das möglicherweise nicht Ihren Wünschen entspricht. In beiden Fällen werfen Sie einen Blick auf die anderen Antworten, die alle brillant sind!
quelle
Nachdem ich die Antwort von @ dessert gelesen hatte, habe ich xdotool ausprobiert, konnte es aber aus irgendeinem Grund nicht zum Laufen bringen. Also habe ich mir Folgendes ausgedacht:
Füge deinen Text in den obigen Code ein und er wird wie geschrieben gedruckt. Sie können auch Zufälligkeit hinzufügen , indem Sie ersetzen
sleep 0.1
mitsleep 0.$((RANDOM%3))
.Erweiterte Version mit gefälschten Tippfehlern
Diese Version wird ab und zu einen gefälschten Tippfehler einführen und korrigieren:
quelle
while IFS= read -r line; do for (( i = 0; i < ${#line}; i++ )); do sleep 0.1; printf "%s" "${line:i:1}"; done; echo; done
(Ersetzen Sie diese;
durch Zeilenumbrüche und Einrückungen, falls erforderlich). DieIFS= read -r
und stellenprintf "%s"
sicher, dass Leerzeichen und Sonderzeichen nicht unterschiedlich behandelt werden. Und dasgrep
Aufteilen in Zeichen in jeder Zeile ist unnötig - nur einefor
Schleife über jedes Zeichen in der Zeile ist ausreichend.Sie erwähnen eine konsistente Verzögerung zwischen Zeichen, aber wenn Sie wirklich möchten, dass es so aussieht, als ob es getippt wird, ist das Timing nicht perfekt konsistent. Um dies zu erreichen, können Sie Ihre eigene Eingabe mit dem
script
Befehl aufzeichnen und sie wiedergeben mitscriptreplay
:Die Aufnahme wird durch Drücken von STRG-D gestoppt.
Wenn Sie den
-t
Parameter anscript
instructs übergeben, werden auch Zeitinformationen generiert, die ich in diescript.timing
Datei umgeleitet habe . Ich habesed d
als Befehl übergeben,script
da dies einfach eine Möglichkeit ist, Eingaben zu absorbieren (und dabei die Tastenanschläge aufzuzeichnen), ohne Nebenwirkungen zu haben.Wenn Sie auch alle
tput
/reset
-Dateien ausführen möchten, möchten Sie möglicherweisescript
für jede Ihrer Zeilen eine Aufnahme erstellen und diese mit den Befehlentput
/ interleaved wiedergebenreset
.quelle
Eine andere Möglichkeit ist die Verwendung von Demo Magic , genauer gesagt, die Druckfunktion dieser Skriptsammlung, die im Grunde genommen eine Rolle spielt
Unter der Haube wird hier pv verwendet , mit dem Sie natürlich auch direkt den gewünschten Effekt erzielen können. Die Grundform sieht folgendermaßen aus:
quelle
echo
pv
pv -qL20 <<< "Hello world"
Entsprechend meinem Spitznamen kann ich eine andere Lösung anbieten:
Sieht komisch aus, nicht wahr?
-MTime::HiRes=usleep
importiert die Funktionusleep
(Mikrosekunden-Ruhezustand) aus demTime::HiRes
Modul, da das Üblichesleep
nur ganzzahlige Sekunden akzeptiert.-F''
teilt die angegebene Eingabe in Zeichen auf (wobei der Begrenzer leer ist''
) und fügt die Zeichen in das Array ein@F
.BEGIN {$|=1}
Deaktiviert die Ausgabepufferung, sodass jedes Zeichen sofort gedruckt wird.for (@F) { print; usleep(100_000+rand(200_000)) }
iteriert nur über die Zeichen1_000
(==1000
) oder auch,1_0_00
wenn wir dies für leichter lesbar halten.rand()
Gibt eine Zufallszahl zwischen 0 und dem angegebenen Argument zurück. Zusammen ergibt dies einen Ruhezustand zwischen 100.000 und 299.999 Mikrosekunden (0,1-0,3 Sekunden).quelle
rand()
eine Zahl von 0 an das Argument zurück (100k bis 300k in Ihrem Beispiel) oder zwischen ihnen (100k + 1 bis 300k-1 in Ihrem Beispiel)?[0,200k)
, dh einschließlich 0, jedoch ausschließlich 200.000. Das genaue Verhalten ist hier dokumentiert : "Gibt eine zufällige gebrochene Zahl größer oder gleich 0 und kleiner als der Wert von EXPR zurück. (EXPR sollte positiv sein.)"-F
impliziert-a
und-a
impliziert-n
.Ein weiteres mögliches Tool, das nicht von x11 oder etwas anderem abhängt, ist das Asciicinema . Es zeichnet alles auf, was Sie in Ihrem Terminal tun, und lässt Sie wiedergeben, als wäre es eine Bildschirmaufnahme, nur dann ist es rein ascii-basiert! Möglicherweise müssen Sie Ihre Eingabeaufforderung jedoch vorübergehend deaktivieren, damit sie rein optisch sauber ist. Wie andere betont haben, erscheint das Hinzufügen einer konsistenten Verzögerung nicht natürlich, und das Eingeben selbst ist möglicherweise eines der natürlichsten Effekte, die Sie erzielen können.
Nachdem Sie den Text aufgenommen haben, können Sie Folgendes tun:
quelle
Ich bin überrascht, dass dies noch niemand erwähnt hat, aber Sie können dies mit Standardwerkzeugen und einer Schleife erreichen:
Es durchläuft die Eingabe nur zeichenweise und druckt sie jeweils verzögert aus. Das einzig schwierige ist, dass Sie Ihr IFS auf einen leeren String setzen müssen, damit bash nicht versucht, Ihre Leerzeichen aufzuteilen.
Diese Lösung ist denkbar einfach. Sie können also ganz einfach variable Verzögerungen zwischen Zeichen und Tippfehlern hinzufügen.
BEARBEITEN (danke, @dessert): Wenn Sie eine etwas natürlichere Oberfläche möchten, können Sie dies stattdessen tun
Auf diese Weise können Sie die Funktion as
typeit foo bar
anstatt aufrufentypeit 'foo bar'
. Beachten Sie, dass die Argumente ohne Anführungszeichen der Bash-Wortteilung unterliegen und beispielsweisetypeit foo<space><space>bar
gedruckt werdenfoo<space>bar
. Verwenden Sie Anführungszeichen, um Leerzeichen beizubehalten.quelle
typeit foo<space>bar
führen wirdfoo bar
, währendtypeit foo<space><space>bar
wird auch in Folgefoo bar
. Sie müssen es zitieren, um sicherzustellen, dass es wörtlich ist. @ Dessert zögern Sie nicht, eine Änderung vorzuschlagen. Ich kann es selbst tun, aber ich möchte Ihnen die Chance geben, dafür Anerkennung zu erhalten.read -n1
(die übrigensread -k1
in zsh ist)Erstens ist es ein wenig widersprüchlich, "so auszusehen, als würde es mit einer konstanten Verzögerung zwischen den Zeichen getippt ...", wie andere darauf hingewiesen haben. Etwas, das getippt wird, hat keine konstante Verzögerung. Wenn Sie etwas sehen, das mit einer inkonsistenten Verzögerung produziert wurde, bekommen Sie Schüttelfrost. "Was hat meinen Computer übernommen !!! ??!?"
Sowieso...
Ich muss einen Shout machen
expect
, der auf den meisten Linux-Distributionen verfügbar sein sollte. Old School, ich weiß, aber wenn es installiert ist, könnte es kaum einfacher sein:Von der Manpage:
Siehe https://www.tcl.tk/man/expect5.31/expect.1.html
quelle