Manchmal macht man Sachen die man selber nicht so wirklich versteht. Zum Beispiel hatte ich mich lange quer gestellt [ZSH](https://de.wikipedia.org/wiki/Zsh) einzusetzen. Wieso eine alternative Shell? BASH ist doch sowas wie ein standard auf den Servern auf denen ich arbeite. Vor ein paar Jahren dann die erste Installation. Total abgeschreckt von der Konfiguration (bin bis Heute nicht dahinter gekommen wie das alles funktioniert), war mir [oh-my-zsh]() ein Steigbügelhalter in die Welt von ZSH. Es ist eine Paket aus verschiedenen Plugins und Konfigurationen die das erste ZSH-Erlebnis, instant, beeindruckend gestaltet. Irgendwann war es mir zu langsam und ich stieg um auf [prezto](https://github.com/sorin-ionescu/prezto). Hat sich alles ein wenig flotter angefühlt und ich habe noch weniger verstanden was da im Hintergrund abläuft. Ja, man sollte sich die Sachen genauer anschauen und dann wäre es auch kein Problem. Aber manchmal fehlt mir Zeit weil ich meine Nase in tausend anderen Projekten habe. Es soll einfach funktionieren und the world a better place machen tun... oder zumindest meinen Alltag.
Nun bin ich auf einen Beitrag auf der PyCon über [xonsh](http://xon.sh) gestossen.
Es ist eine alternative Shell die in Python geschrieben ist und das Bindeglied zwischen Shell und Python sein möchte. Und das beste: Endlich eine Syntax in der Shell die ich mir merken kann. Nie wieder nachschauen wie `if` oder `for` in Bash funktionieren. "Nie wieder" ist ein harter Ausdruck. Selbst ich installiere xonsh nicht auf all meinen Servern. Es setzt Python 3.4 oder 3.5 voraus.
Bevor ich ein paar Anwendungsbeispiele nenne, möchte ich auf mein Setup hinweisen. Auf [GitHub](https://github.com/xsteadfastx/batcave) befinden sich meine Ansible Roles um meine Rechner einzurichten. Unter anderen auch [xonsh](https://github.com/xsteadfastx/batcave/tree/master/roles/xonsh).
## Python und Shell Kommandos gemeinsam nutzen
Hier ein Beispiel für ein xonsh-Script das den Output von allen Docker-Commands nimmt und den Output in Files schreibt. Dies habe ich gebraucht um meine xonsh Extension [xonsh-docker-tabcomplete](https://github.com/xsteadfastx/xonsh-docker-tabcomplete) zu testen. Ein Completer für Docker Kommandos die auch direkt auf die Docker-API zugreift. Danke [docker-py](https://github.com/docker/docker-py) und Python als Shell.
if git_dirty_working_directory(include_untracked=True)
else '{BOLD_INTENSE_GREEN}')
# PATH ###################################
# Die Path Variabel ist eine Liste die ich einfach extende.
$PATH.extend(
[
$HOME + '/.local/bin',
$HOME + '/miniconda3/bin',
$HOME + '/node_modules_global/bin'
]
)
# XONTRIB ################################
# Hier habe ich ein paar Erweiterungen enabled. Bei manchen schaue ich
# ob der Befehl auf denen sie beruhen überhaupt da und einsatzfähig ist
# bevor ich sie anschalte. Was nützt mir `apt-get` wenn ich nicht auf
# einem Debian/Ubuntu System bin oder Docker nicht installiert ist?
# Dies teste ich mit `shutil.which`.
xontrib autoxsh vox_tabcomplete
if shutil.which('apt-get'):
xontrib apt_tabcomplete
if shutil.which('docker'):
xontrib docker_tabcomplete
## Ein wenig Rescue
Natürlich kann alles noch ein wenig buggy sein. Einmal gab es Probleme mit den Schreibrechten auf dem History-File und ich konnte kein Terminal mehr öffnen oder mich einloggen. Was da helfen kann: Per SSH und anderer Shell draufschalten und die Shell ändern.
ssh meinuser@meinrechner sh
## Fazit
Das ist natürlich nur ein Bruchteil der Möglichkeiten und Sachen die man ausprobieren kann. Es ist ein Anfang und bis jetzt bin ich begeistert. Also einfach mal das Youtube Video anschauen und ausprobieren. Muss ja nicht gleich die Standard-Shell werden wie bei mir ;-).