Oh My ZSh – Die bessere Shell

Fast alle Distributionen verwenden als Standard-Shell die Bash. Das ist keine schlechte Wahl, die Bash taugt und ist gut benutzbar. Es ist jedoch nicht die einzige Shell am Markt: Mit der Z-Shell (zsh) gibt es einen Konkurrenten, der fast genauso alt ist. Und mit “alt” meine ich alt: Das ist wirklich altes Zeug, entstanden als bei Home-Computern der “Amiga vs. Atari”-Streit gerade zu einem “Amiga vs. Apple”-Streit wurde.

Die Webseite der Zsh ist seitdem auch nicht strukturell überarbeitet worden, ein echtes Schmuckstück der Hypertext-Historie! So, liebe Kinder, sah das WWW vor dem Krieg aus!

Für den User sind die Unterschiede zwischen den Shells erst mal marginal, wirklich umgewöhnen muss man sich nicht: Startupskripte heißen statt .bashrc und Konsorten halt .zshrc etc.. Die anderen Unterschiede findet man erst im Detail, z.B. hier: https://stackabuse.com/zsh-vs-bash/.

Zsh Features

Relativ schnell wird man über eine sehr praktische Verbesserung stoßen: Die Autocompletion ist deutlich verbessert. So kann man cd /h/u/f/b mittels <TAB> zu cd /home/username/foo/bar erweitern. Hat man zwei Ordner some-thing und some-one, so muss man nicht s<TAB>o<TAB> tippen, um some-one zu erweitern, es genügt o<TAB>. Die Vervollständigung ergänzt also auch aus der Wortmitte heraus, nicht nur vom Start. Gibt es mehrere Möglichkeiten, so wird nicht nur bei jedem Tab eine andere Variante präsentiert, es werden alle Varianten angezeigt, und man kann neben <TAB> auch mit den Cursortasten aussuchen.

Und case-insensitive ist die Suche auch, wenn der Pfad foo/Bar lautet, führt cd f/b trotzdem dorthin.

Gehörst Du auch zu der Gruppe der Menschen, die 30 mal Pfeil-Hoch tippen, weil sie lange Kommandos wie “ls” nicht nochmal eingeben wollen? Dann kennst Du sicher “<Strg>-R cat“, um das letzte Kommando zu finden, das mit cat begonnen hat. Aber wenn Du doch cat schon getippt hast? Dann drückst Du in der Zsh einfach Pfeil-Hoch, und er findet das Kommando ebenfalls!

Noch mehr Features mit Plugins

Interessant wird die Zsh für mich dennoch schließlich erst mit oh-my-zsh. Das ist eine Erweiterung, die die Konfiguration der Zsh in Plugins auslagert, von denen es für fast jeden Anwendungszweck eines gibt. Das fängt bei einfachen und häufig eher launigen als produktiven alias-Sammlungen wie “lol” an, es sind aber auch echt nützliche Dinge dabei, die die Besonderheiten der Zsh ausreizen.

Themes

Natürlich kann man auch in der Bash seinen Command-Prompt verändern, aber dort ist es z.B. nicht möglich, auch rechtsbündig einen Prompt anzuzeigen:

Aktuelle Uhrzeit rechtsbündig, natürlich nicht statisch, sondern sekündlich aktualisiert

Das kann hilfreich sein, um zu sehen, wie lange das Kommando denn jetzt schon läuft.

Aber es gibt natürlich auch optisch ansprechendere Themes wie z.B. agnoster:

Das wohl populärste Theme

Plugins

Doch nicht nur aliase (z.B. gco für “git commit”) und Themes sind verfügbar, wirklich praktisch sind die vielen Plugins, die die Funktionalität erweitern. Es gibt für diverse Tools autocompletion (vagrant, redis, npm), vi-mode erlaubt ein Bearbeiten der Kommandozeile mit vi-Kürzeln (Suche mit /, Cursornavigation mit $^w…).

Das Plugin dirhistory ermöglicht es, mittels <ALT> und Cursor rechts/links in den zuletzt benötigten Verzeichnissen hin- und her zu springen wie im Browser zwischen den zuletzt besuchten Seiten. Das ist echt praktisch, das hat mich schon öfter wirklich genervt, wenn man zwischen /etc/ und /var/log/ hin und her springt. Aber selbst ohne das Plugin ist die Navigation durch die Verzeichnisse durchdacht: Mit einfacher Eingabe einer Zahl springt man 1, 2 oder 3 Verzeichnisse in der Verzeichnishistorie zurück:

~> cd foo
~/foo> cd baz
~/foo/baz> cd ../bar
~/foo/bar> cd /etc
/etc> 2
~/foo/baz> ...
~>

Wie man sieht: statt cd .. genügt es nur .. zu tippen, weitere Punkte gehen je ein weiteres Verzeichnis nach oben – also .... statt cd ../../...

Sudo ist auch wieder so ein Ding, dass man ständig vergisst. vi /etc/foo/bar.conf -> “W10: Warning: Changing a readonly file“. Verdammt! chown user:group -R /some/path – Doh! – Da fehlt ein sudo am Anfang.

Mit dem gleichnamigen Plugin sudo kein Problem: Zwei mal Esc gedrückt, und es steht ein sudo am Anfang der Zeile. Mit systemd muss  man nicht mal daran denken: Ein sc-restart nginx fügt das sudo automatisch dazu.

Effizienz sind oft die kleinen Dinge.

Wer die Zsh mal ausprobieren will: Unter 
https://github.com/robbyrussell/oh-my-zsh/ findet man eine gute Installationsanleitung sowie eine Liste der verfügbaren Plugins. Wem die vorhandenen Themes nicht reichen: https://github.com/robbyrussell/oh-my-zsh/wiki/External-themes – Ich nutze aktuell “Agnosterzak”:

Try before you buy

Praktisch ist dabei: Man riskiert nichts, nach der Installation (sudo apt install zsh) ist nach wie vor die gewohnte Bash die Standard-Shell. Mit zsh wechselt man in die neue Shell, mit exit kommt man wieder raus, und wenn es einem nicht taugt, dann löscht man das Paket und die angelegten Startskripte wieder. Hat man jedoch Blut geleckt und will wechseln, dann hilft:

chsh -s $(which zsh)

Das nächste Terminal ist dann eine Z-Shell. Und rückwärts geht es natürlich auch wieder:

chsh -s $(which bash)

About the author

People Enabler at CHECK24