Plenz Guckes: Zsh
Julius Plenz Sven Guckes Zsh Die magische Shell
Alle in diesem Buch enthaltenen Programme, Darstellungen und Informationen wurden nach bestem Wissen erstellt. Dennoch sind Fehler nicht ganz auszuschließen. Aus diesem Grunde sind die in dem vorliegenden Buch enthaltenen Informationen mit keiner Verpflichtung oder Garantie irgendeiner Art verbunden. Autor(en), Herausgeber, Übersetzer und Verlag übernehmen infolgedessen keine Verantwortung und werden keine daraus folgende Haftung übernehmen, die auf irgendeine Art aus der Benutzung dieser Informationen oder Teilen davon entsteht, auch nicht für die Verletzung von Patentrechten, die daraus resultieren können. Ebenso wenig übernehmen Autor(en) und Verlag die Gewähr dafür, dass die beschriebenen Verfahren usw. frei von Schutzrechten Dritter sind. Die in diesem Werk wiedergegebenen Gebrauchsnamen, Handelsnamen, Warenbezeichnungen usw. werden ohne Gewährleistung der freien Verwendbarkeit benutzt und können auch ohne besondere Kennzeichnung eingetragene Marken oder Warenzeichen sein und als solche den gesetzlichen Bestimmungen unterliegen. Dieses Werk ist urheberrechtlich geschützt. Alle Rechte, auch die der Übersetzung, des Nachdrucks und der Vervielfältigung des Buches oder Teilen daraus vorbehalten. Kein Teil des Werkes darf ohne schriftliche Genehmigung des Verlags in irgendeiner Form (Druck, Fotokopie, Mikrofilm oder einem anderen Verfahren), auch nicht für Zwecke der Unterrichtsgestaltung, reproduziert oder unter Verwendung elektronischer Systeme verarbeitet, vervielfältigt oder verbreitet werden. Bibliografische Information Der Deutschen Nationalbibliothek Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar. Copyright 2008 Open Source Press, München Gesamtlektorat: Dr. Markus Wirtz Satz: Open Source Press (LATEX) Umschlaggestaltung: FritzDesign, Erlangen ISBN der Print-Ausgabe: 978-3-937514-59-8 ISBN (E-Book, PDF) 978-3-941841-32-1 http://www.opensourcepress.de
Inhaltsverzeichnis Vorwort 11 1 Einleitung 15 1.1 Installation, Versionen und UTF-8................. 15 1.2 Wichtige Fachbegriffe......................... 16 1.3 Spezielle Zeichen und Quoting.................... 17 1.4 Tab-Vervollständigung......................... 18 1.5 Der erste Start der Z-Shell...................... 18 1.5.1 Z-Shell als Standard-Shell.................. 19 1.6 Wie die Z-Shell konfiguriert wird.................. 20 1.6.1 Shell-Optionen......................... 20 1.6.2 Umgebungsvariablen..................... 21 1.6.3 Einstellungen permanent speichern............ 21 1.6.4 Die Konfiguration portabel halten............. 24 1.6.5 Aus Konfigurationsdateien lernen.............. 25 1.7 Das Prompt............................... 25 1.7.1 Prompt konfigurieren..................... 26 1.7.2 Prompt an der rechten Seite des Terminals........ 31 1.7.3 Vorkonfigurierte Prompts: promptinit........... 31 1.7.4 Weitere Prompts........................ 32 1.7.5 Optionen............................ 33 2 Kommandos schneller eingeben 35 2.1 Aliase................................... 35 2.1.1 Dateien anzeigen: ls...................... 37 2.1.2 Suffix-Aliase........................... 38 5
Inhaltsverzeichnis 2.1.3 Globale Aliase......................... 38 2.2 Funktionen............................... 40 2.2.1 Bereits definierte Funktionen anzeigen und ändern... 40 2.2.2 Auf Argumente zugreifen................... 40 2.2.3 Wie Argumente übergeben werden............. 41 2.2.4 Einzeilige Funktionen: Erweiterte Aliase........ 42 2.2.5 Mehrere Namen: Über welchen wurde die Funktion aufgerufen?........................... 42 2.2.6 Der Rückgabewert....................... 43 2.2.7 Hilfe innerhalb von Funktionen............... 43 2.2.8 Spezielle Funktionen..................... 44 2.2.9 Funktionen in Dateien auslagern und automatisch laden 45 2.2.10 Lokale Optionen........................ 46 2.2.11 Funktionen in Bytecode kompilieren............ 47 2.3 Expansion................................ 47 2.3.1 Brace Expansion........................ 48 2.3.2 Dateinamen-Expansion.................... 50 2.3.3 Kommandosubstitution.................... 52 2.3.4 Substitution arithmetischer Ausdrücke.......... 53 2.3.5 Prozess-Substitution...................... 53 3 Dateien, Ausgaben und Programmaufrufe 57 3.1 Globbing................................. 57 3.1.1 Einfaches Globbing...................... 58 3.1.2 Erweitertes Globbing..................... 63 3.1.3 Globbing-Einstellungen ändern: Flags........... 66 3.1.4 Auswahlkriterien: Qualifier.................. 68 3.1.5 Beispiele aus man zsh-lovers................ 76 3.1.6 Musterüberprüfung...................... 77 3.2 Ein- und Ausgabeumleitung..................... 78 3.2.1 Kommandos verknüpfen: Pipe................ 78 3.2.2 Ausgabe in eine Datei umleiten............... 79 3.2.3 Fehlermeldungen in eine Datei umleiten......... 81 3.2.4 Eingabe umleiten....................... 82 6
Inhaltsverzeichnis 3.2.5 Umleitung in mehrere Dateien: multios.......... 83 3.2.6 Ausgabe zur interaktiven Verwendung speichern.... 84 3.3 Unterprozesse: Kommandos parallel laufen lassen........ 85 3.3.1 Tabelle aller kontrollierten Prozesse............ 86 3.3.2 Kommandos nicht als Unterprozesse der Shell starten. 87 3.3.3 Prozesse am Ende einer Sitzung entkoppeln....... 88 3.3.4 Kommandos in einer Subshell ausführen......... 89 4 Die Z-Shell interaktiv verwenden 91 4.1 Tastenkürzel und der Z Line Editor................. 91 4.1.1 vi oder emacs.......................... 91 4.1.2 bindkey und Widgets: Tastenkürzel anzeigen und ändern 95 4.1.3 Parameter, Aliase und Funktionen editieren....... 96 4.2 Die History............................... 97 4.2.1 Konfiguration.......................... 97 4.2.2 Befehle mit fc aus der History holen............ 100 4.2.3 Interaktive Expansion..................... 103 4.3 Automatische Vervollständigung.................. 108 4.3.1 Voraussetzungen........................ 108 4.3.2 Wenn mehrere Treffer auftreten............... 109 4.3.3 Andere Vervollständigungen................. 110 4.3.4 Die Mechanismen....................... 112 4.3.5 Konfiguration durch zstyle.................. 113 4.3.6 Die Syntax von zstyle..................... 119 4.3.7 Die Wahl des Completers................... 123 4.3.8 Completion bei bestimmten Programmen anpassen.. 126 4.3.9 Shell-Optionen......................... 130 4.3.10 Tastenkombinationen..................... 131 5 Skripting: Kontrollstrukturen und Variablen 133 5.1 Kontrollstrukturen: Schleifen und if-abfragen.......... 134 5.1.1 Bedingungen aufstellen: if-abfragen............ 134 5.1.2 case-statement......................... 138 5.1.3 Schleifen: Befehle mehrmals wiederholen......... 139 7
Inhaltsverzeichnis 5.2 Parameter: Variablen und Arrays.................. 143 5.2.1 Gültigkeitsbereich von Variablen.............. 144 5.2.2 Arrays.............................. 144 5.2.3 Arrays auf Zeichenketten abbilden und umgekehrt... 148 5.2.4 Assoziative Arrays....................... 149 5.3 Parameter Expansion......................... 151 6 Widgets und Completions selbst erstellen 159 6.1 ZLE-Widgets erstellen......................... 159 6.1.1 Parameter innerhalb von Widgets.............. 160 6.1.2 Vordefinierte Widgets aufrufen............... 161 6.1.3 Leertaste neu belegen..................... 161 6.1.4 Vordefinierte Widgets modifizieren............. 162 6.2 Eigene Completions schreiben.................... 163 6.2.1 Treffer zu einer Liste hinzufügen: compadd........ 163 6.2.2 Hilfsfunktionen......................... 164 6.2.3 Completion-Funktionen in Dateien auslagern...... 174 6.2.4 Konnte etwas vervollständigt werden?........... 175 6.2.5 Variablen mit besonderer Bedeutung........... 176 6.2.6 Hilfsfunktionen, die Treffer zur Verfügung stellen.... 177 6.2.7 Typischer Aufbau einer Completion-Funktion...... 177 6.2.8 Selbst geschriebene Completions an die Entwickler senden................................ 180 Anhang 181 A Hilfe finden 183 A.1 Wie liest man die Manpage?..................... 184 A.1.1 Die verschiedenen Sektionen................ 184 A.1.2 Pager: less............................ 185 A.1.3 Manpages online........................ 187 A.2 Community............................... 187 A.2.1 Mailingliste........................... 188 A.2.2 IRC-Kanal............................ 188 A.2.3 Wiki............................... 189 8
Inhaltsverzeichnis A.2.4 Webseiten............................ 189 B compctl das alte Completion-System 191 B.1 Dateien nach Muster vervollständigen............... 194 B.2 Beliebige Vervollständigungen definieren............. 195 B.3 Erweiterter Modus........................... 196 Index 201 9
Das Glück der Erkennenden mehrt die Schönheit der Welt und macht alles, was da ist, sonniger. Friedrich Nietzsche
Vorwort Nichts ist falsch an der Shell, die ich gerade benutze, ich vermisse nichts; sie tut genau das, was ich will. Warum also die Z-Shell?! So oder ähnlich lautet meist die Reaktion, empfiehlt man den Einsatz der Z-Shell. Dabei gibt es viele Gründe, die für die Z-Shell sprechen. Sie kann bei Bedarf die Bourne Shell, C-Shell oder Korn-Shell nahezu originalgetreu emulieren, bietet darüber hinaus aber in fast allen Bereichen die beste Komposition aller Features der genannten Shells jeweils noch einmal wesentlich verbessert. Für Z-Shell-Liebhaber gilt darum die Formel: zsh= (bash+ksh+t csh) 2 Nicht nur ist die Z-Shell, genau wie die bereits erwähnten Shells, freie Software, sie wird auch aktiv weiterentwickelt, von Entwicklern, die schon sehr lange Unix-Systeme nutzen und außerdem den regen Kontakt zu Nutzern pflegen. Zudem ist sie gut dokumentiert und besitzt eine aktive (wenn auch kleine) Fangemeinde. Dieses Buch richtet sich daher an Leser, die bereits ein wenig Erfahrung mit Shells gesammelt haben (sei es nun die Z-Shell oder andere Shells, wie beispielsweise die Bash), die aber noch wesentlich weiter in die Welt der Shells eintauchen wollen. Es ist besonders interessant für diejenigen, die die Interaktivität von Shells schätzen sowie ein Interesse daran haben, täglich auftretende Aufgabe zu automatisieren. Grundlegenden Konzepte von Shells, Unix oder deren Derivaten werden nicht erklärt, da wir davon ausgehen, dass der Leser sich im Umfeld von Shells schon ein wenig zurecht findet. Ihre Kenntnisse sollten also über das bloße Abtippen von Befehlen aus Anleitungen hinaus gehen. Auch auf betriebssystemspezifische Ausnahmen wird nicht eingegangen, da die Z- Shell so portabel und architekturunspezifisch programmiert ist, dass sie auf so gut wie jedem modernen Unix-System läuft. Die Portabilität von Programmen ist deswegen so wichtig, weil es dadurch möglich wird, einmal erworbenes Wissen auf ein anderes System mitzunehmen und darauf anzuwenden. Damit ist die Z-Shell nicht ein Teil eines bestimmten Betriebssystems, sondern ein konzeptioneller Bestandteil der Arbeit auf vielen Systemen. 11
Vorwort Die Struktur des Buches Das 1. Kapitel dieses Buches erläutert, wie die Z-Shell konfiguriert wird und wie man die Darstellung in der Z-Shell anpasst (namentlich das Prompt). Im 2. Kapitel wird darauf eingegangen, wie man täglich auftretende Arbeitsschritte durch Aliase oder Funktionen abkürzen und sich viel Tipparbeit durch Expansionsausdrücke ersparen kann. Kapitel 3 beschäftigt sich damit, wie die Z-Shell Dateinamen nach einem Muster erzeugt (Globbing ), wie die Weiterleitung von Ausgaben funktioniert und wie man mehrere Programme aus einer Shell startet und trotzdem den Überblick behält. Im 4. Kapitel wird es richtig interessant, denn hier wird erläutert, wie man die interaktiven Stärken der Z-Shell voll ausreizt: Welche Tastenkürzel sind bereits vordefiniert? Wie kann man diese ändern? Wie greift man auf bereits eingegebene Zeilen zu (History)? Und vor allem: Wie nutzt und konfiguriert man die sehr mächtige automatische Vervollständigung (Completion) der Z-Shell? Das 5. Kapitel beschäftigt sich mit den Grundlagen des Skripting: Was sind Variablen und Arrays, wie greift man auf sie zu und wie ändert man sie? Auch wird dort auch auf Kontrollstrukturen wie und Ð, ÓÖ und Û Ð eingegangen, mit denen der Programmfluss innerhalb eines Skriptes gesteuert wird. Das 6. Kapitel führt schließlich in die Entwicklung eigener Completion- Funktionen und Tasten-Makros ein. Webseite: Tipps und Tricks, Errata und Feedback Unter http://zshbuch.org/ gibt es eine Webseite zu diesem Buch. Dort finden sich die von den Autoren genutzten Konfigurationsdateien, eine Liste mit den sicher hier und da notwendigen Korrekturen zu diesem Buch, weitere Links zu nützlichen Webseiten, sowie eine Sammlung von Tipps und Tricks, die auch von Ihnen erweitert werden kann. Bitte geben Sie uns dort auch Feedback! Was gefällt, was nicht und was müsste noch erwähnt werden? Wir freuen uns auf viele Rückmeldungen! Typografische Konventionen Da sich dieses Buch mit einem Programm beschäftigt, das lediglich textbasiert zu bedienen ist, tauchen häufig Zeichenketten auf, die vom Nutzer eingegeben oder von der Z-Shell ausgegeben werden. Diese werden in 12
Vorwort einer Ò ØÔÖÓÔÓÖØ ÓÒ Ð Ò Ë Ö Ø dargestellt; jede Eingabe, die über die Tastatur erfolgt auch Tastenkombinationen (abgesehen von den Cursortasten) wird explizit erwähnt und fett dargestellt. Sofern es sich um eine interaktive Eingabe handelt, wird dem Befehl immer ein Prompt (Eingabeaufforderung) vorangestellt, in diesem Buch: zsh: % Jedes so eingegebene Kommando wird mit Druck auf die Enter-Taste abgeschlossen, in Fällen, wo dies nicht auf den ersten Blick ersichtlich ist, wird dies mit' eigens angezeigt. Tastenkombinationen, deren Tasten gleichzeitig gedrückt werden müssen, werden mit einem + verbunden: [Strg]+[c], während Tasten, die direkt hintereinander zu betätigen sind, auch hintereinander geschrieben werden: [Strg]+[x][h]. Neu eingeführte Fachbegriffe werden meist kursiv, Kommandos, Optionen und Manpages immer Ò ØÔÖÓÔÓÖØ ÓÒ Ð gesetzt. Sofern ein Leerzeichen besonders wichtig ist, wird es durch sichtbar gemacht; in Codebeispielen, in denen wegen der zu großen Zeilenlänge ein Umbruch erfolgen muss, wird die Zeile mit einem Backslash ( ) abgeschlossen. Diese Codebeispiele können Sie genau so abtippen, da dies auch von der Z-Shell als Weiterführung der Zeile erkannt wird. Dank Wir danken Matthias Kopfermann, dem Z-Shell Liebhaber, Klaus Knopper für die Aufnahme der Z-Shell in sein Linux-Live-System Knoppix, Michael Prokop für das neue Zuhause der Z-Shell auf seinem Live-System grml sowie Felix von Leitner für seinen Z-Shell-Setup an der FU Berlin. Danke auch an Jens Kubieziel und Christian Schneider aus der Z-Shell Community, insbesondere Frank Terbeck und Michael Prokop, die uns beim Schreiben und in vielen technischen Dingen geholfen haben, sowie an unsere Lektoren Patricia Jung und Sacha Storz für ihre Mühen! Auch gebührt Dank denjenigen, die die Entwicklung und Verbreitung der Z-Shell maßgeblich vorangetrieben haben: Jerry Peek, Bart Schaefer, Peter W. Stephenson und Sven Wischnowsky sowie allen Maintainern der Dienste, Dokumentation und Domains rund um die Z-Shell. Unser ganz besonderer Dank gilt unseren Eltern, die uns stets gefördert und unterstützt haben. Julius Plenz und Sven Guckes September 2008 13