1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/1999/REC-html401-19991224/loose.dtd">
2 <!-- Diese Seite untersteht dem Copyleft von Michael Prokop. Details unter http://www.michael-prokop.at/copyleft/ -->
5 <title>Computer - Tools - Zsh-Liebhaber-Seite @ Michael Prokop</title>
6 <meta name="Title" content="Michael Prokop - Homepage">
7 <meta name="Author" content="Michael Prokop">
8 <meta name="Revisit" content="After 7 days">
9 <meta name="Keywords" content="Michael, Prokop, Matthias, Kopfermann, Linux, Tools, Zsh, Zsh-Liebhaber-Seite, Shell, Bash">
10 <meta name="Description" content="Michael Prokops Homepage - Zsh-Liebhaber-Seite">
11 <meta name="Robots" content="index,follow">
12 <meta name="Language" content="german">
13 <meta name="identifier-url" content="http://www.michael-prokop.at/">
14 <meta name="MSSmartTagsPreventParsing" content="true">
15 <meta http-equiv="imagetoolbar" content="no">
16 <link rel="stylesheet" href="/style.css" type="text/css">
19 <body bgcolor="#FFFFFF" text="#333333" link="#000099" vlink="#333333" alink="#FFCC00">
20 <script src="/infotext.js" type="text/javascript"></script>
22 <table border="0" bgcolor="#FFCC00" cellpadding="0" cellspacing="0" width="100%" id="Navigation">
24 <td valign="top" width="24" height="59" rowspan="2">
25 <img src="../images/corner_tl.png" width="17" height="17" align="left" hspace="0" alt="*">
27 <td valign="middle" colspan="2" nowrap height="59" rowspan="2">
28 <div id="Layer1" style="position:absolute; width:404px; height:24px; z-index:1; left: 305px; top: 40px">
29 <form name="tool" method="post" action="">
30 <input type="text" name="tip" size="45">
33 <a href="/"><img src="../images/bckgrd.png" width="719" height="68" alt="Zur Startseite" title="Zur Startseite" border="0"></a></td>
34 <td colspan="2" height="71" valign="middle" rowspan="2">
36 <td align="right" height="41" valign="top"><img src="../images/corner_tr.png" width="17" height="17" align="right" hspace="0" alt="*"></td>
39 <td align="right" height="30" valign="top"> </td>
42 <td valign="bottom" height="25" width="25" align="left"><img src="../images/corner_bl.png" width="17" height="17" align="left" alt="Navigation: " hspace="0"></td>
43 <td colspan="3" nowrap height="19" valign="middle">
44 <a href="../info/" onmouseover="showtip('Informationen zur Website')" onmouseout="showtip('')">Info</a>
45 <a href="../person/" onmouseover="showtip('Infos über mich, meine Arbeit, Interessen, ...')" onmouseout="showtip('')">Person</a>
46 <a href="../gallery/" onmouseover="showtip('Meine Foto-Galerie')" onmouseout="showtip('')">Gallery</a>
47 <a href="../computer/" onmouseover="showtip('Computertipps und interessante Artikel')" onmouseout="showtip('')">Computer</a>
48 <a href="../internet/" onmouseover="showtip('Allerlei zum Thema Internet und Webdesign')" onmouseout="showtip('')">Internet</a>
49 <a href="../fun/" onmouseover="showtip('Just4FUN! Sprüche, Witze,...')" onmouseout="showtip('')">Fun</a>
50 <a href="../sonstiges/" onmouseover="showtip('Wissenswertes, die perfekte Rede und Allerlei')" onmouseout="showtip('')">Sonstiges</a>
51 <a href="../sitemap/" onmouseover="showtip('Die Sitemap zum besseren Überblick')" onmouseout="showtip('')">Sitemap</a>
52 <a href="../cgi-bin/search.pl" onmouseover="showtip('Die Homepage www.michael-prokop.at durchsuchen')" onmouseout="showtip('')">Suche</a>
53 <a href="../kontakt/" onmouseover="showtip('Kontaktmöglichkeit')" onmouseout="showtip('')">Kontakt</a></td>
54 <td height="25" valign="bottom" colspan="2"><img src="../images/corner_br.png" width="17" height="17" align="right" alt="*" hspace="0"></td>
57 <br><div align="right">Computer</div>
58 <div class="submenu" id="Navilinks">
59 <div class="normal"><a href="index.html" title="Allgemein"
60 onMouseOver="showtip('Überblick zu den Themen der Kategorie PC')"
61 onMouseOut="showtip('')"
63 <div class="normal"><a href="laptop.html" title="Laptop"
64 onMouseOver="showtip('Linux Mini-HowTO zum Sony VAIO FX 602 Laptop')"
65 onMouseOut="showtip('')"
67 <div class="normal"><a href="../latex/" title="LaTeX"
68 onMouseOver="showtip('LaTeX unter Linux und Windows - gvim')"
69 onMouseOut="showtip('')"
71 <div class="normal"><a href="linux.html" title="Linux"
72 onMouseOver="showtip('Allerlei zum Betriebssystem Linux')"
73 onMouseOut="showtip('')"
75 <div class="normal"><a href="office.html" title="Office"
76 onMouseOver="showtip('Allerlei zum Thema Office')"
77 onMouseOut="showtip('')"
79 <div class="normal"><a href="plan9.html" title="Plan 9"
80 onMouseOver="showtip('Das Netzwerkbetriebssystem Plan 9')"
81 onMouseOut="showtip('')"
83 <div class="normal"><a href="psion.html" title="Psion"
84 onMouseOver="showtip('Information zum Psion (Revo)')"
85 onMouseOut="showtip('')"
87 <div class="normal"><a href="qnx.html" title="QNX"
88 onMouseOver="showtip('Das Echtzeitbetriebssystem QNX')"
89 onMouseOut="showtip('')"
91 <div class="selected"><a href="#" title="Tools"
92 onMouseOver="showtip('Allerlei zu verschiedenen Tools/Software')"
93 onMouseOut="showtip('')"
95 <div class="normal"><a href="windows.html" title="Windows"
96 onMouseOver="showtip('Allerlei zum Betriebssystem Windows')"
97 onMouseOut="showtip('')"
101 <div class="button"><a href="tools.html" title="Allerlei">Allerlei</a></div>
102 <div class="button"><a href="tools_vim.html" title="vim">vim</a></div>
103 <div class="button"><a href="tools_mutt.html" title="mutt">mutt</a></div>
104 <div class="button"><a href="tools_slrn.html" title="slrn">slrn</a></div>
105 <div class="button"><a class="active" href="#" title="zsh">zsh</a></div>
106 <div class="button"><a href="tools_browser.html" title="Browser">browser</a></div>
107 <div class="button"><a href="tools_icq.html" title="icq">icq</a></div>
108 <div class="button"><a href="tools_screen.html" title="screen">screen</a></div>
112 <div class="subbutton"><a href="tools_zsh.html" title="mutt">Zsh - Generell</a></div>
113 <div class="subbutton"><a class="subactive" href="#" title="zsh-liebhaber">Zsh-Liebhaber</a></div>
116 <p class="index">Quick-Index</p>
119 <a class="smalllink" href="#vorwort">Vorwort</a> -
120 <a class="smalllink" href="#warum">Warum wurde diese Seite gemacht?</a> -
121 <a class="smalllink" href="#faehigkeiten">Fähigkeiten die an der Zsh faszinieren</a> -
122 <a class="smalllink" href="#lokaledateien">Lokale Dateien</a> -
123 <a class="smalllink" href="#literatur">Literatur</a>
126 <h1>Die Zsh-Liebhaber-Seite
127 <a href="http://www.michael-prokop.at/computer/tools_zsh_liebhaber.html">
128 <img src="http://www.michael-prokop.at/images/zsh_liebhaber.png" alt="zsh liebhaber
130 <strong><a href="tools_zsh_en.html">There exists an english webpage!</a></strong>
132 <p>Take a look at the <a href="/computer/tools_zsh_en.html">zsh-lovers</a> project!</p>
134 <h2><a name="vorwort"></a>Vorwort</h2>
136 <p>Willkommen zur Zsh-Liebhaber-Seite! Diese Webpage war ursprünglich unter <a
137 href="http://www.infodrom.north.de/~matthi/zsh/">www.infodrom.north.de/~matthi/zsh/</a>
138 erreichbar. Gemeinsam mit Matthias Kopfermann habe ich (Michael) diese Webpage hierher
139 verlagert, verbessert und aktualisiert. Redundanzen zu <a href="tools_zsh.html">Zsh -
140 Generell</a> sind durchaus möglich und nicht ungewollt. Über <a
141 href="mailto:zsh-liebhaber@michael-prokop.at">Feedback an
142 zsh-liebhaber@michael-prokop.at</a> freuen wir uns!</p>
145 Begonnen: Fre Okt 17 13:00:00 CET 1997
146 Zuletzt editiert: Sat Aug 14 12:20:29 CEST 2004
149 <p>Die Zsh (sprich Z-Shell) ist eine herausragende, aber im Verhältnis zur Bash
150 ziemlich unbekannte Shell, also ein befehlsorientierter Eingabemechanismus, über den
151 man vor allem Befehle unter Unix interaktiv eingeben und außerdem Befehle
152 automatisieren und Abläufe programmieren kann. Sie ist im Falle der Zsh mit einer
153 mächtigen Programmiersprache durchaus gleichzusetzen, wenn dabei auch kein
154 Maschinencode erzeugt wird.</p>
156 <h2><a name="warum"></a>Warum wurde diese Seite gemacht?</h2>
158 <p>Wir halten die Zsh für herausragend in Benutzerfreundlichkeit und Mächtigkeit. Sie
159 macht das Arbeiten auf der Kommandozeile zur Freude, besticht durch ungeheure
160 Anpassungsfähigkeit und hilft, wenn man sich einmal wieder nicht genau an irgendwelche
161 Optionen bei Befehlen erinnere. Zusätzlich kann sie vieles, was andere Shells nur
162 durch externe Befehle möglich machen. Ich (Matthias) selber stieß beim Lesen der
163 Linux-Gazette zum ersten Mal auf die Zsh. Ein Benutzer hatte dort in einer Email zum
164 Thema "Umwandlung von großen Buchstaben von DOS-Dateien nach Linux" eine sehr einfache
165 und kurze Lösung durch die Zsh berichtet (siehe unten). Genau dafür ist die Zsh wie
166 geschaffen. Man kann damit Probleme mit wenigen Tastenanschlägen lösen.</p>
168 <p>Auf einer Homepage über unterschiedliche Shells las ich (Matthias), die Zsh könne
169 wahrscheinlich mehr als der Autor selber <a
170 href="http://www.int.gu.edu.au/courses/2010int/nscp_shells.html">wisse</a>. Natürlich
171 hat das seinen Preis in der Größe der Shell und in der Größe des Handbuchs. Puristen
172 werden die Zsh wohl nicht unbedingt benutzen. Aber wer sagt denn, dass man nicht in
173 einer Sache Purist und in einer anderen sehr großzügig oder gar verschwenderisch sein
174 kann oder dass man nicht für bestimmte Aufgaben so und für andere anders verfährt, je
175 nach Bedarf, Speicherplatz, Rechnergeschwindigkeit?</p>
177 <p> <a href="zsh.intro.ps.gz" >Hier</a> findet sich die Beschreibung der Z-Shell vom
178 ihrem ursprünglichen Autor Paul Falstad, der übrigens durch einen Zhong Shao (heute
179 Professor in Yale) mit Benutzername <a
180 href="http://groups.google.com/groups?selm=18499%40princeton.Princeton.EDU&output=gplain">zsh</a>
181 auf diesen Namen kam. :)</p>
183 <p>Der ursprüngliche Autor beschrieb 1991 die Vorzüge dieser 1990 begonnenen Shell.
184 Trotz seines Alters kann dieser längere Artikel Neugier wecken. Zumindest bei Sven
185 Wischnowsky, einem der wichtigsten Zsh-Entwickler seit 1992 (ihm verdankt die Zsh ihre
186 Vervollständigungsmechanismen und vieles mehr) und 1997 bei mir (Matthias) und 2002 bei
187 mir (Michael) war der Artikel der Anlass, auf die Z-Shell umzusteigen. Und die Shell
188 hat heutzutage noch so viele praktische Fähigkeiten dazu bekommen!</p>
190 <p>Seit 1999 gibt es diesen neuen <a href="http://zsh.sunsite.dk/Guide/">Zsh-Guide</A>
191 von Peter Stephenson, einem anderen wichtigen Entwickler der Z-Shell, der mit großer
192 Liebe zum Detail, mit Witz und - wie wir finden - sehr verständlich auf die Zsh und
193 ihre Möglichkeiten eingeht und von dem in naher Zukunft sogar ein gedrucktes Buch über
194 diese Shell erscheinen soll!</p>
196 <p>Leider ist diese tolle Shell, die es gerade Anfängern so viel leichter machen könnte
197 und Power-Usern eine Unzahl an Möglichkeiten bietet, z.B. in Linux-Kreisen relativ
198 unbekannt, obschon sie erhebliche Vorteile gegenüber der Bash hat und gegenüber der
199 Tcsh auch eine ziemlich große Ähnlichkeit mit der Ksh und der Bourne-Shell aufweist und
200 sich auch fuer Skripte ausgesprochen gut eignet.</p>
202 <h2><a name="faehigkeiten"></a>Fähigkeiten, die an der Zsh faszinieren</h2>
206 <li>Man braucht kaum umzulernen: Die meisten Kommandos sind so, wie man sie von der
207 Bash und der <em>Ksh</em>, die sie vor allem nachahmt, kennt. Oft kann man auch
208 durch eine Beschreibung der <strong>Ksh</strong> eine Menge lernen. Diese ist
209 nämlich in vielen älteren Unix-Büchern ausführlich beschrieben.</li>
211 <li>Für Umsteiger bietet die Zsh einen Emulationsmodus für Sh, Csh und Ksh an.
212 Beispielsweise versucht <code>emulate sh</code>, die SH zu emulieren.
213 (siehe auch <code>man zshbuiltins</code> unter emulate.)</li>
215 <li>Außerdem zwingt die Shell dem Anwender nie ein bestimmtes Verhalten auf. Mit
216 über 150 Optionen lässt sich ihr Verhalten sehr flexibel an den Geschmack und die
217 Bedürfnisse des Benutzers anpassen.<br> So kann man mit der Z-Shell falsche Eingaben
218 korrigieren lassen, ist aber dazu in keiner Weise gezwungen: (<code>unsetopt
219 correct</code>) und die Vervollständigungen sind bis ins allerkleinste Detail
222 <li>Die Zsh ist ausgesprochen modular (über 25 Module). Damit ist der Nutzer in der
223 Lage, ganz nach Bedarf bestimmte Features zu benutzen und andere völlig auszusparen.
226 So hat die Zsh z.B. ein Mathematik-Modul mit über 30 mathematischen Funktionen, die
227 viele nicht brauchen werden, für manche aber sehr nützlich sind. Gleiches gilt für
228 das Profiler-Modul (zprof), ein mit den internen Vervollständigungen arbeitendes
229 FTP-Modul (zftp), das Pseudoterminal-Modul zur Automatisierung von Programmen, die
230 ein Terminal erwarten (zpty), u.s.w...</li>
232 <li>Die Zsh kann Funktionen mit <code>zcompile</code> in eine für den Computer
233 schneller zu lesende binäre Ausführungsform bringen. Dabei wird ein Word-Code ähnlich
234 dem Java-Bytecode erzeugt, nur, dass dabei words (2 Bytes) benutzt werden. So kann
235 man die Funktionen erheblich beschleunigen.</li>
237 <li>Intuitiv (wie in Perl, Python, Ruby) lassen sich in Zeichenketten Ersetzungen
238 durch Zeichenketten-Indizes machen:
241 a="ich hab nix gemacht.";a[1]='I';a[-1]='. (Bart Simpson)'</pre>
245 <li>Die Zsh unterstützt assoziative Arrays (Variablen-Felder mit <em>Buchstaben als
249 typeset <em>-A</em> ass_array; ass_array=(eins 1 zwei 2 drei 3 vier 4)</pre>
251 deklariert und definiert eine auch Hash genannte Feldvariable, deren einzelne
252 Elemente einen Index aus Buchstaben besitzen.
254 <code>print $ass_array[eins]</code> gibt im Beispiel das erste Element, 1, aus,
255 <code>print ${<em>(k)</em>ass_array}</code> gibt die Keys (Schlüssel),
256 <code>print ${<em>(v)</em>ass_array}</code> die Values (Werte).
259 <li>Temporäre unbenannte Variablen ermöglichen es, Teile aus Zeichenketten zu
260 extrahieren und alle möglichen Umwandlungen durchzuführen:
263 print ${<font color="green">$(</font> date <font color="green">)</font>[1]}</pre>
265 gibt das erste Wort, was date liefert, aus. Dazu muss der Befehl <code>date</code>
266 in <code>$()</code> angegeben werden (die alte Bourne-Shell-Schreibweise innerhalb
267 von <code>``</code> funktioniert hier nicht!).<br>
269 <code>$(date)</code> wird umschlossen von <code>${[1]}</code>, was das erste Wort
270 hervorbringt. Diese Konstruktion kann man beliebig verschachteln, was nur den
271 Nachteil besitzt, mit größerer Verschachtelungstiefe sehr unleserlich zu werden.
275 print <font color="red">${</font><font color="green">${</font><font color="blue">$(</font> LC_ALL=de_DE /sbin/ifconfig ppp0 <font color="blue">)</font>[5]<font color="green">}</font>#Adresse:<font color="red">}</font></pre>
278 könnte bei Verwendung von pppd unter Linux die IP-Adresse ausgeben, wobei nebem dem
279 eben gezeigten Mechanismus zusätzlich die Zeichenkette "Adresse:" gelöscht wird.<br>
281 Es ist auch möglich, head, tail, uniq, sort und sogar grep durch interne Mechanismen zu
282 ersetzen. Dazu muss so vorgegangen werden, dass der Modifier <code>(f)</code> im
283 <em>Index</em> der unbenannten Variablen Verwendung findet. Dies führt dann dazu, dass
284 bestimmte Zeilen statt Buchstaben durch den Index ausgewählt werden:
287 print -l ${"$( < datei )"[<font color="red">(f)</font>5]}</pre>
289 gibt die Zeile 5 aus "datei" aus.<br>
292 print ${"$( < /etc/passwd )"[(<font color="red">f</font><font color="blue">r</font>)*root*]}</pre>
294 gibt die erste Zeile, in der "root" vorkommt aus, wobei in diesem Fall im Index nach
295 einem Muster (hier: "*root*") mittels <code>(r)</code> gesucht wird.</li>
297 <li> Als regelrechtes grep mit allen Vorkommen kann man folgenden Mechanismus benutzen:
300 print -l ${(<em>M</em>)${<font color="green">(f)</font><font color="red">"</font>$(< /etc/passwd)<font color="red">"</font>##*$muster*}} (f) </pre>
302 liest die in Anführungsstrichen stehende Ausgabe der Datei zeilenweise in eine
303 unbenannte Variable. Wie auch in anderen Shells schneidet <code>##</code> am Anfang
304 <code>*$muster*</code> ab.<br>
306 Da aber <code><em>(M)</em></code> benutzt wird, werden alle Zeilen, bei denen das
307 Muster zutrifft, nicht abgeschnitten, sondern alleine ausgegeben. Das Gegenstück dazu
308 ist <em>(R)</em>, was im vorigen Fall dann einem "grep -v" entspricht.<br>
310 Würde man nur ein <code>#</code> angeben, würden die Sterne (Stellvertreter für 0 oder
311 mehr Zeichen) geizig - mit so wenig Zeichen wie möglich - ausgegeben. In diesem Fall
312 würde dann also nur <code>$muster</code> selber ausgeben.</li>
314 <li> Zsh kann wie bekanntere Programmiersprachen (Perl, Python, Ruby z.B) im Index
315 einer Variablen ein "von_feld,bis_feld".
318 print ${$( date )<em>[2<font color="magenta">,</font>4]</em>}</pre>
320 gibt vom zweiten bis vierten Wort das von "date" gelieferte Ergebnis aus. Oder es geht
321 auch mit negativen Index:
324 print ${${:-eins zwei drei vier fuenf}<em>[2,-2]</em>}</pre>
326 gibt als Ergebnis <code>zwei drei vier</code> aus. ('<code>:-</code>' ersetzt den
327 fehlenden Variablennamen hier wie bei der Bash durch seine Werte).<br>
329 Bei Arrays ist es auch möglich, zweidimensionale Indizes zu gebrauchen:<br>
332 print ${$(date)[4][1,5]}</pre>
334 gibt die Uhrzeit von date ohne Sekunden aus.</li>
336 <li> Mit Hilfe des Moduls <code>pcre</code> kann die Zsh seit Version 4.1.1 Perls
337 reguläre Ausdrücke verarbeiten. Dazu lädt man mit <code>zmodload zsh/pcre</code> das
338 PCRE-Modul ein, kompiliert dann einen beliebigen perlartigen regulären Ausdruck mit
339 Hilfe von <code>pcre_compile</code> und verarbeitet anhand des Fehlercodes 1 bzw. 0
340 alles weitere. Beispiel:
343 <em>pcre_compile</em> '\s\d\.\d{3}\.\d{3} Euro' &&\
344 <em>pcre_match</em> ' 1.000.000 Euro'\
345 && echo "Trifft zu!" || echo "Trifft nicht zu!"</pre>
347 Bei komplexeren Ausdrücken kann man die Geschwindigkeit noch durch <em>pcre_study</em>
350 <li>Mit dem sogenannten Here-String kann man eine Art Here-Document benutzen ohne ein
351 EOT-Signal auf einer Extra-Zeile eingeben zu müssen:
354 for Programm in cat tail head grep ; do >> /tmp/datei \
355 <em><<<</em> "Hallo,Welt! Ich habe das Geüfhl, mein \
356 externes $Programm wird bald nicht mehr so viel benutzt." ; done</pre>
358 Man achte auch auf das Auslassen von cat, was bei der zsh nicht mehr nötig ist!</li>
360 <li>Fließkommazahlen können berechnet werden:
363 printf "%.0f\n" $[ <em>2.8</em>*15 ]</pre>
365 Ausserdem kann in verschiedenen Zahlensystemen gerechnet werden, in dem in eckigen
366 Klammern <code>[#<zahlensystem>]</code> geschrieben wird, also:
369 for (( i=1; i<100; i++ )) { print $(( <em>[#10]</em> i)) }</pre>
374 $(( <em>[#16]</em> i )) }</pre>
376 Bei zweifacher Angabe von <code>#</code> wird das Zahlensystem nicht ausgegeben.<br>
378 Sogar einen "Taschenrechner" gibt es in der Zsh, der nach <code>autoload
379 <em>zcalc</em></code> zur Verfügung steht.</li>
381 <li> Die Zsh kann alles vervollständigen, was man sich so ungefähr vorstellen kann.
382 (siehe auch <code>zshcompctl</code> und seit 3.1.6 <code>zshcompsys</code> .
384 <!-- Sie erweitert sogar noch erheblich die Möglichkeiten, die die in
385 dieser Hinsicht vorbildliche Tcsh bietet. -->
387 (Programmierbare Vervollständigung ist für die Bash erst seit April 2000 (Version 2.04)
388 und bei der Ksh gar nicht vorhanden. Seit Zsh 4.1 können sogar die
389 Vervollständigungsmechanismen der Bash genutzt werden unter Verwendung von
390 <em>bashcompinit</em>.)<br>
392 Mit der Version 3.1.6 wird eine neue Richtung in der Programmierung von
393 Vervollständigungen vorgelegt.<br>
395 Statt mit Optionen lässt sich der Ergäzungsmechanismus der Shell nun sehr viel
396 einfacher durch den Aufruf von über 400 vordefinierten Funktionen programmieren.<br>
398 Das hat den Vorteil: Für sehr viele Bereiche lässt sich durch Kopieren und Editieren
399 schnell eine neue Vervollständigung fertigstellen, da man jetzt nicht mehr so
400 detailiert wissen muss, wie die neuen Vervollständigungen zu programmieren sind.
401 Außerdem muss man häufig sogar einfach nur mit <code>autoload compinit &&
402 compinit</code> den neuen Mechanismus blind in Gang setzen und kann direkt
403 vorgefertigte Vervollständigungs-Mechanismen nutzen. Man rufe danach beispielsweise
404 einmal <code>xterm -fn «TAB»</code>auf. (Siehe auch <a
405 href="compsys.html">hier</a>)<br>
407 Beispiele zur Vervollständigung (noch nach dem alten Schema bis
411 compctl -g '*(/)' cd </pre>
413 macht aus einer einfachen Dateiergänzung wie der Ksh eine intelligente
414 Vervollständigung für "cd", die nur noch Verzeichnisnamen aufführt.<br>
416 Vor allem mit <code>compctl -k '(`aktion`)'</code> lassen sich
417 sehr praktische Vervollständigungsmechanismen erstellen.
418 Man kann sich so z.B. ohne Probleme bei Aufruf eines Email-Programmes nur
419 Email-Adressen und mit ftp nur FTP-Adressen vervollständigen lassen.
420 Außerdem kann man bei der Vervollständigung auch Dateienden
422 Das ist z.B. bei Java sehr praktisch.
425 compctl -g '*.class(:r)' java</pre>
427 (Mehr Beispiele <a href="compctl.html">zur älteren Vervollständigung hier</a>)</li>
430 Mit der Zsh kann man sehr gezielt nach Worten in Dateien suchen:
431 Nach dem Freischalten von Sonderzeichen für die Reichweite eines
432 glob-Befehls mit <code>setopt extended_glob</code> ist folgendes machbar:
435 grep Wort *<em>~(</em>*.gz|*.bz|*.bz2|*.zip|*.Z<em>)</em></pre>
437 sucht 'Wort' nicht mehr in den komprimierten Dateien im Mail-Ordner.<br> <code>~</code>
438 bedeutet hier so viel wie "außer".<br>
440 Alle Dateien, die nicht die Endung *.bz2 und auch nicht *.gz enthalten , sucht man mit
443 ls <em>^(</em>*.bz2|*.gz<em>)</em></pre>
445 Das <code>^</code> ist also das "NICHT", das Ausrufezeichen wird von der Zsh für alte
448 An dieser Stelle bietet sich vielleicht ein globales Alias für komprimierte Dateien an
449 (siehe weiter unten). <br>
451 Zusätzlich zu <code>^</code> und <code>~</code> lassen sich die Ausdrücke
452 <code>#</code> und <code>##</code>benutzen, um null und mehr bzw. ein und mehr
453 Vorkommen des Zeichens davor zu erhalten, was bei Perls regulären Ausdrücken den
454 Zeichen <code>*</code> bzw. <code>+</code> entspricht.</li>
456 <li> Globale Aliase sind Aliase, die nicht nur am Anfang der Kommandozeile oder nach
457 <code> ; </code> als Aliase wirken können. Sie sollten gut gekennzeichnet werden:
460 alias <em>-g</em> §k="*~(*.bz2|*.gz|*.tgz|*.zip|*.z)"</pre>
462 und danach der Befehl
467 listet alle nicht-komprimierte Dateien auf.<br>
469 Mit <code> unalias <em>'</em>§k<em>'</em> </code> wird man dieses globale Alias wieder
470 los. Wichtig hierbei sind die einfachen Anführungsstriche. Sonst wirkt nämlich §k
471 weiter, was nicht im Sinne des Benutzers wäre.</li>
473 <li>Aliase können seit Version 4.2 auch verwendet werden, um bestimmten
474 Zeichenketten-Endungen (Suffixes) <em>nach</em> einem Punkt automatisch mit dem selben
475 Befehl aufzurufen, was meist für Dateiendungen benutzt wird. Dabei gilt:<br>
478 alias -s <font color="ed">NAME</font>=<font color="green">WERT</font></pre>
480 wobei TEXT.<font color="red">NAME</font> dann durch die Zsh zu <font
481 color="green">WERT</font> TEXT.<font color="ReD">NAME</font> wird.
484 alias <em>-s</em> <font color="red">txt</font>=<font color="green">'less -rE'</font></pre>
486 ruft alle <em>ohne Befehl</em> aufgerufenen .txt-Dateien automatisch mit dem Befehl
487 <code>less -rE</code> auf, so dass man jetzt einfach nur den Dateinamen und ein return
488 eingeben muss. Diese Funktionalität ist vergleichbar mit dem Anklicken einer oder
489 mehrerer Dateien mit einem graphischen Dateimanager. Dabei kann man auch globale
490 Zeichen wie <code>*</code> verwenden, also beispielsweise <code>*.txt</code> und ein
491 "enter" eingeben um alle Dateien mit Endung ".txt" mit less zu lesen.
493 <br>Praktischerweise gibt es mit <code>autoload zsh-mime-setup ; zsh-mime-setup</code>
494 die Möglichkeit, anhand der Mime-Definitionen in /etc/ schon bestimmte Datei-Endungen
495 mit bestimmten Programmen zu belegen.<br>
498 alias -s <font color="red">de</font>=<font color="green">w3m</font>
499 alias -s <font color="red">at</font>=<font color="green">w3m</font></pre>
501 ruft alle WWW-Seiten mit .de oder .at direkt mit w3m auf. ('.de' bzw. '.at' in der
502 Eingabe ist in diesem Fall <em>keine</em> Dateiendung!) </li>
504 <li> In der Zsh kann man aus jeder eigenen Funktion eine Datei machen, ohne dass diese
505 Datei ausführbar sein muss. Hierzu setzt man die Variable FPATH bzw fpath (siehe unten)
506 auf das oder die Verzeichnisse, die berücksichtigt werden sollen. <br>
508 In der Datei genügt es, einfach eine oder mehrere Funktionen zu schreiben, z.B:
511 begruessung() { echo "Hallo, $1" ; }
512 herzlich() { echo "Ist ja riesig, $1, Dich zu sehen" ; }</pre>
514 Jetzt muss noch dieser Dateiname mit <code><em>autoload</em> <em>dateiname</em> </code>
515 bekannt gemacht werden. Daraufhin stehen nach einmaligem Aufruf des Namens der
516 Funktionen die beiden Funktionen dann zur Verfügung. Schreibt man nur den
517 Funktionsrumpf allein dann hat das gegenüber dem Schreiben von Funktionen den Vorteil,
518 sofort ausgeführt werden zu können. autoload-<em>Funktionen</em> müssen nämlich <!--
519 normalerweise --> erst einmal aufgerufen werden, damit ihr Rumpf bekannt ist. Beispiel:
522 echo "Ist das schön, $1, Dich zu sehen\!" > ~/.zsh/funktionen/begruessung</pre>
524 ist nach Aufruf von <code>autoload begruessung</code> sofort nutzbar. (Siehe
525 AUTOLOADING FUNCTIONS unter 'man zshmisc') </li>
528 Statt in eine "Backslashitis" beim Aufschreiben von Skalar-Variablen mit viel
529 Inhalt zu verfallen (z.B. beim Definieren des Pfades) gibt es bei der Zsh die
531 das kleinbuchstabige Gegenüber des großbuchstabigen
532 Variablennamens als eines Arrays zu verwenden und sogar für eigene
534 <code>typeset -T</code> ein "Gegenüber" von einer Skalar-Variable zu einer
535 Feld-Variable durch die Kleinschreibweise der Variablen zu erzielen.
537 Dieser Variante kann man dann ein Feld aus Werten - durch Leerzeichen
538 oder Zeilenumbruch getrennt - zuweisen. Beispiel PATH:
547 zsh: <em>path=(</em> /usr/bin /usr/local/bin /usr/sbin /usr/local/sbin /usr/X11R6/bin <em>)</em></pre>
549 Da die Zsh für Feldvariablen runde Klammern braucht (wenn nicht <code>setopt
550 shwordsplit</code> gesetzt ist) sind die Worte in runde Klammern eingeschlossen. <br>
552 Wer allerdings kompatibel zur Sh/Ksh/Bash programmieren <b>muss</b>/<b>will</b>, der
553 muss die Option <code>setopt shwordsplit</code> setzen.</li>
555 <li><em>Zle</em> - der Zeileneditor der Zsh - ist den Zeileneditoren anderer Shells
556 überlegen. Hier kann man fröhlich mehrere Zeilen schreiben und nach dem Aufruf mit
557 RETURN separat einzelne Zeilen korrigieren. Man muss also nicht mehr immer einen
558 externen Editor aufrufen.<br>
560 Besonders nett dabei: Wo die Bash nur das Manövrieren wie in einer einzigen Zeile
561 zulässt, kann man bei der Zsh bequem mit dem Cursor - wie in einem Editor - über
562 mehrere Zeilen navigieren.<br>
564 Will man innerhalb mehrerer Zeilen editieren, dann muss man entweder mit <code>bindkey
565 "^Xp" push-line-or-edit</code> oder ähnlicher Tastenbelegung diesen Puffer in einen
566 anderen Puffer kopieren oder aber nach einem Control-C erneut die Zeilen zurückholen.
570 Mittels <em>zle -N</em> kann man eigene, sogenannte Widgets (das sind
571 Editier-Funktionen) zle bekannt machen. In den Variablen <em>LBUFFER</em> und
572 <em>RBUFFER</em> liegt die Kommandozeile links bzw. rechts des Cursors, die man
573 so sehr einfach manipulieren kann. Beispiel:
576 klammer() { LBUFFER="\${$LBUFFER" ; RBUFFER="}$RBUFFER" }</pre>
579 eine Funktion klammer, die man mit <code>bindkey '^g' klammer</code> jetzt
580 an die Taste Control-G zuweisen kann.<br>
582 Noch ein Beispiel für ein User-Widget:
591 Jetzt muss mit '<code>zle -N </code>' "wohin" als User-Widget deklariert werden.
592 Anschließend kann mit '<code>bindkey '^Ww' wohin</code>' die definierte und deklarierte
593 Editier-Funktion auf '<code>Control-Ww</code>' gelegt werden.<br>
595 Zusätzlich kann man mit '<code>autoload <em>zed</em></code>' sogar einen Editor (der in
596 der Z Shell selber geschrieben ist) benutzen, der dann von seiner Voreinstellung oder
597 durch '<code>bindkey -e</code>' Emacs-artig, bei Eingabe von '<code>bindkey -v</code>'
598 vi-artig funktioniert. Gesichert wird allerdings durch '<code>control-x control-w</code>'
599 oder im Vicmd-Modus mit '<code>ZZ</code>' und mit dem Befehl control-c bricht man ab.
600 Ruft man zed mit der Option -f oder als <em>fned</em> auf, kann man Funktionen
603 Als wohltuend empfinden wir bei einem Kommando des Zeileneditors das Kommando
604 <em>insert-last-word</em>, das im Gegensatz zur Bash nicht immer das letzte Wort,
605 sondern bei wiederholtem Aufruf das letzte Wort davor und so weiter aufruft. (Siehe
606 auch '<code>man zshzle</code>') </li>
608 <li>Die Zsh unterstützt wie ihr Vorbild -die Ksh- Koprozesse. Koprozesse sind eine
609 Möglichkeit, an Parallelprozesse Daten zu übergeben und Daten zu empfangen. Diese
610 Koprozesse werden allerdings mit '<em>coproc</em>' eingeleitet und nicht wie bei der Ksh
611 mit <code> |& </code>.<br> Mit '<em><code> print -p</code></em>' und mit
612 '<em><code>>&p </code></em>' als Umlenkung kann ich Daten an den Prozeß senden und mit
613 '<em>read -p</em> und '<em><code><&p</code></em>' als Umlenkung Daten von diesem Prozeß
617 <em>coproc</em> ed /tmp/notizen
618 <em>print -p</em> "a"
619 ls -l <em>>&p</em>
620 <em>print -p</em> ".\nwq"</pre>
622 schreibt in einen parallel laufenden Koprozess, den altehrwürdigen Ed, die Ausgabe von
623 '<code>ls -l</code>' und speichert den Inhalt in der Datei /tmp/notizen ab und beendet
626 Weitgehender als ein Coprozess ist das Laden des <em>zpty</em>-Moduls mit
627 '<code>zmodload zsh/zpty</code>', welches dann ähnliche Steuerungsmöglichkeiten wie das
628 Programm expect bietet. Als Beispiel für die Verwendung von zpty kann das Skript
629 nslookup in /usr/share/zsh/4.x.x/functions/ dienen, was das gleichnamige interaktive
630 Programm durch seine Vervollständigung leichter bedienbar macht. </li>
632 <li>Die Zsh kennt die Formatierungen, die die Ksh kennt. <em>typeset</em> - oben schon
633 kurz bei assoziativen Variabelfeldern erwähnt - ist ein mächtiger Formatierbefehl der
634 Ksh. Mit diesen Formatierungsregeln lassen sich Ausgaben auf unterschiedliche Weise
638 <em>typeset -L2</em> name=werteintrag ;print "[$name]"</pre>
640 gibt linksformatiert "[we]" aus, die ersten 2 Buchstaben, umrahmt von [].
643 <em>typeset -lL20</em> name=WERT;print "[$name]"</pre>
645 gibt in Kleinbuchstaben (-l für lower)
646 "[wert ]" aus, wobei 20 - 11
647 Leerzeichen eingefügt werden.
650 <em>typeset -r</em> RPROMPT=%n</pre>
652 schützt den Rechtsprompt vor einem versehentlichen Überschreiben. Die Variable ist
653 jetzt read-only und zsh warnt einen mit "zsh: read-only variable: RPROMPT ". Alle
654 typeset-Befehle können mit einem <code>-</code> statt dem <code>+</code> aufgehoben
655 werden. (Siehe <code> man zshbuiltins </code> unter typeset)<br>
657 Zusätzlich zu <code>typeset</code> kann man auch durch sogenannte Modifier die Ausgabe
658 von <code>print</code> verändern. Beispiel:
662 print "[${(Ll:20:)name}]"</pre>
664 ergibt genau die selbe Ausgabe wie
666 typeset -lL20 name</pre>
668 Seit Zsh 4.1.1 kann man mit
671 printf "%20s\n" ${(L)a}</pre>
673 ähnlich wie in der gleichnamigen C-Funktion auch dieses Ergebnis bekommen, ohne den
674 externen printf-Befehl nutzen zu müssen.</li>
676 <li>Die Ausgabe von Dateinamen kann mittels sogenannter Qualifier spezifiziert werden
677 (siehe <code> man zshexpn </code> unter Glob Qualifier). Beispiele:
680 print -l *<em>(m-1)</em> # listet nur Dateien zeilenweise auf, die vor
681 # bis zu einem Tag modifiziert wurden
683 print -l *<em>(a1)</em> # listet Dateien zeilenweise auf, auf die vor einem
684 # Tag zugegriffen wurde
686 print -l *<em>(@)</em> # listet nur die Links zeilenweise auf
688 ls -doF *<em>(/)</em> # findet nur die Verzeichnisse
690 chmod 640 *<em>(W)</em> # verändert die Rechte aller Dateien, in die
691 # jeder schreiben darf, denn das ist ja meistens
695 grep name *<em>(.)</em> # findet nur noch reine Dateien. Damit ist
696 # die unsinnige Meldung "grep: bla: Is a directory"
697 # für alle Zeiten vermeidbar.
700 Um einmal wieder an alte schlechtere Zeiten erinnert zu werden, könnte man auch
701 '<code>grep name *<em>(^.@)</em></code>' eingeben. Hiermit werden alle Dateien
702 aufgelistet, mit denen grep nichts anfangen kann, denn '^' ist das Nicht-Zeichen
706 gg() { grep -wE "$1" *<em>(.)</em> | less -r }</pre>
708 könnte eine kleine Zsh-Funktion sein, um gezielt nach einem Wort und unter Zuhilfenahme
709 von regulären Ausdrücken zu suchen. Ich persönlich (Matthias) benutze allerdings
710 lieber Perl für solche Dinge und habe dafür das Perl-Programm <code>mg</code> entdeckt.
713 <li>Ein sehr schneller Befehl, um DOS-Dateien (keine Verzeichnise) zu Dateien mit
714 kleinen Buchstaben zu machen ist:
717 for i in [A-Z][A-Z]*<em>(.)</em>; do mv $i ${i<em>:l</em>} ;done</pre>
719 Der Qualifier <em>:l</em> (für lowercase) leistet hier ganze Arbeit.
722 print -l *<em>(LM+3)</em></pre>
724 gibt zeilenweise Dateien aus, die über 3 Megabyte groß sind.</li>
726 <li> Ich kann unter der Zsh komprimierte Email-Pakete lesen, ohne mich zuerst um das
727 Entpacken kümmern zu müssen. Das geht bei gzip-gepackten Dateien z.B. so:
730 mutt -f <em>=(</em>zcat mailfold*.gz<em>)</em></pre>
732 In den <em>=()</em> steht dabei die Aktion, die mit einer Datei gemacht wird, es wird
733 dabei eine temporäre Datei erzeugt und mit ihr z.B. mutt -f aufgerufen. Ein anderes
737 mutt -f =(grepmail "Mustafa Mustermann" ~/mbox)</pre>
739 sucht alle Emails von Mustafa Mustermann aus einer sehr großen Email-Datei namens mbox mittels
740 <code>grepmail</code>, einem sehr mächtigen Perl-Programm zum Herausfiltern von Emails,
741 welche einem bestimmten Kriterium entsprechen, heraus. Die temporäre Datei wird
742 selbstverständlich nachher wieder gelöscht.<br>
744 <a href="tools_mutt.html">mutt</a> ist ein sehr schönes Mail-Programm, welches auch auf
745 der Kommandozeile funktioniert, das wir sehr empfehlen können. Mit 'mutt -f' liest
746 mutt nicht aus /var/spool/mail sondern die Email-Datei, hier mehrere Emaildateien. Ein
751 lynx -force_html -dump <em>=(</em>bzip2 -cd $1 | grep $2<em>)</em>
754 ermöglicht es, mit lynxbz bzip2-gepackte HTML-Seiten nach einem Begriff zu untersuchen.
755 Nötig wird dieser Mechanismus, wenn ein Programm <code>lseek</code> benötigt. (Siehe
756 <code>man 3 lseek</code>)<br>
758 Wird keine temporäre Datei benötigt, dann kann man wie auch bei der Bash
759 '<em><code><()</code></em>' verwenden. Damit erspart man sich dann die manuelle
760 Verwendung von <code>/proc/self/fd</code> oder die manuelle Erzeugung einer "named
764 lynx -force_html <( gzip -cd komprimiert.html.gz )</pre>
766 ist ein Beispiel, bei dem lynx die Ausgabe von '<code>gzip -cd
767 komprimiert.html.gz</code>' verarbeitet. <br>
769 Durch intelligente Kommunikation verschiedener Prozesse wird es möglich, dass man zwei
770 Pseudodateien erzeugen und miteinander vergleichen kann: In Shellkreisen wird dies als
771 'named pipe' bezeichnet, die die Zsh indirekt erzeugt.
774 diff <(zcat erste_datei.gz) <(zcat zweite_datei.gz)</pre>
776 vergleicht den Inhalt von zwei komprimierten Dateien miteinander.</li>
778 <li>Nach Setzung von READNULLCMD=less lässt sich eine Datei mit:
783 unter less angucken. Einfach ein <code><</code> vor die Datei setzen.</li>
785 <li>Es ist ohne Probleme möglich, die Standardausggabe an mehrere Dateien umzulenken:
788 ls >datei1 >datei2 >datei3</pre>
793 ls >> datei1 >> datei2</pre>
797 <li> Man kann auch die Standardeingabe von mehreren Dateien empfangen:
800 less < datei1 < datei2</pre>
803 <li> Es ist möglich, eine Umlenkung in eine Datei und gleichzeitig an eine Pipe zu
807 make >logfile | grep Error</pre>
810 <li> Mit <code>ls -lL <em>=</em>emacs</code> kann man beispielsweise in jedem
811 Verzeichnis schauen, wie groß 'emacs' genau ist. Man muss nicht mehr den Pfad angeben.
812 Die Zsh schaut dabei selbst im Pfad nach, wenn man emacs im Pfad hat. Man kann auch
813 bequem Dateien, die im Pfad stehen, auf diese Art editieren.
816 jed <em>=</em>genial.c</pre>
818 editiert eine C-Funktion, wenn sie im Pfad gefunden werden kann.</li>
820 <li> Statt eines sehr expliziten aber umständlich zu tippenden find-Befehls kann under
821 der Zsh <em>**</em> als rekursives Kürzel verwendet werden. Mit:
824 print -l <em>**</em>/*.html</pre>
826 findet man alle HTML-Seiten, die
827 in allen Verzeichnissen unterhalb des jetzigen Verzeichnisses vorhanden
828 sind und gibt sie auf je einer Zeile (-l) aus.(**=Rekursion)<br>
831 print -l **/datei.html # sucht die bestimmte Datei in allen
832 # vom aktuellen Verzeichnis abgehenden
833 # Verzeichnissen und gibt genau sie aus.
835 print -l **/*.html~datei.html # gibt alle HTML-Seiten
836 # mit Ausnahme von datei.html zeilenweise aus.
838 grep name **/*.txt # sucht in allen Texten unterhalb des
839 # gegenwärtigen Verzeichnisses nach Dateien
845 <li>Mit <code><em>vared</em></code> kann man alle Umgebungsvariablen editieren. Das
846 finden wir praktisch, weil wir sofort die Variable erreichen und nicht erst in einer
847 Datei wie .zshrc nach ihr suchen müssen. Außerdem wirkt das Editieren der Variablen
848 natürlich sofort.</li>
850 <li>Der Befehl <code>dirs <em>-v</em></code> zeigt alle Verzeichnisse, in denen man in
851 einer Sitzung gewesen ist zeilenweise an. Wenn man <br> <code>setopt autopushd</code>
852 setzt, kann man nun mit cd +2 das vorletzte Verzeichnis erreichen.</li>
854 <li> Mit der Zsh kann man sehr lange Unterverzeichnisse im Prompt mit einem kurzem oder
855 signifikanteren Namen (named directory) versehen und dann mit ~name aufrufen. Das ist
856 insbesondere dann sehr praktisch, wenn man in einem sehr entfernten Ordner von '/' aus
857 gesehen arbeitet. <br>Ich (Matthias) habe mir eine kleine Zsh-Funktion geschrieben, die
858 mir aus einem langem Verzeichnisnamen einen kurzen erzeugt: <br>
862 NAMED_DIRECTORY=$PWD:t; # der Name des jetzigen Verzeichnisses wird
863 # an NAMED_DIRECTORY ohne die Hierarchie übergeben.
865 eval $NAMED_DIRECTORY=$PWD; # es findet die Setzung eines named directory statt.
866 cd ~$NAMED_DIRECTORY; # es wird in das named directory gesprungen.
867 # ist mit dem bestehenden Verzeichnis identisch
868 # aber der Name ist kürzer im Prompt.
873 Eine außerdem sehr praktische Möglichkeit besteht darin, dass man jetzt nicht mehr den
874 ganzen Pfadnamen angeben muss, wenn man eine Datei verschiebt. Z.B.:
877 mv datei.1 ~lm1</pre>
879 könnte die Datei bequem nach /usr/local/man/man1/ verschieben, wenn man
880 <code>lm1=/usr/local/man/man1</code> gesetzt hat.<br>
882 Bei der Prompt-Darstellung gibt es zwei Möglichkeiten: Entweder weisst man am Ende auch
883 noch den letzten Slash zu: <code>info=/usr/local/info/</code> Dann wird im Prompt der
884 ganze Name dargestellt. <code>cd ~info</code> springt zwar nach /usr/local/info, aber
888 /usr/local/info%</pre>
890 Möchte man aber den kurzen Prompt haben, dann muss man so zuweisen:
893 <em>info=</em>/usr/local/info</pre>
895 -also ohne Slash am Ende.</li>
897 <li>Die Option <code><em>autocd</em></code> erlaubt es, nur den Namen eines Ordners
898 anzugeben. Bei Eindeutigkeit wird dann sofort in diesen Ordner gesprungen. Z.B.
899 springt <code>bin «enter» </code> dann sofort in das bin-Verzeichnis.</li>
901 <li>Es gibt keinen Fehler bei Farbprompts wie unter der Bash1-Shell. Gerade bei der
902 Gliederung des Prompts ist das besonders wichtig. Da die üblichen Escape-Sequenzen sehr
903 unleserlich sind gibt es in der Zsh eine besonders elegante Möglichkeit, um Farben zu
904 definieren. Ein Beispiel:
907 autoload -U colors && colors
908 echo "$fg_bold[red]zsh $fg_no_bold[white]is $bg[blue]$fg_bold[green]nice"</pre>
912 Bei der Zsh müssen hierzu allerdings die Escape-Befehle von <code><em>%{</em>
913 <em>%}</em> </code>eingerahmt werden. Also zum Beispiel:
916 <em>%{</em>^[[31m<em>%}</em>%~ <em>%{</em>[0m<em>%}</em></pre>
918 Ich habe mir, um die Übersicht nicht zu verlieren, Variablen
919 definiert, die die Farben für den Prompt enthalten.
922 RED_PROMPT='<em>%{</em>^[[31m<em>%}</em>'
923 OFF_PROMPT='<em>%{</em>[0m<em>%}</em>'
926 Jetzt kann ich auf diese Variablen mit $ zugreifen.</li>
929 <li>Mit <em>RPROMPT</em> lässt sich ein PROMPT auf der rechten Seite
932 <code>RPROMPT=%l</code> zeigt beispielsweise an, auf welchem Rechner
933 man sich befindet.<br>
935 <code>RPROMPT=%n</code> zeigt den Benutzer an.<br>
936 <code>RPROMPT=%T</code> zeigt die Zeit an.<br>
937 <code>RPROMPT=%D{%d.%m.%y}</code>
939 zeigt das Datum nach deutscher Darstellung an.</li>
941 <li>Selbstverständlich kennt die Zsh auch eine Korrekturmöglichkeit bei
942 falscher Eingabe, die aber nur dann wirksam wird, wenn man das wirklich
943 eingestellt hat. Man setzt in einen solchem Fall einfach:
946 setopt <em>autocorrect</em></pre>
948 Die Korrektur kann durch Setzung eines
951 alias <befehl>=<em>nocorrect</em> <befehl></pre>
953 verhindert werden.</li>
955 <li>Um darüber informatiert zu werden, wer alles außer mir sich
956 eingeloggt hat, gibt es das Kommando <code><em>watch</em></code> wie unter der
960 <em>watch=(</em>notme<em>)</em></pre>
962 listet z.B. alle Benutzer auf, die nicht ich sind :)<br>
964 Hierbei kann das Format der Ausgabe geändert werde:<br>
967 <em>WATCHFMT</em>='%n eingeloggt auf Terminal %l von %M seit %T '</pre>
969 Wählt man <code>watch=(@vorsicht_ist_angesagt)</code>, so werden alle Benutzer
970 aufgeführt, die von dem Server vorsicht_ist_angesagt eingeloggt sind.<br> Positiv herum
971 kann man so natürlich auch alle Freunde erkennen lassen:
974 watch=( < ~/.freunde root)</pre>
976 liest alle Freunde aus der Datei <code>.friends</code> in das Feld watch zusätzlich zu
977 root ein. So kann man schnell erkennen, wenn sich Freunde einloggen.</li>
979 <li>Es gibt in der Zsh einen sehr bequemen Wiederholungsbefehl, der von der tcsh
980 abgeschaut ist: <code>repeat</code>. Möchte man z.B. einen Werbemailer böswillig
981 strafen, dann könnte man das so machen:<br>
984 <em>repeat</em> 100 mail -s "spams suck" badcompany@devilsheart.com < flame</pre>
986 Dabei sollte allerdings bedacht werden, dass man damit meist harmlose Benutzer trifft,
987 die schlechte Passworte haben und deshalb Räubern auf den Leim gegangen sind.</li>
989 <li>Ruft man ein altes Kommando mit <code>!?kommando </code>auf, hat man die
990 Möglichkeit, vor der erneuten Ausführung zu schauen, ob es sich hierbei auch um das
991 gewünschte Kommando handelt. Man drückt dazu einfach «TAB». Ebenso kann man sich auch
992 die genau betroffenen Dateien eines global wirkenden Befehles (z.B. 'ls *.html') mit
995 <li>Gerade eben getippte Worte auf der Kommandozeile können mit
996 !# genauer wiedergegeben werden als bei Bash/Tcsh/Ksh. Man gibt einfach
997 an, wo wiederholt werden soll - z.B.:
1000 echo ein_langes_wort zweites_langes_wort drei !#1-2</pre>
1002 schreibt auf den Bildschirm: 'ein_langes_wort zweites_langes_wort drei ein_langes_wort
1003 zweites_langes_wort'.</li>
1005 <li>Um die Funktion funct alle 300 Sekunden auszuführen führt man einfach folgenden
1008 <pre class="rahmen">
1009 periodic funct() PERIOD=300 fortune -s</pre>
1011 Anmerkung: Allerdings muss dazu auch am Prompt ein Befehl eingegeben werden, sonst kann
1012 man natürlich nichts auf dem Bildschirm sehen.</li>
1014 <li>Die Zsh kennt den '..' Operator von Pascal (und Perl):
1016 <pre class="rahmen">
1017 echo {1..7} "\nWo ist denn die Bash geblieben?"</pre>
1021 <pre class="rahmen">
1023 Wo ist denn die Bash geblieben?</pre>
1027 <li>Die Zsh hat in ihrer sehr mächtigen HISTORY CONTROL ein <em>run-help</em>
1028 Kommando, mit dem zu einem Buffer gezielt Informationen abgerufen werden können.
1029 Voreingestellt ist hier der Aufruf der Manpage zu dem Kommando. Verändern könnte man
1030 diesen Aufruf, in dem man einfach aus:
1032 <pre class="rahmen">
1033 alias run-help=man # ein ->
1034 alias run-help=info</pre>
1038 <pre class="rahmen">
1039 man_zshall() man zshall # und nachfolgendes Deklarieren von
1040 zle -N man_zshall # kann durch Definition von
1041 bindkey '^g' man_zshall # nun immer bei Control-G ausgeführt werden.</pre>
1045 <li><code>sched </code> ist ein interner Befehl zum automatischen, zeitgebundenen
1046 Abarbeiten von Kommandos ähnlich wie bei 'at'. Dabei werden die Kommandos
1047 aber nicht ausgeführt und dann als E-Mail zugeschickt, sondern gelangen
1048 erst einmal in den Puffer und werden beim nächsten Kommando erst
1049 auf dem Bildschirm ausgegeben.
1051 <pre class="rahmen">
1052 sched +0:10 figlet "Du musst jetzt los"</pre>
1054 führt in 10 Minuten in Großschrift auf dem Bildschirm eine Warnung zum Gehen aus.
1055 Dabei ist allerdings das Durchführen des Befehls abhängig von der Eingabe eines
1056 nächsten Befehls.</li>
1058 <li>Wer jetzt von der Z-Shell endgültig überzeugt ist und den Umstieg von z.B. der Bash
1059 wagt sollte sich die Bemerkungen von Matthias zum <a href="umstieg.txt">Umstieg von der
1060 Bash auf die Z-Shell</a> durchlesen.</li>
1064 <h2><a name="lokaledateien"></a>Lokale Dateien</h2>
1066 Folgende Dateien wurde von Matthias erstellt bzw. gesammelt:
1069 <li><a href="zsh.intro.ps.gz">Zsh Referenz-Karte als Postscript-Datei (gzip) [zsh.intro.ps.gz]</a>
1070 <li><a href="zsh-refcard.pdf">Zsh Referenz-Karte als PDF-Datei</a>
1071 <li><a href="compsys.html">compsys.html</a>
1072 <li><a href="compctl.html">compctl.html</a>
1073 <li><a href="umstieg.txt">umstieg.txt</a>
1076 Die <a href="tools_zsh.html">Zsh-Generell</a>-Webpage von Michael ist auch via <a
1077 href="#oben">obiger Navigation</a> erreichbar.
1079 <h2><a name="literatur"></a>Literatur</h2>
1081 <h3>Zsh-Homepage/Download</h3>
1084 <li><a href="http://www.zsh.org/">zsh.org</a>: zentrale Z-Shell-Homepage</li>
1085 <li><a href="http://zsh.sunsite.dk/">zsh.sunsite.dk/</a> - <em>Die</em> Zsh-Page schlechthin!</li>
1086 <li><a href="http://sourceforge.net/projects/zsh/">zsh.sf.net</a> - zsh-Projektseite
1087 bei sourceforge.net</li>
1088 <li><a href="http://bugs.debian.org/cgi-bin/pkgreport.cgi?pkg=zsh">Debian bug reports
1091 href="http://arch.debian.org/cgi-bin/viewarch.cgi/schizo@debian.org--2004-zsh-upstream-cvs-head/zsh--cvshead--1.0">zsh-upstream-cvs-head
1093 <li><a href="ftp://ftp.fu-berlin.de/pub/unix/shells/zsh/">ftp://ftp.fu-berlin.de/pub/unix/shells/zsh/</a> -
1094 Z-Shell Mirror Deutschland</li>
1095 <li><a href="http://www.zsh.org/mla/">Zsh - Mailing List Archive</a></li>
1096 <li><a href="http://zsh.sunsite.dk/links.html">Weitere Links auf der
1097 zsh-Homepage</a></li>
1100 <h3>Englische Artikel</h3>
1103 <li><a href="http://zsh.sunsite.dk/Guide/zshguide.html">A User's Guide to the Z-Shell</a> von Peter Stephenson (1999) </li>
1104 <li><a href="http://www-106.ibm.com/developerworks/linux/library/l-z.html?dwzone=linux">Introducing the Z-Shell</a> von IBM Developerworks (1.2.2001)</li>
1105 <li><a href="http://www.daemonnews.org/199910/zsh.html">Artikel in BSD-News</a> von Dominic Mitchell (Oktober 1999)</li>
1106 <li><a href="http://www.linux-mag.com/cgi-bin/printer.pl?issue=2002-05&article=power">Making the Transition to Zsh</a> Artikel im englischsprachigen Linux-Magazin, von John Beppu (Mai 2002)</li>
1107 <li>Writing Zsh Completition Functions (Juli 2002): <a
1108 href="http://www.linux-mag.com/2002-07/power_01.html">Teil 1</a> und <a
1109 href="http://www.linux-mag.com/2002-07/power_02.html">Teil 2</a></li>
1110 <li><a href="http://www.acm.uiuc.edu/workshops/zsh/toc.html">Zsh Workshop</a> von
1111 Larry P. Schrof</li>
1112 <li><a href="http://strcat.neessen.net/zsh/">Zsh-Webpage</a> von Christian
1116 <h3>Hilfreiches</h3>
1119 <li><a href="http://zsh.sunsite.dk/FAQ/">Z-Shell Frequently-Asked Questions</a></li>
1120 <li><a href="http://www.zshwiki.org/">Zsh Wiki und Sammelstätte von Tricks</a></li>
1121 <li><a href="http://www.zsh.org/mla/">Suche in der MailingList der Zsh</a></li>
1122 <li><a href="http://zsh.sunsite.dk/Refcard/refcard.ps.gz">Zsh Referenz-Karte als Postscript Datei (gzip)</a></li>
1123 <li><a href="http://www.int.gu.edu.au/courses/2010int/nscp_shells.html">http://www.int.gu.edu.au/courses/2010int/nscp_shells.html</a> - NCSP - Unix Shells; sehr guter englischer Text über Shells im Allgemeinen.</li>
1124 <li><a href="http://adamspiers.org/computing/shells/">Adam's UNIX shells page</a></li>
1125 <li><a href="http://www.opengroup.org/onlinepubs/007908799/xcu/shellix.html">The Single UNIX ® Specification, Version 2 - Shell Command Language Index</a></li>
1126 <li><a href="http://ftp.berlios.de/pub/netzworkk/scripts/Sources/">kwtools</a> - Eine
1127 sehr umfangreiche Zsh-Skriptsammlung (basierend auf <a
1128 href="http://packages.debian.org/unstable/misc/dialog">dialog</a>) von Kai Wilke für
1129 diverse oft gebrauchte Anwendungen</li>
1130 <li><a href="http://www.rayninfo.co.uk/tips/zshtips.html">Zzappers Best of ZSH
1131 Tips</a> - gesammelte Tipps von David Rayner</li>
1132 <li><a href="http://www.dotfiles.com/index.php3?app_id=4">zshrcs @ dotfiles.com</a></li>
1135 <h3>Live-CDs mit Zsh</h3>
1138 <li><a href="http://grml.org/">grml</a>
1139 <li><a href="http://kano.mipooh.net/kanotix/mirrors.html">Kanotix</a>
1140 <li><a href="http://www.gobolinux.org">Gobolinux</a> (andere Dateisystem-Hierarchie)
1141 <li><a href="http://www.dynebolic.org">Dynebolic</a> (Fernsehen - und Radio-Sender werden)
1142 <li><a href="http://livecd.pld-linux.org">PLD-Linux</a>
1145 <p>Diese Seite verlinken?<br />
1146 <a href="http://www.michael-prokop.at/computer/tools_zsh_liebhaber.html">
1147 http://www.michael-prokop.at/computer/tools_zsh_liebhaber.html</a>
1150 <p>Bekennender Zsh-Liebhaber? Nutze einen dieser Button:<br />
1151 <a href="http://www.michael-prokop.at/computer/tools_zsh_liebhaber.html">
1152 <img src="http://www.michael-prokop.at/images/zsh_liebhaber.png" alt="zsh liebhaber
1153 webpage"></a>
1154 <a href="http://www.michael-prokop.at/computer/tools_zsh_liebhaber.html">
1155 <img src="http://www.michael-prokop.at/images/zsh_lover.png" alt="zsh lover"></a>
1157 <p>Die Autoren dieser Webpage (<a
1158 href="mailto:matthi@infodrom.north.de">Matthias
1159 Kopfermann</a> und <a href="/kontakt/">Michael Prokop</a>) sind via <a
1160 href="mailto:zsh-liebhaber@michael-prokop.at">zsh-liebhaber@michael-prokop.at</a>
1161 erreichbar! Feedback ist willkommen!</p>
1165 <div class="up" id="Footer1">
1166 <a href="#oben"><img src="../images/nachoben.png" width="40" height="40" border="0" align="middle" alt="*"></a>
1167 <a href="#oben">Nach oben</a>
1170 <div class="online">
1171 <!--> <a href="http://www.michael-prokop.at/copyleft/">Copyleft</a> by Michael
1172 Prokop und Matthias Kopfermann. <br>Diese Seite gehört zu <a
1173 href="http://www.michael-prokop.at/">www.michael-prokop.at</a>-->
1174 Autoren: Michael Prokop und Matthias Kopfermann
1177 <a href="http://jigsaw.w3.org/css-validator/check/referer">
1178 <img border="0" src="../images/vcss.png" alt="Valid CSS!" width="88" height="31" ></a>
1179 <a href="http://validator.w3.org/check/referer">
1180 <img border="0" src="../images/vali.png" alt="Valid HTML 4.01!" height="31" width="88"></a>