Aus Linux-Magazin 09/2010

Zsh statt Bash

Abbildung 1: Unter der Linux-Distribution Grml ist Zsh die Standardshell.

Die Z-Shell gilt als Geheimtipp unter Konsolenfreunden. Wer einmal einem Zsh-Anwender bei der Arbeit mit der automatischen Vervollständigung zugesehen hat, weiß warum.

Die interaktive Standardshell Bash ist dem erfahrenen Linuxer wohlvertraut. Doch wie wäre es mit einer Shell, die Vertipper korrigiert und einen Vervollständigungsmechanismus besitzt, der sie zum Traum aller Tippfaulen macht? Dies alles bietet die Zsh [1], von Paul Falstad Anfang der 90er Jahre geschrieben. Sie steht unter einer BSD-artigen Lizenz und ist als Paket in fast allen Linux-Distributionen verfügbar. Die Distribution Grml setzt sie sogar als Standard ein (Abbildung 1).

Abbildung 1: Unter der Linux-Distribution Grml ist Zsh die Standardshell.

Abbildung 1: Unter der Linux-Distribution Grml ist Zsh die Standardshell.

Optionsvielfalt

Als erste praktische Option sei die Eingabekorrektur genannt, die der Befehl »setopt correct« aktiviert. Dabei entspricht »setopt Option« dem »shopt -s Option« der Bash, während »setopt noOption« sowie »unsetopt Option« analog zu »shopt -u Option« bei der Bash sind. Eine vollständige Liste aller Konfigurationsvariablen zeigt das Kommando »setopt kshoptionprint; setopt«. Ist die Option »correct« gesetzt, so versucht die Zsh falsch geschriebene Befehle zu korrigieren. Testen lässt sich das etwa durch Absetzen des Befehls »sl«, der in gängigen Distributionen gar nicht als Kommando existiert.

Die Zsh fragt dann mit »zsh: correct `sl’ to `ls’ [nyae]?«, ob der Anwender den Befehl durch »ls« ersetzen will, was dieser entweder mit [Enter] oder [N] ablehnt, mit [Y] bestätigt oder mit [A] abbricht. Die Taste [E] erlaubt es ihm, die eingegebene Kommandozeile noch einmal zu editieren.

Die Einstellung »setopt histignorespace« stellt sicher, dass ausgeführte Kommandos, die mit einem Leerzeichen beginnen, nicht in der Zsh-History landen. Das ist etwa dann von Interesse, wenn der Benutzer in der Kommandozeile ein Passwort mitgeben muss.

Zum schnellen Wechseln in ein Verzeichnis dient »setopt auto_cd«. Gibt der Anwender ein Kommando ein, das nicht im Programmpfad steht, aber einem Verzeichnisnamen entspricht, wechselt die Z-Shell stattdessen in das Verzeichnis. Weitere Informationen zu den über 150 verfügbaren Optionen gibt es in der Manpage »zshoptions(1)«.

Die große Stärke der Zsh ist der Vervollständigungsmechanismus. Zum Aktivieren dient der folgende Befehl:

autoload -U compinit && compinit

Ab sofort sollte etwa nach Eingabe von »ssh« und Drücken von [Tab] ein Auswahlmenü mit Benutzernamen sichtbar sein. Mit den Cursortasten lässt sich zwischen diesen Menü-Eintragen navigieren. Sobald »ssh user@« in der Kommandozeile eingegeben ist, bringt erneutes Drücken von [Tab] eine Liste von Hostnamen zum Vorschein. Diese Informationen bezieht Zsh aus Dateien wie »/etc/hosts« und »~/.ssh/config«.

Wie praktisch dieser Mechanismus im Alltag ist, zeigt sich bei der Vervollständigung von Befehlen mit besonders vielen Optionen wie etwa Rsync. Die mehreren Hundert Optionen des Synchronisationsprogramms sind mit Hilfe von »rsync –[Tab]« einfach und schnell zugänglich (Abbildung 2).

Abbildung 2: Die Vervollständigung der Zsh ist bei Kommandos mit vielen Optionen besonders hilfreich. Daneben kann sie auch User und Hosts ergänzen.

Abbildung 2: Die Vervollständigung der Zsh ist bei Kommandos mit vielen Optionen besonders hilfreich. Daneben kann sie auch User und Hosts ergänzen.

Prompt mit Mehrwert

Der Prompt der Zsh ist standardmäßig minimalistisch konfiguriert, lässt sich aber über die Umgebungsvariable »PROMPT« verändern. Für die Umsetzung eines dynamischen Prompts gibt es Funktionen: »chpwd« kommt zur Ausführung, wenn sich das Arbeitsverzeichnis ändert, »precmd« vor dem Setzen des Prompts und »preexec« beim Absetzen eines Kommandos.

Eine beeindruckende Anwendung von »precmd« demonstriert das Feature »vcs_info« von Frank Terbeck, das es seit der Zsh-Version 4.3.7 gibt: Wechselt der Anwender in ein Verzeichnis, das mit einem Versionskontrollsystem wie Git, CVS, Subversion oder einem ähnlichen verwaltet wird, zeigt der Prompt aktuelle Informationen zu diesem Repository (Abbildung 3). Listing 1 zeigt die erforderlichen Zeilen für die Zsh-Konfiguration.

Abbildung 3: Das Feature »vcs_info« blendet im Prompt Informationen aus Versionskontrollsystemen wie Git oder Subversion ein.

Abbildung 3: Das Feature »vcs_info« blendet im Prompt Informationen aus Versionskontrollsystemen wie Git oder Subversion ein.

Listing 1:
»vcs_info«

