Shell-Session-Recordings mit asciinema via Skript
Ich hab mir in der Adventszeit mit meinen Kollegen Gedanken darüber gemacht, wie wir Linux-Befehle für unsere Schülerinnen und Schüler besser zugänglich machen. Die Lebenswelt unserer Lernenden fordert an dieser Stelle häufig … Videos. Das ist aber so überhaupt nicht meine Art der Unterrichtsgestaltung. Ich hab zwar schon das ein oder andere Video erstellt, aber das skaliert nicht im Alltag für dutzende Themen.
Dabei fiel mir ein, dass ich schon vor drei Jahren mit asciinema experimentiert hatte. Allerdings ist das damals für mich eingeschlafen. Nun nahm ich gestern einen neuen Anlauf und hab drei Bash-Sessions aufgenommen. Das ist relativ einfach. Allerdings vertippte ich mich häufig bei der Eingabe und musste die Befehls-Sequenzen wiederholt aufnehmen. Und mit dem Endergebnis war ich immer noch nicht zufrieden.
Das war etwas frustrierend und ich dachte mir … das kann ich doch mit einem kleinen Bash-Skript lösen. Die Umsetzung und das Ergebnis beschreibe ich im folgenden Beitrag.
Zu Beginn hab ich die Doku von asciinema, die Issues auf dem entsprechenden Git-Repo und die Suchmaschine meines Vertrauens benutzt um zu schauen, was für Möglichkeiten ich habe und ob nicht doch schon jemand das Problem gelöst hatte. Letzteres war auch so. Aber die Skripte haben entweder nicht so funktioniert wie ich das wollte oder ich kam nicht damit klar.
Wenn die Tools mehr als 20 Zeilen Code hatten, hab ich auch nicht verstanden warum das so sein muss. Ich will ja nur einfaches Skript, das eine Textdatei mit Befehlen ausliest und dann bei der Aufnahme eine User-Eingabe simuliert. Für letzteres gibt es ein kleines Tool pv
(Pipe Viewer) mit dem man genau das einfach machen kann. So erzeugt der Aufruf …
echo Hallo Welt | pv -qL 10
… eine solche gewünschte simulierte Eingabe: Die Zeichenkette Hallo Welt
wird Zeichen für Zeichen verzögert ausgegeben. Die Geschwindigkeit (-L = Rate Limit) ist auf 10 Zeichen pro Sekunde begrenzt und es werden keine Zeitangaben dargestellt (-q = quiet). Mein Gedanke: Kann also nicht so schwer sein.
Nach einigen Versuchen, kam dann das folgende Skript aus meinen Fingern (Stand: 06.01.2025). Dieses liegt auch auf Codeberg unter https://codeberg.org/toheine/autotype_commands:
|
|
Vernachlässigt man die Leerzeilen und die Kommentare sind das 16 Zeilen Code. Dabei werden …
- einen Standardprompt simuliert,
- die notwendigen Befehle von einer Datei eingelesen ($1)
- eine verzögerte Usereingabe simuliert und
- bei Bedarf die Ausführung in einem andern Ordner vorgenommen (Optionales $2).
Die Befehle schreibt man in eine Textdatei. Hierzu habe ich im entsprechenden Git-Repo eine demo.txt hinterlegt, die wie folgt aufgebaut ist:
|
|
Die Idee: Kommentare (Zeilen die mit “#” beginnen), sind die Anweisungen. Die übrigen Zeilen entsprechen den jeweiligen Befehlen.
Damit ist das Skript fertig und es kann mit folgendem Aufruf gestartet werden:
./autotype_commands.sh demo.txt
Soll ein anderes Verzeichnis als Start-Ordner verwendet werden, muss dieses vorher angelegt sein. Evtl. ist es sinnvoll darin dann ein paar Beispieldateien zu hinterlegen:
mkdir ~/workdir
cd ~/workdir
touch file1 file2 file3
cd -
Im Anschluss erfolgt der Aufruf mit einem weiteren Argument. Beispiel:
./autotype_commands.sh demo.txt ~/workdir
Die Aufnahme erfolgt mit dem Programm asciinema [as-kee-nuh-muh] das aus den Paketquellen installiert werden kann (siehe hierzu: https://docs.asciinema.org/getting-started). Mit dem folgenden Aufruf wird eine Aufnahme mit rec
gestartet, diese in die Datei demo.cast
gespeichert und und als Kommando -c
mein autotype-Skript übergeben.
asciinema rec demo.cast -c "./autotype_commands.sh demo.txt"
Sofern man wiederholt die gleiche cast-Datei erstellen will (z. B. beim Feintuning der Befehle), wirft asscinema einen Fehler. Dieser kann mit der overwrite
-Option vermieden werden:
asciinema rec demo.cast --overwrite -c "./autotype_commands.sh demo.txt"
Wie bereits oben erwähnt … Ausführung von einem anderen Startverzeichnis aus, geht ebenfalls:
asciinema rec demo.cast --overwrite -c "./autotype_commands.sh demo.txt ~/workdir"
Das Ergebnis kann man direkt auf der Konsole anschauen:
asciinema play demo.cast
Bei Bedarf kann diese Aufnahme noch auf den asciinema-Server oder eine eigene Serverinstanz hoch geladen werden. Hierzu empfiehlt es sich die Doku von asciinema
zu sichten.
Der Aufruf oben führt zu folgendem Ergebnis:
Ich bin damit zufrieden. Bash-Screen-Recordings zu erstellen, bedeutet für mich in Zukunft, kleine Textdateien zu verfassen und diese via Skript an asciinema
zu übergeben. So ist das für mich jetzt gut handlebar. Nun müssen nur noch meine Lernenden diese Videos auch nutzen und einen Mehrwert daraus ziehen.
Mit dem Skript wird ein Pseudo-Prompt generiert. Ursprünglich war das nur zu Testzwecken enthalten. Ich finde das aber eigentlich eine gute Idee, da ich meinen Prompt immer stark anpasse und ich auf diese Weise meine Schülerinnen und Schülern einen Standardprompt biete. Das bedeutet aber auch, dass Recordings von anderen Shells mit meinem Skript fehlerhaft dargestellt werden.