Merge remote-tracking branch 'origin/github/pr/45'
[grml.org.git] / zsh / tools_zsh_liebhaber.html
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/ -->
3 <html>
4 <head>
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">
17 </head>
18
19 <body bgcolor="#FFFFFF" text="#333333" link="#000099" vlink="#333333" alink="#FFCC00">
20 <script src="/infotext.js" type="text/javascript"></script>
21 <a name="oben"></a>
22 <table border="0" bgcolor="#FFCC00" cellpadding="0" cellspacing="0" width="100%" id="Navigation">
23   <tr> 
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="*">
26     </td>
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">
31         </form>
32       </div>
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">
35     </td>
36     <td align="right" height="41" valign="top"><img src="../images/corner_tr.png" width="17" height="17" align="right" hspace="0" alt="*"></td>
37   </tr>
38   <tr> 
39     <td align="right" height="30" valign="top">&nbsp;</td>
40   </tr>
41   <tr> 
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>
55   </tr>
56 </table>
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('')"
62                                   >Allgemein</a></div>
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('')"
66                                   >Laptop</a></div>
67              <div class="normal"><a href="../latex/" title="LaTeX"
68                                   onMouseOver="showtip('LaTeX unter Linux und Windows - gvim')"
69                                   onMouseOut="showtip('')"
70                                   >LaTeX</a></div>
71              <div class="normal"><a href="linux.html" title="Linux"
72                                   onMouseOver="showtip('Allerlei zum Betriebssystem Linux')"
73                                   onMouseOut="showtip('')"
74                                   >Linux</a></div>
75              <div class="normal"><a href="office.html" title="Office"
76                                   onMouseOver="showtip('Allerlei zum Thema Office')"
77                                   onMouseOut="showtip('')"
78                                   >Office</a></div>
79              <div class="normal"><a href="plan9.html" title="Plan 9"
80                                   onMouseOver="showtip('Das Netzwerkbetriebssystem Plan 9')"
81                                   onMouseOut="showtip('')"
82                                   >Plan9</a></div>
83              <div class="normal"><a href="psion.html" title="Psion"
84                                   onMouseOver="showtip('Information zum Psion (Revo)')"
85                                   onMouseOut="showtip('')"
86                                   >Psion</a></div>
87              <div class="normal"><a href="qnx.html" title="QNX"
88                                   onMouseOver="showtip('Das Echtzeitbetriebssystem QNX')"
89                                   onMouseOut="showtip('')"
90                                   >QNX</a></div>
91              <div class="selected"><a href="#" title="Tools"
92                                   onMouseOver="showtip('Allerlei zu verschiedenen Tools/Software')"
93                                   onMouseOut="showtip('')"
94                                   >Tools</a></div>
95              <div class="normal"><a href="windows.html" title="Windows"
96                                   onMouseOver="showtip('Allerlei zum Betriebssystem Windows')"
97                                   onMouseOut="showtip('')"
98                                   >Windows</a></div>
99           </div>
100      <div class="page">     
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>
109            <p>&nbsp;</p>
110
111            <p>Submenu:</p>
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>
114            <p>&nbsp;</p>
115
116            <p class="index">Quick-Index</p>
117
118            <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>
124             </p>
125
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
129         webpage"></a></h1>
130         <strong><a href="tools_zsh_en.html">There exists an english webpage!</a></strong>
131
132         <p>Take a look at the <a href="/computer/tools_zsh_en.html">zsh-lovers</a> project!</p>
133
134         <h2><a name="vorwort"></a>Vorwort</h2>
135  
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>
143         
144 <pre>
145 Begonnen:         Fre Okt 17 13:00:00 CET 1997
146 Zuletzt editiert: Sat Aug 14 12:20:29 CEST 2004
147 </pre>
148
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>
155         
156         <h2><a name="warum"></a>Warum wurde diese Seite gemacht?</h2>
157
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>
167         
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>
176         
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&amp;output=gplain">zsh</a>
181         auf diesen Namen kam. :)</p>
182         
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>
189         
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>
195         
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>
201         
202         <h2><a name="faehigkeiten"></a>Fähigkeiten, die an der Zsh faszinieren</h2>
203         
204         <ol>
205         
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>
210           
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>
214           
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
220           anpassbar.</li>
221
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.
224           <br>
225
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> 
231
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>
236  
237           <li>Intuitiv (wie in Perl, Python, Ruby) lassen sich in Zeichenketten Ersetzungen
238           durch Zeichenketten-Indizes machen:
239
240 <pre class="rahmen">
241 a="ich hab nix gemacht.";a[1]='I';a[-1]='. (Bart Simpson)'</pre>
242
243           </li>
244
245           <li>Die Zsh unterstützt assoziative Arrays (Variablen-Felder mit <em>Buchstaben als
246           Index</em>):
247           
248 <pre class="rahmen">
249 typeset <em>-A</em> ass_array; ass_array=(eins 1 zwei 2 drei 3 vier 4)</pre>
250
251           deklariert und definiert eine auch Hash genannte Feldvariable, deren einzelne
252           Elemente einen Index aus Buchstaben besitzen.
253
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).
257           </li>
258         
259           <li>Temporäre unbenannte Variablen ermöglichen es, Teile aus Zeichenketten zu
260           extrahieren und alle möglichen Umwandlungen durchzuführen:
261           
262 <pre class="rahmen">
263 print ${<font color="green">$(</font> date <font color="green">)</font>[1]}</pre>
264           
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>
268
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.
272           <br>
273           
274 <pre class="rahmen">
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>
276
277
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>
280         
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:
285
286 <pre class="rahmen">
287 print -l ${&quot;$( &lt; datei )&quot;[<font color="red">(f)</font>5]}</pre>
288
289         gibt die Zeile 5 aus "datei" aus.<br>
290         
291 <pre class="rahmen">
292 print ${&quot;$( &lt; /etc/passwd )&quot;[(<font color="red">f</font><font color="blue">r</font>)*root*]}</pre>
293
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>
296
297         <li> Als regelrechtes grep mit allen Vorkommen kann man folgenden Mechanismus benutzen:
298
299 <pre class="rahmen">
300 print -l ${(<em>M</em>)${<font color="green">(f)</font><font color="red">&quot;</font>$(&lt; /etc/passwd)<font color="red">&quot;</font>##*$muster*}} (f) </pre>
301         
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>
305         
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>
309         
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>
313
314         <li> Zsh kann wie bekanntere Programmiersprachen (Perl, Python, Ruby z.B) im Index
315         einer Variablen ein "von_feld,bis_feld".
316
317 <pre class="rahmen">
318 print ${$( date )<em>[2<font color="magenta">,</font>4]</em>}</pre>
319
320         gibt vom zweiten bis vierten Wort das von "date" gelieferte Ergebnis aus.  Oder es geht
321         auch mit negativen Index:
322         
323 <pre class="rahmen">
324 print ${${:-eins zwei drei vier fuenf}<em>[2,-2]</em>}</pre>
325
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>
328         
329         Bei Arrays ist es auch möglich, zweidimensionale Indizes zu gebrauchen:<br>
330         
331 <pre class="rahmen">
332 print ${$(date)[4][1,5]}</pre>
333
334         gibt die Uhrzeit von date ohne Sekunden aus.</li>
335
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:
341         
342 <pre class="rahmen">
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>
346
347         Bei komplexeren Ausdrücken kann man die Geschwindigkeit noch durch <em>pcre_study</em>
348         verbessern.</li>
349
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:
352
353 <pre class="rahmen">
354 for Programm in cat tail head grep ; do &gt;&gt; /tmp/datei  \
355 <em>&lt;&lt;&lt;</em> "Hallo,Welt! Ich habe das Geüfhl, mein             \
356 externes $Programm wird bald nicht mehr so viel benutzt." ; done</pre>
357
358         Man achte auch auf das Auslassen von cat, was bei der zsh nicht mehr nötig ist!</li>
359
360         <li>Fließkommazahlen können berechnet werden:
361
362 <pre class="rahmen">
363 printf "%.0f\n" $[ <em>2.8</em>*15 ]</pre>
364
365         Ausserdem kann in verschiedenen Zahlensystemen gerechnet werden, in dem in eckigen
366         Klammern <code>[#&lt;zahlensystem&gt;]</code> geschrieben wird, also:
367         
368 <pre class="rahmen">
369 for (( i=1; i<100; i++ )) { print $(( <em>[#10]</em> i)) }</pre>
370
371         entspricht
372
373 <pre class="rahmen">
374 $(( <em>[#16]</em> i )) }</pre>
375
376         Bei zweifacher Angabe von <code>#</code> wird das Zahlensystem nicht ausgegeben.<br>
377         
378         Sogar einen "Taschenrechner" gibt es in der Zsh, der nach <code>autoload
379         <em>zcalc</em></code> zur Verfügung steht.</li>
380
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> .
383         
384         <!-- Sie erweitert sogar noch erheblich die Möglichkeiten, die die in
385         dieser Hinsicht vorbildliche Tcsh bietet. -->
386
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>
391         
392         Mit der Version 3.1.6 wird eine neue Richtung in der Programmierung von
393         Vervollständigungen vorgelegt.<br>
394         
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>
397
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 &amp;&amp;
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>
406
407         Beispiele zur Vervollständigung (noch nach dem alten Schema bis
408         3.1.5):
409
410 <pre class="rahmen">
411 compctl -g '*(/)' cd </pre>
412
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>
415         
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
421         abschneiden lassen.
422         Das ist z.B. bei Java sehr praktisch.
423         
424 <pre class="rahmen">
425 compctl -g '*.class(:r)' java</pre>
426
427         (Mehr Beispiele <a href="compctl.html">zur älteren Vervollständigung hier</a>)</li>
428
429         <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:
433
434 <pre class="rahmen">
435 grep Wort *<em>~(</em>*.gz|*.bz|*.bz2|*.zip|*.Z<em>)</em></pre>
436
437         sucht 'Wort' nicht mehr in den komprimierten Dateien im Mail-Ordner.<br> <code>~</code>
438         bedeutet hier so viel wie "außer".<br>
439
440         Alle Dateien, die nicht die Endung *.bz2 und auch nicht *.gz enthalten , sucht man mit
441
442 <pre class="rahmen">
443 ls <em>^(</em>*.bz2|*.gz<em>)</em></pre>
444
445         Das <code>^</code> ist also das "NICHT", das Ausrufezeichen wird von der Zsh für alte
446         Befehle benutzt.<br>
447
448         An dieser Stelle bietet sich vielleicht ein globales Alias für komprimierte Dateien an
449         (siehe weiter unten).  <br>
450
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>
455
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:
458
459 <pre class="rahmen">
460 alias <em>-g</em> §k="*~(*.bz2|*.gz|*.tgz|*.zip|*.z)"</pre>
461
462         und danach der Befehl
463
464 <pre class="rahmen">
465 ls -d §nk </pre>
466
467         listet alle nicht-komprimierte Dateien auf.<br>
468
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>
472
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>
476         
477 <pre class="rahmen">
478 alias -s <font color="ed">NAME</font>=<font color="green">WERT</font></pre>
479
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.
482
483 <pre class="rahmen">
484 alias <em>-s</em> <font color="red">txt</font>=<font color="green">'less -rE'</font></pre>
485
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.
492
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>
496
497 <pre class="rahmen">
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>
500
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>
503         
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>
507
508         In der Datei genügt es, einfach eine oder mehrere Funktionen zu schreiben, z.B:
509
510 <pre class="rahmen">
511 begruessung() { echo "Hallo, $1" ; }
512 herzlich()    { echo "Ist ja riesig, $1, Dich zu sehen" ; }</pre>
513
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:
520
521 <pre class="rahmen">
522 echo "Ist das schön, $1, Dich zu sehen\!" &gt; ~/.zsh/funktionen/begruessung</pre>
523
524         ist nach Aufruf von <code>autoload begruessung</code> sofort nutzbar.  (Siehe
525         AUTOLOADING FUNCTIONS unter 'man zshmisc') </li>
526         
527         <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
530         Möglichkeit,
531         das kleinbuchstabige Gegenüber des großbuchstabigen
532         Variablennamens als eines Arrays zu verwenden und sogar für eigene
533         Variablen mit
534         <code>typeset -T</code> ein "Gegenüber" von einer Skalar-Variable zu einer
535         Feld-Variable durch die Kleinschreibweise der Variablen zu erzielen.
536         <br>
537         Dieser Variante kann man dann ein Feld aus Werten - durch Leerzeichen
538         oder Zeilenumbruch getrennt - zuweisen. Beispiel PATH:
539
540 <pre class="rahmen">
541 alt: PATH=/usr/bin\
542      :/usr/local/bin/\
543      :/usr/sbin\
544      :/usr/local/sbin\
545      :/usr/X11R6/bin
546
547 zsh: <em>path=(</em> /usr/bin /usr/local/bin /usr/sbin /usr/local/sbin /usr/X11R6/bin <em>)</em></pre>
548
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>
551
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>
554         
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>
559         
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>
563
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.
567         </li>
568         
569         <li>
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:
574
575 <pre class="rahmen">
576 klammer() { LBUFFER="\${$LBUFFER" ; RBUFFER="}$RBUFFER" }</pre>
577
578         erzeugt
579         eine Funktion klammer, die man mit <code>bindkey '^g' klammer</code> jetzt
580         an die Taste Control-G zuweisen kann.<br>
581         
582         Noch ein Beispiel für ein User-Widget:
583 <pre class="rahmen">
584 wohin() {
585   dirs -v
586   print -n "Wohin? "
587   read WOHIN
588   cd +${WOHIN:=0}
589 }</pre>
590
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>
594         
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
601         editieren.<br>
602         
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>
607         
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> |&amp; </code>.<br> Mit '<em><code> print -p</code></em>' und mit
612         '<em><code>&gt;&amp;p </code></em>' als Umlenkung kann ich Daten an den Prozeß senden und mit
613         '<em>read -p</em> und '<em><code>&lt;&amp;p</code></em>' als Umlenkung Daten von diesem Prozeß
614         auslesen. Beispiel:
615
616 <pre class="rahmen">
617 <em>coproc</em> ed /tmp/notizen
618 <em>print -p</em> "a"
619 ls -l <em>&gt;&amp;p</em>
620 <em>print -p</em> ".\nwq"</pre>
621
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
624         ed.  <br>
625         
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>
631         
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
635         formatieren.
636
637 <pre class="rahmen">
638 <em>typeset -L2</em> name=werteintrag ;print "[$name]"</pre>
639
640         gibt linksformatiert "[we]" aus, die ersten 2 Buchstaben, umrahmt von [].
641
642 <pre class="rahmen">
643 <em>typeset -lL20</em> name=WERT;print "[$name]"</pre>
644
645         gibt in Kleinbuchstaben (-l für lower)
646         "[wert&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;]" aus, wobei 20 - 11
647         Leerzeichen eingefügt werden.
648
649 <pre class="rahmen">
650 <em>typeset -r</em> RPROMPT=%n</pre>
651
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>
656
657         Zusätzlich zu <code>typeset</code> kann man auch durch sogenannte Modifier die Ausgabe
658         von <code>print</code> verändern.  Beispiel:
659
660 <pre class="rahmen">
661 name="Wert"
662 print "[${(Ll:20:)name}]"</pre>
663
664         ergibt genau die selbe Ausgabe wie
665 <pre class="rahmen">
666 typeset -lL20 name</pre>
667
668         Seit Zsh 4.1.1 kann man mit
669
670 <pre class="rahmen">
671 printf "%20s\n" ${(L)a}</pre>
672
673         ähnlich wie in der gleichnamigen C-Funktion auch dieses Ergebnis bekommen, ohne den
674         externen printf-Befehl nutzen zu müssen.</li>
675         
676         <li>Die Ausgabe von Dateinamen kann mittels sogenannter Qualifier spezifiziert werden
677         (siehe <code> man zshexpn </code> unter Glob Qualifier). Beispiele:
678
679 <pre class="rahmen">
680 print -l *<em>(m-1)</em> # listet nur Dateien zeilenweise auf, die vor
681                 # bis zu einem Tag modifiziert wurden
682
683 print -l *<em>(a1)</em>  # listet Dateien zeilenweise auf, auf die vor einem
684                 # Tag zugegriffen wurde
685  
686 print -l *<em>(@)</em>   # listet nur die Links zeilenweise auf
687
688 ls -doF *<em>(/)</em>    # findet nur die Verzeichnisse
689
690 chmod 640 *<em>(W)</em>  # verändert die Rechte aller Dateien, in die
691                 # jeder schreiben darf, denn das ist ja meistens
692                 # besonders riskant!
693  
694
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.
698 </pre>
699
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
703         :).<br>
704
705 <pre class="rahmen">
706 gg() { grep -wE "$1" *<em>(.)</em> | less -r }</pre>
707
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.
711         </li>
712         
713         <li>Ein sehr schneller Befehl, um DOS-Dateien (keine Verzeichnise) zu Dateien mit
714         kleinen Buchstaben zu machen ist:
715
716 <pre class="rahmen">
717 for i in [A-Z][A-Z]*<em>(.)</em>; do mv $i ${i<em>:l</em>} ;done</pre>
718
719         Der Qualifier <em>:l</em> (für lowercase) leistet hier ganze Arbeit.
720
721 <pre class="rahmen">
722 print -l *<em>(LM+3)</em></pre>
723
724         gibt zeilenweise Dateien aus, die über 3 Megabyte groß sind.</li>
725         
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:
728
729 <pre class="rahmen">
730  mutt -f <em>=(</em>zcat mailfold*.gz<em>)</em></pre>
731
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
734         Beispiel: 
735
736 <pre class="rahmen">
737 mutt -f =(grepmail "Mustafa Mustermann" ~/mbox)</pre>
738
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>
743         
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
747         anderes Beispiel:
748      
749 <pre class="rahmen">
750 lynxbzgrep() {
751   lynx -force_html -dump <em>=(</em>bzip2 -cd $1 | grep $2<em>)</em>
752 }</pre>
753
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>
757
758         Wird keine temporäre Datei benötigt, dann kann man wie auch bei der Bash
759         '<em><code>&lt;()</code></em>' verwenden. Damit erspart man sich dann die manuelle
760         Verwendung von <code>/proc/self/fd</code> oder die manuelle Erzeugung einer "named
761         pipe":
762         
763 <pre class="rahmen">
764 lynx -force_html &lt;( gzip -cd komprimiert.html.gz )</pre>
765
766         ist ein Beispiel, bei dem lynx die Ausgabe von '<code>gzip -cd
767         komprimiert.html.gz</code>' verarbeitet.  <br>
768
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.
772
773 <pre class="rahmen">
774 diff &lt;(zcat erste_datei.gz) &lt;(zcat zweite_datei.gz)</pre>
775
776         vergleicht den Inhalt von zwei komprimierten Dateien miteinander.</li>
777         
778         <li>Nach Setzung von READNULLCMD=less lässt sich eine Datei mit:
779
780 <pre class="rahmen">
781 &lt; datei</pre>
782
783         unter less angucken. Einfach ein <code>&lt;</code> vor die Datei setzen.</li>
784         
785         <li>Es ist ohne Probleme möglich, die Standardausggabe an mehrere Dateien umzulenken:
786
787 <pre class="rahmen">
788 ls &gt;datei1 &gt;datei2 &gt;datei3</pre>
789
790         oder:
791
792 <pre class="rahmen">
793 ls &gt;&gt; datei1 &gt;&gt; datei2</pre>
794
795         </li>
796         
797         <li> Man kann auch die Standardeingabe von mehreren Dateien empfangen:
798
799 <pre class="rahmen">
800 less &lt; datei1 &lt; datei2</pre>
801         </li>
802         
803         <li> Es ist möglich, eine Umlenkung in eine Datei und gleichzeitig an eine Pipe zu
804         bewerkstelligen:
805
806 <pre class="rahmen">
807 make &gt;logfile | grep Error</pre>
808         </li>
809         
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.
814
815 <pre class="rahmen">
816 jed <em>=</em>genial.c</pre>
817
818         editiert eine C-Funktion, wenn sie im Pfad gefunden werden kann.</li>
819         
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:
822
823 <pre class="rahmen">
824 print -l <em>**</em>/*.html</pre>
825
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>
829         
830 <pre class="rahmen">
831 print -l **/datei.html # sucht die bestimmte Datei in allen
832                        # vom aktuellen Verzeichnis abgehenden
833                        # Verzeichnissen und gibt genau sie aus.
834
835 print -l **/*.html~datei.html # gibt alle HTML-Seiten
836                               # mit Ausnahme von datei.html zeilenweise aus.
837
838 grep name **/*.txt  # sucht in allen Texten unterhalb des
839                     # gegenwärtigen Verzeichnisses nach Dateien
840                     # mit Endung .txt.
841 </pre>
842
843         </li>
844         
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>
849         
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>
853         
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>
859
860 <pre class="rahmen">
861 zza () {
862   NAMED_DIRECTORY=$PWD:t; # der Name des jetzigen Verzeichnisses wird
863                           # an NAMED_DIRECTORY ohne die Hierarchie übergeben.
864                           # :t steht für tail.
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.
869 }
870 </pre>
871
872
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.:
875
876 <pre class="rahmen">
877 mv datei.1 ~lm1</pre>
878
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>
881
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
885         im Prompt steht:
886
887 <pre class="rahmen">
888 /usr/local/info%</pre>
889
890         Möchte man aber den kurzen Prompt haben, dann muss man so zuweisen:
891
892 <pre class="rahmen">
893 <em>info=</em>/usr/local/info</pre>
894
895         -also ohne Slash am Ende.</li>
896         
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>
900         
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:
905
906 <pre class="rahmen">
907 autoload -U colors &amp;&amp; colors
908 echo "$fg_bold[red]zsh $fg_no_bold[white]is $bg[blue]$fg_bold[green]nice"</pre>
909
910         </li>
911 <!--
912         Bei der Zsh müssen hierzu allerdings die Escape-Befehle von <code><em>%{</em>
913         <em>%}</em> </code>eingerahmt werden.  Also zum Beispiel:
914
915 <pre class="rahmen">
916 <em>%{</em>^[[31m<em>%}</em>%~ <em>%{</em>[0m<em>%}</em></pre>
917
918         Ich habe mir, um die Übersicht nicht zu verlieren, Variablen
919         definiert, die die Farben für den Prompt enthalten.
920
921 <pre class="rahmen">
922 RED_PROMPT='<em>%{</em>^[[31m<em>%}</em>'
923 OFF_PROMPT='<em>%{</em>[0m<em>%}</em>'
924 </pre>
925
926         Jetzt kann ich auf diese Variablen mit $ zugreifen.</li>
927 -->
928
929         <li>Mit <em>RPROMPT</em> lässt sich ein PROMPT auf der rechten Seite
930         definieren:<br>
931         
932         <code>RPROMPT=%l</code> zeigt beispielsweise an, auf welchem Rechner
933         man sich befindet.<br>
934         
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>
938         
939         zeigt das Datum nach deutscher Darstellung an.</li>
940         
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:
944
945 <pre class="rahmen">
946 setopt <em>autocorrect</em></pre>
947
948         Die Korrektur kann durch Setzung eines
949
950 <pre class="rahmen">
951 alias &lt;befehl&gt;=<em>nocorrect</em> &lt;befehl&gt;</pre>
952         
953         verhindert werden.</li>
954         
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
957         Tcsh.<br>
958
959 <pre class="rahmen">
960 <em>watch=(</em>notme<em>)</em></pre>
961
962         listet z.B. alle Benutzer auf, die nicht ich sind :)<br>
963
964         Hierbei kann das Format der Ausgabe geändert werde:<br>
965
966 <pre class="rahmen">
967 <em>WATCHFMT</em>='%n eingeloggt auf Terminal %l von %M seit %T '</pre>
968
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:
972
973 <pre class="rahmen">
974 watch=( < ~/.freunde root)</pre>
975
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>
978         
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>
982
983 <pre class="rahmen">
984 <em>repeat</em> 100 mail -s "spams suck" badcompany@devilsheart.com &lt; flame</pre>
985
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>
988         
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
993         «TAB» ansehen.</li>
994         
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.:
998
999 <pre class="rahmen">
1000 echo ein_langes_wort zweites_langes_wort drei !#1-2</pre>
1001
1002         schreibt auf den Bildschirm: 'ein_langes_wort zweites_langes_wort drei ein_langes_wort
1003         zweites_langes_wort'.</li>
1004         
1005         <li>Um die Funktion funct alle 300 Sekunden auszuführen führt man einfach folgenden
1006         Befehl aus:
1007
1008 <pre class="rahmen">
1009 periodic funct()  PERIOD=300 fortune -s</pre>
1010
1011         Anmerkung: Allerdings muss dazu auch am Prompt ein Befehl eingegeben werden, sonst kann
1012         man natürlich nichts auf dem Bildschirm sehen.</li>
1013         
1014         <li>Die Zsh kennt den '..' Operator von Pascal (und Perl):
1015
1016 <pre class="rahmen">
1017 echo {1..7} "\nWo ist denn die Bash geblieben?"</pre>
1018
1019         ergibt:
1020
1021 <pre class="rahmen">
1022 1 2 3 4 5 6 7
1023 Wo ist denn die Bash geblieben?</pre>
1024
1025         </li>
1026         
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:
1031         
1032 <pre class="rahmen">
1033 alias run-help=man # ein -&gt;
1034 alias run-help=info</pre>
1035
1036         macht.
1037
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>
1042
1043         </li>
1044         
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.
1050
1051 <pre class="rahmen">
1052 sched +0:10 figlet "Du musst jetzt los"</pre>
1053
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>
1057         
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>
1061
1062         </ol>
1063
1064         <h2><a name="lokaledateien"></a>Lokale Dateien</h2>
1065
1066         Folgende Dateien wurde von Matthias erstellt bzw. gesammelt:
1067
1068         <ul>
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>
1074         </ul>
1075
1076         Die <a href="tools_zsh.html">Zsh-Generell</a>-Webpage von Michael ist auch via <a
1077         href="#oben">obiger Navigation</a> erreichbar.
1078
1079         <h2><a name="literatur"></a>Literatur</h2>
1080         
1081         <h3>Zsh-Homepage/Download</h3>
1082
1083         <ul>
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
1089           for zsh</a></li>
1090           <li><a
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
1092           @ debian</a></li>
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>
1098         </ul>
1099  
1100         <h3>Englische Artikel</h3>
1101         
1102         <ul>
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&amp;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
1113           Schneider</li>
1114         </ul>
1115         
1116         <h3>Hilfreiches</h3>
1117
1118         <ul>
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>
1133         </ul>
1134
1135         <h3>Live-CDs mit Zsh</h3>
1136         
1137         <ul>
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> 
1143         </ul>
1144
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>
1148         </p>
1149
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>&nbsp;&nbsp;
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>
1156
1157         <p>Die Autoren dieser Webpage (<a
1158         href="mailto:&#109&#97&#116&#116&#104&#105&#64&#105&#110&#102&#111&#100&#114&#111&#109&#46&#110&#111&#114&#116&#104&#46&#100&#101">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>
1162         
1163         </div>
1164         
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>
1168         </div>
1169         <div id="Footer">
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
1175           </div>
1176           <div class="valid">
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>&nbsp; 
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>
1181           </div>
1182         </div>
1183 </body>
1184 </html>
1185