01 autoload -Uz vcs_info
02 precmd() {
03   psvar=()
04   vcs_info
05   [[ -n $vcs_info_msg_0_ ]] && psvar[1]="$vcs_info_msg_0_"
06 }
07 PROMPT="%n@%m:%~%(1v.%F{green}%1v%f.)%# "

Die vorgestellten Funktionen, Optionen und weitere Konfigurationsanweisungen sollen natürlich persistent, also über einen Neustart der Zsh hinaus, verfügbar sein. Dafür sorgen Einträge in den Konfigurationsdateien. Für die interaktive Arbeit mit der Zsh sind das je nach verwendeter Distribution »/etc/zshrc« oder »/etc/zsh/zshrc« sowie »$ZDOTDIR/.zshrc«. Solange »ZDOTDIR« nicht gesetzt ist, nimmt Zsh dafür »HOME« an.

Wer also die vorgestellten Einstellungen in der persönlichen Zsh-Konfiguration ablegen möchte, fügt die Kommandos in die Datei »$HOME/.zshrc« ein. Details zu den Konfigurationsdateien sind im Abschnitt “Startup/Shutdown Files” der Manpage »zsh(1)« zu finden, eine minimale Konfiguration kann wie Listing 2 aussehen. Das Grml-Projekt stellt eine fertige Konfiguration in dem umfangreichen und gut dokumentieren Paket Grml-Zshrc [2] zur Verfügung.

Listing 2:
Minimalkonfiguration

01 setopt auto_cd correct histignorespace no_beep
02 eval $(dircolors)
03 PROMPT='%n@%m:%~%# '
04 export EDITOR=vim
05 export PAGER=less
06 autoload -U compinit && compinit

Features für Faule

Besonders empfehlenswert sind die folgenden Features für Faule: Bei der Arbeit auf der Kommandozeile ergibt es sich, dass man zwischen vielen Verzeichnissen hin und her wechselt. Der Verzeichnis-Stack erspart dabei lästige Tipparbeit. Mit »setopt auto_pushd« (beim Wechseln von Verzeichnissen soll das alte Verzeichnis automatisch dem Verzeichnis-Stack hinzugefügt werden), »setopt pushd_ignore_dups« (Verzeichnisse nicht doppelt hinzufügen) aktiviert die hierfür notwendigen Optionen.

Dann kann der Anwender mit »cd [-] [Strg]+[D]« die Liste der zur Verfügung stehenden Vervollständigsmöglichkeiten anzeigen beziehungsweise mit »cd [-][Tab]« direkt in das Menü springen. Mit »cd [-][2]« wechselt er – auch ohne Vervollständigsmechanismus – in das mit der Nummer 2 ausgewiesene Verzeichnis. Für kompakte Einzeiler in der Shell eignen sich Kurzformen diverser Schleifen. Statt »for i in $LISTE ; do $STUFF; done« kann man auch einfach »for i ($LISTE) $STUFF« schreiben. Weitere Kurzformen sind im Abschnitt “Alternate Forms For Complex Commands” der Manpage »zshmisc(1)« zu finden.

Wer in mehreren Shellinstanzen gleichzeitig arbeitet, wird das Problem kennen, dass die Kommandos einer Instanz in der anderen nicht zugänglich sind. Auch hier schafft die Zsh Abhilfe: »setopt append_history« (History-Informationen automatisch hinten anfügen) und »setopt share_history« (neue Kommandos aus der Historydatei einlesen) aktivieren die Optionen für den Austausch zwischen mehreren laufenden Zsh-Instanzen. Ab jetzt reicht es, in der leeren Kommandozeile einmal [Enter] einzugeben – schon liest die Zsh die History-Informationen der anderen Shellinstanz ein.

Als Beweis dafür, wie flexibel und mächtig die Zsh ist, existiert ZIRC, ein IRC-Client, der zu 100 Prozent aus Zsh-Skripten besteht [3]. Der Zsh-Debugger [4] ist als GDB-ähnliches Interface zum Debuggen von Zsh-Code gedacht.

Weiterführende Literatur

Wem der offizielle Zsh User Guide [1] und das Zsh-Wiki [5] noch nicht ausreichen, der sollte einen Blick auf die Seite der Zsh-Lovers [2] werfen. Dieses Projekt hat sich zum Ziel gesetzt, Tipps und Tricks rund um die Zsh zusammenzutragen. Eine vollständige Offline-Referenz bietet die Manpage »zshall(1)«, die den gesammelten Inhalt der einzelnen Zsh-Manpages enthält. Besonders bei der Suche nach einem Stichwort erweist sich das als hilfreich. Wer Literatur in Buchform bevorzugt, dem sei das deutschsprachige Buch “Zsh – Die magische Shell” von Sven Guckes und Julius Plenz [6] ans Herz gelegt. Das englischsprachige Buch “From Bash to Z Shell: Conquering the Command Line” [7] wiederum behandelt sowohl die Bash als auch ausführlich die Zsh. (mhu)

Der Autor

Michael Prokop ist Projektleiter der Linux-Distribution Grml.org und bietet mit Grml Solutions IT-Lösungen im Linux-Bereich an.

Infos

[1] Zsh-Projekt: [http://zsh.sourceforge.net]

[2] Zsh-Seiten der Distribution Grml: [http://grml.org/zsh/]

[3] Zirc: [http://www.aeruder.net/tag/zirc/]

[4] Zsh-Debugger: [http://github.com/rocky/zshdb]

[5] Zsh-Wiki: [http://zshwiki.org]

[6] Sven Guckes und Julius Plenz, “Zsh – die magische Shell”: [http://zshbuch.org]

[7] “From Bash to Z Shell”: [http://www.bash2zsh.com]

LINUX-MAGAZIN KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS Readly Logo
E-Mail Benachrichtigung
Benachrichtige mich zu:
0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben