:: Home :: Computing :: Downloads :: Scooter :: Music :: Links :: Nonsense :: Mail :: |
---|
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.
Die Zsh wird mit folgenden Dateien konfiguriert:
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:
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
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.
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"
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^/)'
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 }
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.
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.
Zurück zur Main-Site |