Zsh

Die Z shell (zsh) ist eine sehr mächtige Shell, mit Funktionen, die weit über die der Bash hinausgehen, dabei aber weitgehend gleich oder ähnlich bedienbar. Leider ist sie im Auslieferungszustand sehr schlecht vorkonfiguriert. Daher verlassen viele User, die die zsh mal ausprobieren oder sich versehentlich auf die zsh verirrt haben, diese sehr schnell wieder und setzen sie nie wieder ein. Doch das muss nicht sein, alles was fehlt ist eine gut vorkonfigurierte

~/.zshrc

Das grml-Projekt hat hier hervorragende Vorarbeit geleistet. Das entsprechende File, das die Entwickler für die eigene Distribution verwenden, kann man von http://grml.org/zsh/ auch einzeln runterladen und in der eigenen Installation verwenden (auch wenn man selber eine ganz andere Linux-Distribution einsetzt).

Zum Einstieg in die zsh hervorragend geeignet, und Anpassungen an die eigenen Bedürfnisse sind an dieser gut dokumentierten Vorlage recht einfach möglich.

Eine weiter gute Seite des grml-Projekts zu dem Thema ist http://grml.org/console/

Nützliche Features

Die folgenden Tipps gehen davon aus, dass man eine - zumindest in Grundzügen - konfigurierte Zsh hat. Ausgangspunkt kann z. B. die zshrc von grml sein.

zwischen zwei oder mehr Directories wechseln

Bei der Arbeit auf der Shell kommt es häufig vor, dass man zwischen zwei Directories hin und her wechselt. Wie auch in der Bash kann man dazu jeweils die "Abkürzung"

cd -
verwenden. Bei drei oder mehr Directories muss die Bash passen, die Zsh dagegen kann mit
cd ~1
cd ~2
...
umgehen, wobei ~1 für das zuletzt aktuelle Working-Directory steht ( cd - und cd ~1 sind also gleichbedeutend), ~2 für das vorletzte, usw.

Script in unbekanntem Pfad editieren

Man hat sich - vielleicht vor langer Zeit - ein Script geschrieben, nennen wir es meinTestScript.sh und irgendwo im Pfad abgelegt, sodass man es immer direkt aufrufen kann. Will man es editieren, erinnert sich aber nicht mehr genau, wo das Script eigentlich abgelegt ist, hat sich folgendes Vorgehen bewährt:

zsh ~ % type meinTestScript.sh
meinTestScript.sh is /home/booboo/bin/meinTestScript.sh
zsh ~ % vi /home/booboo/bin/meinTestScript.sh
Abkürzung auf der Zsh:
zsh ~ % vi =meinTestScript.sh

Variablen editieren

Mit vared können Variablen interaktiv editiert werden, z. B.
vared PATH
[Enter] übernimmt die Änderungen, [Ctrl]+[C] bricht ab. Wenn mehrzeilige Inhalte editiert werden sollen, müssen neue Zeilen mit [ESC][Enter] erzeugt werden.

Zsh konfigurieren

Optimal zur eigenen Arbeitsweise und zur eigenen Verzeichnisstruktur passt die benutzte Shell natürlich genau dann, wenn man sie selbst konfiguriert, sprich die .zshrc erweitert. Die Zsh bietet dazu nahezu unendliche Möglichkeiten. Die ersten Anpassungen sind meist:

named directories

hash -d doc=/usr/share/doc
cd ~doc
# oder auch
ll ~doc/zsh

Tab-Completion funktioniert auch für named directories

cd ~d<Tab>

Completions für eigene Programme oder Scripts

Tab-Completion funktioniert in der Zsh ja nicht nur für Dateien und Verzeichnisse, sondern auch für Usernames, Parameter von Kommandos, ... Für viele Programme, die Linux so mitbringt, liefert die Zsh schon fertige Completions mit (im Prinzip: Funktionen die wissen, welche Parameter jetzt als nächstes eingegeben werden können, teilweise sogar mit kurzer Beschreibung). Wenn man den gleichen Comfort auch für selbst geschriebene Programme oder Scripts haben möchte, muss man noch eine entsprechende Funktion schreiben.

Ein Beispiel:

Ich habe ein kleines Script ( netmount ), das feststellt, in welchem Netz sich mein Notebook gerade befindet, und dann alle Remote-Filesysteme des entsprechenden Netzes mountet. Umount kann es auch, daher hat es genau zwei Parameter: start und stop

Einfachste Variante einer Completion:

_netmount() {
   compadd -- start stop
}
compdef _netmount netmount
Die Funktion wird definiert und dann mit compdef an das Kommando gebunden. Nur Completion, keine Hilfe-Texte. Eine erweiterte Version sieht so aus:

_netmount () {
    _values 'action' \
            'start[mount configured remote filesystems]' \
            'stop[umount configured remote filesystems if mounted]'
}

Der Parameter bekommt einen Namen ( action ) und die beiden möglichen Werte jeweils eine kurze Erklärung. Funktioniert dann in der Praxis so:

zsh ~ % netmount <Tab>
completing action
start    -- mount configured remote filesystems
stop     -- umount configured remote filesystems if mounted

eigene Funktionen

Öfters benötigte Abfolgen von Befehlen legt man oft in kleinen Scripts ab. In der Zsh bieten sich dafür auch Funktionen an. Z. B.

# for interactive editing of functions
funced () {
        if [[ -z $1 ]]
        then
                print call using
                print $0 \<function\>
                return 1
        fi
        vared "functions[$1]"
}

# for interactive editing of aliases
aliased () {
        if [[ -z $1 ]]
        then
                print call using
                print $0 \<alias\>
                return 1
        fi
        vared "aliases[$1]"
}

Die beiden Funktionen nutzen aus, dass Aliases bzw. Functions von der Zsh einfach in assoziativen Arrays abgelegt werden. Mit dem oben bereits erwähnten vared können somit "schnell mal" Änderungen an Aliases bzw. Functions vorgenommen werden. Direkt im Anschluss kann man die Auswirkungen der Änderung testen.

Aus zshrc-Files anderer lernen

Die zshrc-Files erfahrener Zsh-User können Anregungen und Hilfestellung für eigene Anpassung liefern. Besonders zu erwähnen sind folgende:

  • zshrc von grml (oben bereits erwähnt)
  • zshrc von Julius Plenz (Mitautor des zsh-Buches)
  • zshrc von Michael Prokop (Maintainer von grml)

Weiterführende Literatur

Natürlich kann eine einzelne Seite in einem Wiki die gigantischen Möglichkeiten der Zsh auch nicht annähernd beschreiben, daher Hinweise auf weiterführende Literatur:

Topic revision: r2 - 01 Jan 2011 - 23:22:29 - Berny