Warum wählen, wenn man beides haben kann Xonsh vereint Python und Shell
Anbieter zum Thema
Eine Shell, zwei Sprachen, etliche Innovationen: Mit Xonsh können nicht nur Python-Entwickler ordentlich an der Effizienzschraube drehen.

Trotz aller Entwicklungen im Bereich der Developer-Arbeitsumgebungen – derzeit etwa die große Cloud-IDE-Welle – ist die gute alte Shell als zentrales Werkzeug nicht wegzudenken. Es muss auch nicht immer die Bash sein, es gibt reichlich interessante Bash-Alternativen mit zusätzlichen Features und alternativen Herangehensweisen.
Sei es nun bei der Administration, beim Entwickeln oder der täglichen Büroarbeit, man kommt schnell an den Punkt, wo Shell-Skripte und -Funktionen so umfangreich werden, dass sich eigentlich eine mächtigere Sprache wie eben Python anbietet. Oder aber Python-Befehle erledigen simple Aufgaben schlicht besser bzw. mit einfacherer Syntax – auch dann haben Shell-Befehle, besser gesagt Shell-Tool-Aufrufe, schnell ausgedient.
Genau an dieser Stelle tritt Xonsh auf den Plan. Das Tool bietet nämlich eine Shell, die herkömmlichen Shell-Code und Python auf ein und demselben Prompt verarbeiten kann. Genauer gesagt versteht und verareitet Xonsh sowohl Python-3.6-Befehle als auch aus Bash und IPython bekannte Auszüge. Hinzu kommen ein eigenes System für Add-ons, umfangreiche Konfigurationsmöglichkeiten und eine deutlich erweiterte History.
Zu den weiteren, teils auch von anderen Shells bekannten Features gehören Plattformunabhängigkeit, Tab-Vervollständigung (auch aus man-pages), Syntax-Highlighting und Typvariablen. In der Praxis heißt das auf Code-Seite, dass man für Berechnungen oder Ausgaben sowohl eine Bash- als auch eine Python-Variante verwenden darf:
2 + 2
(( 2 + 2 ))
print(„Hallo Welt“)
echo Hallo Welt
In beiden Fällen wird jeweils dasselbe Ergebnis ausgegeben, also „4“ oder eben „Hallo Welt“. Selbst bei einer solch simplen Rechnung zeigt sich schon der Vorteil, Python-Syntax nutzen zu können – man hat immer einen Taschenrechner zur Hand.
Sobald es komplexer wird und Schleifen, Abfragen, Variablen, reguläre Ausdrücke, Arrays und so weiter eine Rolle spielen, kommen die Python-Vorteile natürlich mehr und mehr zur Geltung. Das soll aber nicht heißen, dass man sich nicht an die Arbeit in diesem dualen System gewöhnen müsse:
echo The Good, The Bad, and The Ugly
Die Ausgabe wird jeden überraschen, der vergessen hat, sich in Xonsh zu bewegen:
The Good, The Bad,
… command not found: The …
Das „and“ wird eben als Operator verstanden, müsste also in Anführungszeichen gesetzt werden, wenn „Bash-Verhalten“ gewünscht wird:
echo The Good, The Bad, „and“ The Ugly
Da der Prompt zunächst nicht unbedingt einen Hinweis auf Xonsh gibt, ist also ein wenig Gewöhnung gefragt. Im Detail gibt es bezüglich der Syntax und des Konzepts natürlich einiges zu lernen, sei es das Quoting, das exakte Verhalten von Subprozessen, der Umgang mit Umbebungsvariablen, Umgebungen und so weiter.
Xonsh ist nicht unbedingt der altgediente bequeme Hauslatschen, sondern eher ein neuer Multifunktionssportschuh, den einzulaufen sich lohnt. Es gibt reichlich „Kleinigkeiten“ zu entdecken und die ordentliche, wenn auch teils recht kurz gehaltene, Xonsh-Dokumentation hilft zumindest Nutzern mit ausgeprägter Shell- und/oder Python-Erfahrung zügig weiter. Ohne ausgeprägte Erfahrungen mit wenigstens einem von beidem könnte Xonsh eher für ausgeprägte Verwirrung sorgen statt für mehr Effizienz.
Installation und Konfiguration
Wie heutzutage üblich, bietet Xonsh viele Möglichkeiten zur Installation; unter Ubuntu funktioniert beispielsweise das übliche „apt-get install xonsh“. Das wäre also eigentlich nicht der Rede wert, allerdings bekämen Sie mit diesem Kommando selbst auf einem aktuellen Ubuntu eine ziemlich veraltete Version von Xonsh, die wegen der recht zügigen Weiterentwicklung interessante Features vermissen lassen würde.
Für die aktuelle Version hat hier sowohl unter Windows als auch Linux die pip-Variante gesorgt:
pip install xonsh
In den älteren Versionen bekämen Sie dann nämlich zum Beispiel nicht das wundervolle Web-Frontend:
xonfig web
… startet einen lokalen Server und ein Web-Frontend im Browser. Darüber lassen sich Erweiterungen – mehr oder weniger – installieren (mehr dazu gleich) sowie Layouts für Prompt und Syntax-Highlighting festlegen. Freilich geht das auch wie üblich per Dotfile (ähnlich der .bashrc), aber wer kann sich schon die extrem freakige Syntax für die Prompt-Konfiguration merken?
Xonsh spendiert Ihnen jeweils etliche Varianten samt Vorschau, die einfach in den passenden Kasten kopiert und gegebenenfalls angepasst werden. In älteren Versionen gibt es stattdessen einen Einrichtungsassistenten (xonfig wizard) auf Textbasis – auch nützlich, aber sollte dieser erscheinen, sollten Sie aktualisieren.
Add-ons nutzen
Xonsh beinhaltet einen eigenen Manager für Drittwerkzeuge, die sogenannten Xontribs. Das Einrichten solcher Erweiterungen ist leider ein wenig holprig geraten. Als Beispiel soll das Tool „onepath“ herhalten, das dem Terminal ein vom Desktop bekanntes Verhalten spendiert: Dateiendungen werden automatisch mit Programmen verknüpft und so lassen sich Dateien in den zugehörigen Programmen öffnen, ohne diese explizit angeben zu müssen.
Im Terminal würde man eine Datei „foobar.txt“ etwa mit „vim foobar.txt“ öffnen. Mit der onepath-Erweiterung genügt ein simples „foobar.txt“, um diese im Standardeditor zu öffnen.
Nun können Sie Erweiterungen mittels …
xontrib list
… auflisten lassen – und sehen keinen onepath-Eintrag. Wenn Sie hingegen die Web-Konfiguration über …
xonfig web
… starten, können Sie die Erweiterung im entsprechenden Reiter aktivieren. Nach einem Xonsh-Neustart bekommen Sie dann die Meldung, xontrib-onepath sei aktiviert, aber nicht installiert – was sich dann mit …
xpip install xontrib-onepath
… nachholen lässt. Damit ist es dann installiert, aktiviert – aber noch nicht geladen! Erst nach …
xontrib load onepath
… ist das Tool dann auch einsatzbereit. Weitere Beispiel für Erweiterungen sind Tab-Vervollständigung für Skripte in Xonsh, Navigation mit Autojump, automatische Ausführung von Skripten beim Betreten von Ordnern via cd-Kommando, eine erweiterte Suchfunktion für Kommandoausgaben, ein Debugger, vi-Modus für den Prompt oder ein Aufgabenplaner.
Erweiterte History
Die History in einer Shell-Session kann enorm nützlich sein, um die Arbeit nachvollziehen, Argumente fix anpassen oder schlicht alte Aufgaben wiederholen zu können. Xonsh setzt da aber noch einen drauf: Über History-Dateien lässt sich das Geschehen nämlich auch über mehrere Sessions und Instanzen verfolgen.
Man bekommt also nicht bloß eine Liste mit Befehlen, sondern eine JSON-formatierte Liste mit Informationen zu Umgebungsvariablen, Konfiguration, Desktop, Version, Nutzer und so weiter – Dinge, die sich auch für Auswertungen anbieten! Selbst Diffs zwischen verschiedenen History-Dateien sind möglich. Vor allem aber dürfte die Auflistung sämtlicher Kommandos samt ihrer Rückgabewerte ein gewaltiger Vorteil gegenüber der Standardhistorie sein.
Insgesamt lässt sich sagen, dass Xonsh der Shell-Arbeit eine Menge neues Leben einhaucht, auch wenn der Fokus eher auf Python liegt. Xonsh eignet sich wunderbar für Scripting-Veteranen, die genau wissen, was sie lieber mit Bash-, was lieber mit Python-Code erledigen, aber auch für Shell-Nutzer, die sich langsam an Python herantasten wollen! Features wie die (grafische) Konfiguration, Erweiterungen und die History dürften wohl jeden überzeugen – nach ein, zwei Stündchen Einarbeitung.
Alles Sonnenschein ist aber auch nicht: Einige Kleinigkeiten hemmen hier und da die völlig intuitive Einarbeitung, angefangen mit der versehentlichen Installation veralteter Pakete, die schnell passiert, über das nicht völlig konsistente und vollständige Add-on-Management, bis hin zu syntaktischen Kleinigkeiten. Dass sich etwa Xonsh- und Python-Skripte per „source“, Bash-Skripte aber nur per „source-bash“ ausführen lassen, mag für die Macher „selbstverständlich“ sein, Einsteiger müssen dann doch die Dokumentation zur Hand nehmen.
Alles in allem sei Xonsh aber jedem Terminal-Arbeiter ans Herz gelegt. Falls Sie es testen wollen, hier noch ein kleiner Tipp für ein Problemchen, das vermutlich recht bald auftaucht: Bei der Verwendung von Pipes funktioniert folgendes nicht:
print(„foobar“) | cowsay
Cowsay würde hier als normaler Shell-Subprozess aufgerufen und dieser verträgt als Eingabe nur Strings, keinen Python-Code. Über eine Python-Funktion hingegen funktioniert es:
def a():
print(„foobar“)
@(a) | cowsay
Hat man sich einmal an derlei „Kleinigkeiten“ gewöhnt, wird der Python-Shell-Mischmasch zunehmend interessant!
(ID:48220830)