menu.jpg  ::  Home ::  Computing ::  Downloads ::  Scooter ::  Music ::  Links ::  Nonsense ::  Mail :: 

Die Zsh als Alternative zur bash

Table of contents

1. Vorbemerkung

Die Zsh gehört zur Familie der Bourne Shells. Sie ist - wie die Bourne Again Shell (bash), Korn Shell (ksh) und die Tenex C Shell (tcsh) - bis ins kleinste Detail konfigurierbar und stellt damit eine ideale interaktive Shell dar. Im Gegensatz zur tcsh hält sie sich jedoch an den unter *NIX-Shells gängigen Standard: Den der Bourne Shell (sh).

Die Zsh, die eigentlich der ksh sehr ähnlich ist, aber viele Erweiterungen aufweist, kann darüber hinaus aber verschiedene andere Shells (u. a. die sh, bash, csh und ksh) emulieren. Das eigentlich geniale an ihr sind jedoch

Die Zsh gibt es in einer stabilen und einer in Entwicklung befindlichen Version. Ich verwende eigentlich immer wegen der vorangeschrittenen Features eine Entwickler-Version als Login-Shell - auch für root-accounts - auf meinen Systemen und bin damit glücklich und zufrieden.

2. Konfigurationdateien

Die Zsh wird mit folgenden Dateien konfiguriert:

  1. zshenv: In diese Datei, die zuerst eingelesen wird, gehören Umgebungsvariablen, wie der ${PATH}. Diese Datei sollte nichts ausgeben, da sie bei allen Aufrufen der Zsh – auch aus Skripten heraus – gelesen wird.
  2. zprofile: Diese Datei wird nur von Login Shells vor dem Login gelesen. Hier können Aufrufe von fortune u.ä stehen.
  3. zshrc: Die Haupt-Konfigurationsdatei, die von jeder interaktive Zsh gelesen wird. Hier können Aliase, Funktionen, Optionen, Key-Bindings, Komplettierungen u.ä definiert werden.
  4. zlogin: Diese Datei wird nur von Login Shells nach dem Login gelesen. Hier können Aufrufe von fortune u.ä stehen.
  5. zlogout: Diese Datei wird nur von Login Shells vor dem Logout gelesen. Hier können Aufrufe von clear u.ä stehen.

Ich verwende auf meinem Systemen keine zprofile, sondern lasse ihre Aufgaben von der zlogin erledigen.

Die Zsh liest ihre Konfigurationen aus System-weiten Dateien, die meist unter /etc/zsh liegen und Nutzer-eigenen Dateien, die unter ${ZDOTDIR} liegen. Die Reihenfolge des Einlesens erfolgt wie folgt:

  1. /etc/zsh/zshenv vor ${ZDOTDIR}/.zshenv
  2. /etc/zsh/zprofile vor ${ZDOTDIR}/.zprofile
  3. /etc/zsh/zshrc vor ${ZDOTDIR}/.zshrc
  4. /etc/zsh/zlogin vor ${ZDOTDIR}/.zlogin
  5. ${ZDOTDIR}/.zlogout vor /etc/zsh/zlogout

Wenn die Variable ${ZDOTDIR} nicht gesetzt ist, nimmt die Zsh statt dessen ${HOME} an. Das Setzen der Variable ${ZDOTDIR} erfolgt am sinnvollsten in der /etc/zsh/zshenv als erster Konfigurationsdatei, die von der Zsh gelesen wird:

  # Define ${ZDOTDIR}
  #
  if [[ -z "${ZDOTDIR}" || -d "${HOME}/.zsh" ]]
  then
      ZDOTDIR="${HOME}/.zsh"
  fi

3. Einige Zsh-Goodies

Die folgenden Schnippsel sind aus meiner Zsh-Konfiguration, die sich jedoch ständig in Bearbeitung befindet. Eine meist ziemlich aktuelle Konfiguration kannst Du hier als Tarball herunterladen.

3.1 Das Completion-System aktivieren und konfigurieren

Die Zsh hat eine beeindruckende TAB-Vervollständingung, die weitestgehend aus der Schachtel für diverse UNIX-Befehle vorkonfiguriert ist. Um sie zu aktivieren, genügen die beiden folgenden Zeilen, die man zweckmässiger Weise in seine .zshrc einträgt:

  autoload -U compinit
  compinit

Durch den Befehl autoload wird das Completion-System der Zsh lediglich initialisiert, aber nur sukzessiv für die jeweils zu vervollständigenden Befehle geladen.

