Submenu:
Quick-Index
Allgemein -
Vorteile -
Nettigkeiten -
Quellen
Zsh
Allgemein
Zsh? Warum zum Teufel die Zsh? Die Bash ist doch überall installiert und kann doch
alles was man braucht?! Ach so? Nein, für mich nicht. Ich habe gerne spezialisierte
Software, die genau das tut und kann, was ich brauche - die Zsh erfüllt dabei meine
Anforderungen für eine Shell. Sie ist modular, schnell und bringt viele Features mit
die andere Shells nicht einmal ansatzweise beherrschen. Zusätzlich zu den hier
gebrachten Vorteilen und einigen netten
Sachen der Zsh gibt es noch weitere Dokumente zu den Unterschieden zwischen den
diversen Shell, besonders empfehlenswert zu lesen sind dabei "UNIX
shell differences and how to change your shell" (andere Quelle),
"History of UNIX
Shells" und auch in der
ZSH-FAQ gibt es dazu eine Erklärung.
Ich nutze die Zsh auf diversen Plattformen:
[mika@grml: ~]% uname -a
Linux grml 2.6.2 #1 SMP Wed Feb 11 22:00:45 CET 2004 i686 GNU/Linux
[mika@qnx: ~]% uname -a
QNX qnx 6.2.1 2003/01/18-02:12:22est x86pc x86
[mika@bufo: ~]% uname -imrs
FreeBSD 5.2.1-RC i386 GENERIC
[mika@u2]~$ uname -imrs
SunOS 5.9 sun4u SUNW,Ultra-2
[mika@fufopc09: ~] uname -a
CYGWIN_NT-5.1 fufopc09 1.5.7(0.109/3/2) 2004-01-30 19:32 i686 unknown unknown Cygwin
Die Zsh läuft also nicht nur auf Linux (sondern jedem[?] *nix). Da sie aber leider
nicht so wie die Bash auf (so gut wie jedem) System zu finden ist, installiere ich mir
die Zsh überall und für mich ist es ein Zeichen für ein gut administriertes System,
wenn ich auf einem System eine Zsh vorfinde..
Ein kleines Beispiel für Zsh vs. Bash:
Bash: gzip -cd foo.gz && less foo Zsh: less <(gzip -cd foo.gz)
Bash: cat foo fubar | sort Zsh: sort <f{oo,ubar}
Bash: find . -type f -exec chmod 700 {} \; Zsh: chmod 700 **/*(.)
Bash: ls -l `which foobar` Zsh: ls -l =foobar
Danke an
Christian Schneider, von dessen
Signatur ich mir das geklaut habe. (Ja, es gibt ein UUOC und find vs. chmod sind
eigentlich verschiedene Sachen. Es soll aber eher als Demonstration dienen.)
Vorteile der Zsh
- läuft auf allen(?) Unices
- komplette ksh-syntax, kann POSIX-sh emulieren (emulate sh, emulate ksh)
- die meisten Features der ksh, bash und tcsh
- rund 100 Builtins, ca. 150 Optionen und über 300 Keybindings
- globale aliases (werden in der ganzen Zeile expandiert)
- Directory-Stack-Zugriff via =num
- erweitertes Pipes-System: 'ls foo >>(cmd1) 2>>(cmd2)' piped stdout zu cmd1 und stderr
nach cmd2
- arithmetische Ausdrücke: '$((3+4))'
- Menu-Completion: via mehrmaligem Drücken von «TAB» kann man zwischen möglichen matches hin- und herspringen:
- Kommando
- Dateiname/Pfad
- Hostname
- Keybinding
- Option
- Variable(n)
- selbstdefinierte
- Argument-Completion:
- Kontextabhängig
- viele bereits vorhandene Completions-Definitionen (von a2ps bis hin zu zstyle)
- partielle Dateipfad-Completion
- Spelling-Correction und 'approximate completion' von Wörtern
- konfigurierbare Expnasionen von Shell-Argumenten
- Completion-List-Colouring (Einfärben des Menüs)
- Auswahl des auszuwählenden Elements mit dem Cursor
- Scrollen in der Auswahlliste ist möglich
- Vervollständigung des Argumentes via History
- `styles'-Feature - 'versatile configuration'
- `tags'-Feature (z.B. bevorzuge Verzeichnisse gegenüber Dateien oder bevorzuge
bestimmte Dateinamen bei bestimmten Completions)
- `match'-specifications (nur für compctl und nicht für das neue Completion-System
[via Shell-Funktionen, siehe zshcompsys(1) und zshcompwid(1)]
relevant, daher nicht näher ausgeführt)
- Erweitertes Globbing (man zshexpn | less -p 'Glob Qualifiers') - z.B.:
- ls **/file sucht rekursiv nach 'file' in Unterverzeichnissen
- ls file<20-> matcht file20, file30, file100, etc.
- ls *.(c|pro) matcht *.c und *.pro
- ls *(R) matcht nur Dateien mit Berechtigungen = world-readable
- ls *.c~lex.c matcht alle .c-Dateien außer lex.c
- ls (#a1)README matcht README mit einem Fehler, z.B. RADME, REEDME, RAEDME
- ls (#ia1)README wie das vorige Beispiel, zusätzlich aber case-insensitive
- ls *(*@) matcht ausführbare Dateien, Verzeichnisse oder Symlinks
- ls *(L0f.go-w.) matcht alle zero-length-Dateien die nicht group- or world-writable sind
- ls *(om[2]) matcht die 2 zuletzt modifizierten Dateien
- automatisches Dateistream-Teeing (Multiple I/O Redirection), z.B. 'ls >foo >bar'
- chpwd()-Funktion die bei jedem Verzeichniswechsel aktiv wird (nützlich um
Statuszeile aktuell zu halten)
- csh-style History
- vi-line-editing, inklusive Sachen wie 'c2w' und 'y$'
- emacs-line-editing
- inkrementelle History-Suche
- Magic-Space-History (expanded when you type the space bar)
- "null command shorthands":
- "< file" entspricht "more <file"
- "> file" entspricht "cat >file"
- ">> file" entspricht "cat >>file"
- Spelling-Correction:
$ ls .viar<«TAB»>
- $MACHTYPE, $VENDOR und $OSTYPE als Host-Identifikatoren
- $LINENO, $RANDOM, $SECONDS, $cdpath, $COLUMNS, $fignore, $HISTCHARS, $mailpath, $UID, $EUID, $GID, $EGID und $USERNAME können zugewiesen werden
- automatisches "process time reporting" für Kommandos die über ein bestimmtes Limit laufen
- tcsh-style prompt substitution (plus 'conditional prompt expressions')
- Prompt auch auf rechter Seite des screens möglich
- Kurzform für Schleifen: for i (*.c) echo $i
- "conditional expressions" (test builtin, [ ... ], und ksh-style [[ ... ]])
- PATH substitution ("ls -l =zsh" entspricht "ls -l /path/to/zsh" bzw. "ls -l `which zsh`")
- "cd old new" ersetzt "old" mit "new" im Verzeichnisnamen
- "command scheduling" (ähnlich at(1), aber im Shell-Kontext)
- tty mode freezing
- bis zu 9 startup-Dateien
- Dynamisch ladbare Module (man zshmodules)
- cap: Manipulation von POSIX.1e (POSIX.6) capability (privilege) sets
- clone: "Klonen" der aktuellen Shell auf ein anderes Terminal
- compctl: Completion-System
- complete: grundlegendes Completion-System
- complist: Completion-listing-Erweiterung
- computil: einige Erweiterungen für das Completion-System
- datetime: date/time-Kommandos plus Parameter
- deltochar: ZLE-Funktion alla EMACS' zap-to-char
- example: Beispiel zum Schreiben eines Modules
- files: ein paar zugrundeliegende Kommandos zur Dateibearbeitung als Builtin
- mapfile: Zugriff auf externe Dateien via speziellem assoziativem Array
- mathfunc: mathematische Funktionen (Evaluierungen)
- parameter: Zugriff auf interne Hash-Tabellen via speziellen assoziativen Arrays
- pcre: Interface zur PCRE-Bibliothek
- sched: Scheduler für die Shell
- net/socket: Manipulation der Unix domain sockets
- stat: builtin-Kommando als Schnittstelle zum Systemaufruf 'stat'
- system: builtin-Schnittstelle zu diversen Low-Level-System-Features
- net/tcp: Manipulation von TCP-Sockets
- termcap: Schnittstelle zu termcap
- terminfo: Schnittstelle zu terminfo
- zftp: FTP client.
- zle: Zsh Line Editor (Zeileneditor)
- zleparameter: Zugriff auf Internas des ZLE via Parametern
- zprof: Profiling von Shellfunktionen
- zpty: Ausführen eines Kommandos in einem Pseudo-Terminal
- zselect: Sperren und Freigeben wenn ein Dateideskriptor "fertig" ist (Systemaufruf 'select')
- zutil: einige Utility-Builtins, zum Beispiel für den Support von Konfigurationen via Styles
- zmv: Ersatz für mmv (multiple move):
c=1 zmv '*.foo' '$((c++)).foo' # Dateien mit langem Namen in "1.foo", "2.foo", "3.foo",... umbenennen
c=1 zmv "${(l:30-4::?:)}*.foo" '$((c++)).foo' # ... nur für Dateien mit einem längerem Dateinamen als 30 Zeichen
zmv '* *' '$f:gs/ /_' # Alle Leerzeichen in Dateinamen durch '_' ersetzen
zmv -W '*.sh' '*.pl' # alle Dateien mit der Erweiterung *.sh durch *.pl ersetzen
zmv '(*).sh' '$1' # die Erweiterung .sh aller Dateien im aktuellen Verzeichnis entfernen
Siehe auch /usr/local/share/zsh/`echo $ZSH_VERSION`/functions/_zmv und 'man zshcontrib
| less -p zmv'
- 'which -a cmd' listet alle Vorkommen von"cmd" in $PATH
- Login-/Logout-Überwachung (utmp)
- Zeitstempel in History
- histverify-Option: verwenden der csh-style history-expansion verursacht, dass die Eingabe in den Line-Editing-Modus gebracht wird, anstatt sie auszuführen
- sunkeyboardhack-Option: versehentlich getippte vorangestellte `-Zeichen werden von der Input-Zeile entfernt
- process substitution (vi =(cmd) editiert den Output von cmd)
- job control und csh-style history
- "array parameters" - array_name=(value1 value2 ... valueN):
[mika@grml: ~]% dumm=emacs
[mika@grml: ~]% echo $dumm[3]
a
[mika@grml: ~]%
- autocd-Option: Eingeben eines Verzeichnisnamens entspricht einem "cd dirname"
- "incremental path hashing" (HASHCMDS, HASHDIRS)
- "autoloaded functions" (werden geladen wenn sie das erste Mal referenziert werden)
- wirklich(!) 8-bit clean
- Floating-Point-Support
- Tonnenweise Dokumentation: man pages ('man zshall | wc -l' = 19267), html, dvi,...
- Zsh ist kostenlos und frei
- Zsh wird noch aktiv weiterentwickelt und der Autor ist für Anregungen empfänglich
Quellen: zsh-4.2.0/Etc/FEATURES, Changelogs, Announcements, http://www.cise.ufl.edu/help/software/doc/zsh/FEATURES,
zshfaq02.html, http://strcat.neessen.net/zsh/
Nettigkeiten der Zsh
Umbenennen von Dateien
Groß-/Kleinschreibung
Bei allen PDF-Dateien die mit einem Kleinbuchstaben beginnen, diesen durch den
entsprechenden Großbuchstaben ersetzen. Der Rest des Dateinamens soll so bleiben wie er
ist. Anmerkung: zmv bedingt 'autoload zmv'
zsh
autoload zmv
zmv '([a-z])(*).pdf' '${(C)1}$2.pdf'
Umbenennen von *.huch.bak in *.huch
zsh
autoload zmv
zmv '(*).bak' '$1'
Wie würde man das anders machen?
for FILE in *.bak; do mv $FILE $(basename $FILE .bak);done
oder:
find . -name '*.bak' -exec sh -c 'mv {} $(dirname {})/$(basename {} .bak)' \;
Leerzeichen in Dateinamen in Underscores umwandeln
$ zmv -Q "(**/)(* *)(D)" "\$1\${2// /_}"
Dateien listen
Symbolische Links auflisten
$ ls -l *(@)
-> man zshexpn | less -p 'Glob Qualifiers'
Dateinamen ausführen
Seit Zsh Version 4.2 kann man via "alias -s" (suffix alias) der Zsh
sagen, welches Kommando sie bei welchem Suffix (Dateiendung) ausführen soll. Als
Beispiel:
alias -s tex=vim
alias -s txt=vim
alias -s html=w3m
Wenn man jetzt 'datei.tex' oder 'datei.txt' in den Shellprompt eingibt und die
Returntaste betätigt wird vim mit der Datei gestartet.
Wenn man dies mit 'datei.html' macht wird der Kommandozeilenbrowser w3m mit der Datei geöffnet.
Quellen/Literatur/Download
Weiterführende Literatur ist auf der der
ZSH-Liebhaber-Seite erwähnt.
Konfigurationsdateien:
Mein spezieller Dank geht an: Matthias Kopfermann, Sven Guckes, Christian Schneider,
Sven Wischnowsky und Stephen Rueger, die mir (teils unbewusst ;-)) wertvolle Ideen und
Konfigurationsdateien geliefert haben.