Die zur Bash kompatible Oil Shell soll mit ihrer innovativen Skriptsprache Oil Language vor allem Skriptentwicklern das Leben erleichtern.
Der Entwickler Andy Chu werkelt derzeit an zwei Baustellen gleichzeitig. Bereits recht fortgeschritten sind seine Arbeiten an der Oil Shell oder kurz Osh, die mit der allseits bekannten Bash kompatibel ist. Zum Redaktionsschluss lag die Version 0.6.pre20 vor, die allerdings erst einen Teil der Bash-Konstrukte versteht.
Nach Angaben des Autors verarbeitet die Osh jedoch bereits das über 2500 Zeilen lange Shell-Skript abuild, das die Pakete für die Distribution Alpine Linux baut. Ebenfalls kann die Osh via debootstrap ein Ubuntu-Basissystem aufsetzen und per chroot hineinwechseln.
Gegenüber anderen Shells wertet die Osh Shell-Skripte nicht ausschließlich Befehl für Befehl aus, sondern liest Kommandofolgen teilweise komplett ein. Das betrifft unter anderem arithmetische Ausdrücke und ermöglicht, frühzeitiger auf Fehler hinzuweisen. Des Weiteren bietet die Osh auf der Kommandozeile eine automatische Vervollständigung (Abbildung 1).
![Abbildung 1: Drückt man in der Osh an dieser Stelle auf [Tab], vervollständigt die Shell automatisch <code>$HOSTNAME</code>.](/wp-content/uploads/2019/08/b01-oil-300x137.jpg)
Abbildung 1: Drückt man in der Osh an dieser Stelle auf [Tab], vervollständigt die Shell automatisch $HOSTNAME.
Testfahrt
Um die Osh auszuprobieren, laden Sie von der Homepage des Oil-Projekts [1] das Latest Release herunter und entpacken das Archiv. Zum Übersetzen benötigen Sie dann einen C-Compiler, Make und das Entwicklerpaket für die Readline-Bibliothek. Fehlen diese Komponenten auf dem System noch, installieren Sie sie unter Ubuntu mit dem Kommando aus der ersten Zeile von Listing 1.
Listing 1
$ sudo apt install build-essential libreadline-dev [...] $ ./configure $ make $ sudo ./install
Dann wechseln Sie ins Quellcode-Verzeichnis der Oil Shell, übersetzen das Programm und richten es auf dem System ein (Zeilen 3 bis 5). Anschließend können Sie die Oil Shell ähnlich wie die Bash verwenden und auf Shell-Skripte ansetzen:
$ osh -c 'echo Hallo Welt!'
Beim Aufruf osh handelt es sich nur um einen symbolischen Link auf das eigentliche Programm, das oil.vm heißt. Sofern Sie es über osh starten, meldet sich die Shell auch unter diesem Namen.
Andy Chu hat die Osh in Python geschrieben. Seine Wahl fiel auf diese Sprache, da sich mit ihr schnelle Ergebnisse erzielen lassen. Der Nachteil besteht in einer deutlich geringeren Geschwindigkeit gegenüber anderen Shells. Die Osh läuft in einer virtuellen Maschine, der OVM. Dabei handelt es sich um eine modifizierte Fassung der CPython VM, der offiziellen Referenzimplementierung von Python.
Dabei kommt die virtuelle Maschine für Python 2 zum Einsatz, dessen Support allerdings im Januar 2020 ausläuft. Den Code für die VM erzeugt mittlerweile der OPy-Bytecode-Compiler. Der Quellcode der aktuellen Entwicklerversion der Osh lagert auf GitHub [2].
Ölige Sprache
Parallel zur Osh entwickelt Andy Chu mit der Oil Language (kurz: Oil) eine komplett neue Skriptsprache, die vor allem einige Unschönheiten der bisherigen Unix-Shells beseitigen und so Entwicklern von Shell-Skripten die Arbeit erleichtern soll. Beispielsweise führt in ihr der Ausdruck x=1 zum selben Ergebnis wie x = 1. Des Weiteren soll Oil einfacher zu erlernen, zu schreiben und zu debuggen sein, mehr als die Bash können und eine konsistentere Grammatik aufweisen.
Die Spezifikation und den Aufbau von Oil hat Andy Chu nach eigenen Angaben weitgehend festgezurrt, aber nur rudimentär dokumentiert. So soll eine entsprechende Shell nicht jeden Befehl direkt nacheinander ausführen, sondern ein Skript erst einmal komplett einlesen und sich dessen Struktur im Hauptspeicher merken. Dank dieses Static Parsing vermag die Shell Tipp- und Syntaxfehler frühzeitig zu erkennen.
Den Aufbau des Skripts speichert die Shell zudem im RAM in einer speziellen Datenstruktur, einem sogenannten Syntax Tree. Den baut die Osh so geschickt auf, dass man daraus wieder das ursprüngliche Skript generieren könnte. Mit einem solchen Lossless Syntax Tree sollen sich vor allem Fehler besser aufspüren lassen.
Oil bietet Shell-ähnliche Funktionen, die man mit dem Schlüsselwort proc definiert, sowie ergänzend herkömmliche Funktionen, die das Schlüsselwort func einleitet. Letztere ähneln den Funktionen aus Python und Javascript und können komplexere Datenstrukturen sowohl entgegennehmen als auch zurückgeben. Andy Chu möchte damit unter anderem die Shell-Syntax für die Manipulation von Zeichenketten verbessern.
Code-Blöcke fasst Oil in geschweifte Klammern. So verwandelt sich die Abfrage if ... then ... fi in das kürzere Pendant if ... { ... }. Oil bietet zudem die aus anderen Programmiersprachen bekannten Arrays, die zur Initialisierung die eckigen Klammern nutzen:
hallo = ['Hallo' 'Welt']
Bash-Skripte sollen sich einfach in Oil übersetzen lassen. Dazu arbeitet Andy Chu bereits an einem passenden Übersetzer, der Osh-Skripte in entsprechenden Oil-Code transformiert. Der existiert allerdings derzeit nur als Prototyp zum Nachweis der Machbarkeit.
Ein Beispiel für seine Ergebnisse findet sich im Blog [3] des Projekts. Das dort verwendete Bash-Skript und die daraus generierte Variante in der Oil Language zeigen Listing 2 und Listing 3. Auch der Parser ist in Python geschrieben, seinen Quellcode finden Sie bei Interesse auf GitHub im Osh-Quellcode unter tools/ [4].
Listing 2
make_hdb()
{
# Some distros don't put /sbin:/usr/sbin in the $PATH for non-root users.
if [ -z "$(which mke2fs)" ] || [ -z "$(which tune2fs)" ]
then
export PATH=/sbin:/usr/sbin:$PATH
fi
truncate -s ${HDBMEGS}m "$HDB" &&
mke2fs -q -b 1024 -F "$HDB" -i 4096 &&
tune2fs -j -c 0 -i 0 "$HDB"
[ $? -ne 0 ] && exit 1
}
Listing 3
proc make_hdb
{
# Some distros don't put /sbin:/usr/sbin in the $PATH for non-root users.
if test -z $[which mke2fs] || test -z $[which tune2fs]
{
export PATH = "/sbin:/usr/sbin:$PATH"
}
truncate -s $(HDBMEGS)m $HDB &&
mke2fs -q -b 1024 -F $HDB -i 4096 &&
tune2fs -j -c 0 -i 0 $HDB
test $Status -ne 0 && exit 1
}
Fazit
Wie eine ölige Muschel lässt sich auch die Oil Shell derzeit in der Praxis nur schwer greifen: Sie bildet nur eine Teilmenge der Bash-Möglichkeiten ab, weshalb man auch gleich zum ausgereiften Original greifen kann. Das ist zudem auf den meisten unixoiden Systemen bereits vorinstalliert. Die Eigenschaften der Oil Language klingen interessant, eine einsatzfähige Implementierung lässt jedoch noch auf sich warten.
Wer sich über das Oil-Projekt informieren möchte, muss sich zudem durch zahlreiche Blog-Posts lesen, die kaum konkrete Informationen zur Oil Shell enthalten, sondern sich eher mit den Gründen für ihre Entwicklung befassen. Damit bleibt die Oil Shell ein zwar interessantes Projekt, das aber – mit einem Blick auf die bisherige Entwicklungszeit – sicherlich noch einige Jahre bis zur Praxisreife benötigt.
Glossar
- Shell
- Als Shell bezeichnet man ein kleines Programm, mit dem sich das System über Textkommandos steuern lässt. Viele Shells erlauben zudem das Schreiben von Skripten, mit denen man Abläufe automatisieren kann. Zu den bekanntesten und verbreitetsten Shells gehört die Bourne-Again Shell oder kurz Bash [5].
Infos
- Oil-Projekt: https://www.oilshell.org
- Osh auf GitHub: https://github.com/oilshell/oil
- Osh-to-Oil-Konverter: http://www.oilshell.org/blog/snapshots/2017-02/aboriginal/osh-to-oil.html#sources/toys/make-hdb.sh
- Oil-Übersetzer auf GitHub: https://github.com/oilshell/oil/tree/master/tools
- Bash: https://de.wikipedia.org/wiki/Bash_(Shell)