Um das Completion-System so geschwätzig wie möglich zu machen, sollten auch noch die folgenden Zeilen in die .zshrc eingetragen werden:

  zstyle ":completion:*" group-name ""
  zstyle ":completion:*" matcher-list "m:{a-z}={A-Z}"
  zstyle ":completion:*" verbose yes
  zstyle ":completion:*:default" list-colors ${(s.:.)LS_COLORS}
  zstyle ":completion:*:descriptions" format "%B%d%b"
  zstyle ":completion:*:messages" format "%B%d%d"
  zstyle ":completion:*:warnings" format "No match in: %B%d%b"

3.2 Globbing

3.2.1 Anzeige aller in den letzten 24 Stunden veränderten Dateien

Die Zsh beherrscht rekursives Globbing. Der Befehl ls **/foo durchsucht das aktuelle Verzeichnis rekursiv nach einer Datei namens foo.

Mit dem Befehl print -l **/*(m-1^/) durchläuft die Zsh rekursiv das aktuelle Verzeichnis ( **/ ) und gibt alle in den letzten 24 Stunden ( *(m-1) ) geänderten Dateien und symbolischer Links (^/ ) einschliesslich Pfad aus. Der folgende alias befindet sich in meiner .zshrc:

  alias today='print -l **/*(m-1^/)'

3.2.2 Dateinamen in lower- oder upper-case wandeln

Mit den Modifiern ':l' oder ':u' lassen sich übergebene Werte in Klein- oder Grossbuchstaben wandeln. Der Inhalt der Variable $i wird mit dem Modifier ${i:l} also in Kleinbuchstaben und mit ${i:u} in Grossbuchstaben gewandelt.

Zwei nützliche Funktionen zum Umbennenen von Dateien aus meiner .zshrc dazu:

  2lower() { for i in $@; do mv $i ${i:l}; done }
  2upper() { for i in $@; do mv $i ${i:u}; done }  

3.3 Verzeichniswechsel für Tippfaule

Mit der Shelloption AUTO_CD kann man durch die Eingabe von Verzeichnisnamen ohne den vorangestellten Befehl cd in diese wechseln. Dieses an sich schon nette Feature kann man sich folgendermassen noch nützlicher machen:

Man setzt einige Shell Optionen:

  setopt AUTO_CD AUTO_PUSHD PUSHD_IGNORE_DUPS

Damit erreicht man, dass ein Verzeichniswechsel ohne vorangestelltes cd möglich wird, das Verzeichnis, aus dem man gewechselt ist, auf den directory-stack gelegt wird und der directory-stack keine Duplikate enthält.

Den directory-stack kann man mit dem Befehl dirs -v aufrufen:

  dirs -v

  0	~
  1	/usr/local/bin
  2	/etc/lighttpd
  3	/home/public-html
  4	~/Documents
  5	~/misc

Jetzt kann man mit dem Befehl ~ + Nummer in besuchte Verzeichnisse zurückwechseln, also beispielsweise mit ~2 ins Verzeichnis /etc/lighttpd.

Interaktiv beschickt man das selbe mit cd - <TAB>, wodurch sich ein Menü öffnet:

  0	~
  1	/usr/local/bin
  2	/etc/lighttpd
  3	/home/public-html
  4	~/Documents
  5	~/misc

Mit Eingabe der jeweiligen Nummer wechselt man ins jeweilige Verzeichnis zurück, also mit 2 ins Verzeichnis /etc/lighttpd.

3.4 History Goodies

Die History der Zsh wird folgendermassen in der .zshrc konfiguriert:

Einige nützliche Möglichkeiten, von der History Gebrauch zu machen, sind:

Die History kann darüber hinaus noch durch verschiedene Shell-Optionen, wie HIST_IGNORE_ALL_DUPS, HIST_IGNORE_SPACE, HIST_REDUCE_BLANKS, HIST_VERIFY, INC_APPEND_HISTORY und SHARE_HISTORY an die eigenen Angewohnheiten angepasst werden.

Besonders sinnvoll sind für mich die Shell-Optionen HIST_VERIFY, die verhindert, das eine Vervollständigung aus der History sofort ausgeführt wird, sondern nur in die Befehlszeile geladen wird, und SHARE_HISTORY, die eine Nutzung der History parallel mit mehreren Zsh-Instanzen möglich macht.


Valid XHTML 1.0

Zurück zur Main-Site
Impressum
Created with GNU-Emacs on Sun Jan 25 13:06:46 CET 2009

Valid CSS