zsh — die Z-Shell mit mächtigem Globbing und Completion
zsh produktiv nutzen: Globbing, Glob-Qualifier, Arrays, Completion, setopt und Oh My Zsh – die Z-Shell jenseits von bash.
zsh (Z-Shell) ist weitgehend kompatibel zu bash, legt aber kräftig nach: mächtige Tab-Completion, rekursives Globbing mit Glob-Qualifiern, 1-basierte Arrays und unzählige setopt-Schalter. Seit macOS Catalina ist zsh dort die Standard-Shell; auf Linux wechselst du mit chsh -s $(which zsh). Frameworks wie Oh My Zsh oder Prezto liefern Themes, Plugins und sinnvolle Defaults gleich mit. Dieser Guide zeigt dir die Features, die zsh über bash hinaus wirklich produktiv machen.
Globbing & Mustervergleich
ls **/*.txt — Rekursives Globbing. Findet Dateien in allen Unterverzeichnissen (standardmäßig aktiv).
ls **/*.jsonls *(.) — Glob-Qualifier: nur reguläre Dateien.
ls -la *(.)ls *(/) — Glob-Qualifier: nur Verzeichnisse.
ls -d *(/)ls *(@) — Glob-Qualifier: nur symbolische Links.
ls -la *(@)ls *(om[1,5]) — Glob-Qualifier: die 5 zuletzt geänderten Dateien. o=Sortierung, m=mtime.
ls -la *(om[1,5])ls *(Lk+100) — Glob-Qualifier: Dateien größer als 100 KB. L=Größe, k=KB, +=größer als.
ls -lh *(Lk+100)ls *(.mh-1) — Glob-Qualifier: in der letzten Stunde geänderte Dateien. m=mtime, h=Stunden.
ls -la *(.mh-1)ls (#i)pattern — Groß-/Kleinschreibung-unabhängiger Glob (benötigt EXTENDED_GLOB).
setopt EXTENDED_GLOB; ls (#i)readme*ls ^pattern — Negations-Glob. Findet alles außer pattern (benötigt EXTENDED_GLOB).
setopt EXTENDED_GLOB; ls ^*.logParameter-Expansion
${(U)VAR} — Wandelt einen String in Großbuchstaben um.
name='hello'; echo "${(U)name}" # HELLO${(L)VAR} — Wandelt einen String in Kleinbuchstaben um.
NAME='WORLD'; echo "${(L)NAME}" # world${(C)VAR} — Schreibt den ersten Buchstaben jedes Wortes groß.
str='hello world'; echo "${(C)str}" # Hello World${(s:sep:)VAR} — Zerlegt einen String anhand eines Trennzeichens in ein Array.
PATH_PARTS=(${(s/:/)PATH}); echo "${PATH_PARTS[1]}"${(j:sep:)ARRAY} — Verbindet Array-Elemente mit einem Trennzeichen.
arr=(a b c); echo "${(j:,:)arr}" # a,b,c${(t)VAR} — Zeigt den Typ einer Variablen (scalar, array, integer usw.).
arr=(1 2 3); echo "${(t)arr}" # array${(u)ARRAY} — Entfernt doppelte Elemente aus einem Array (unique).
arr=(a b a c b); echo "${(u)arr}" # a b c${(o)ARRAY} / ${(O)ARRAY} — Sortiert ein Array aufsteigend / absteigend.
arr=(cherry apple banana); echo "${(o)arr}"Arrays & assoziative Arrays
arr=(val1 val2 val3) — Deklariert ein indiziertes Array. zsh-Arrays sind 1-basiert (nicht 0-basiert wie bash).
colors=(red green blue); echo "$colors[1]" # redecho "$arr[1]" — Greift auf das erste Element zu (1-basiert, anders als bash).
echo "$colors[2]" # greenecho "$arr[-1]" — Greift über einen negativen Index auf das letzte Element zu.
echo "$colors[-1]" # blueecho "$arr[2,4]" — Array-Ausschnitt von Index 2 bis 4 (inklusive).
nums=(10 20 30 40 50); echo "$nums[2,4]" # 20 30 40typeset -A map — Deklariert ein assoziatives Array.
typeset -A ports; ports=(http 80 https 443)echo "${(k)map}" — Liefert alle Schlüssel eines assoziativen Arrays.
echo "${(k)ports}" # http httpsecho "${(kv)map}" — Liefert alle Schlüssel-Wert-Paare eines assoziativen Arrays.
echo "${(kv)ports}" # http 80 https 443History & Navigation
Ctrl+R — Inkrementelle Rückwärtssuche in der History.
Ctrl+R, then type to search!! — Wiederholt den letzten Befehl.
sudo !!!$ — Letztes Argument des vorherigen Befehls.
mkdir mydir; cd !$!* — Alle Argumente des vorherigen Befehls.
echo foo bar baz; echo !*!<string> — Führt den letzten Befehl aus, der mit string beginnt.
!dockerfc — Öffnet den letzten Befehl im $EDITOR zum Bearbeiten und erneuten Ausführen.
fchistory 1 — Zeigt die vollständige Befehls-History (zsh nummeriert ab 1).
history 1 | grep sshsetopt SHARE_HISTORY — Teilt die History zwischen allen laufenden zsh-Sitzungen.
setopt SHARE_HISTORYTab-Vervollständigung
Tab — Vervollständigt Befehl, Pfad oder Argument. Zeigt bei Mehrdeutigkeit ein Menü.
git che<Tab> # completes to git checkoutTab Tab — Blättert durch die Optionen im Vervollständigungsmenü.
cd /u<Tab><Tab> # cycles through /usr, /Users, etc.compinit — Initialisiert das Vervollständigungssystem. Üblicherweise in der .zshrc.
autoload -Uz compinit && compinitzstyle ':completion:*' menu select — Aktiviert die interaktive Menüauswahl für Vervollständigungen.
zstyle ':completion:*' menu selectzstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' — Aktiviert Groß-/Kleinschreibung-unabhängige Tab-Vervollständigung.
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}'Shell-Optionen (setopt)
setopt AUTO_CD — Verzeichnisnamen eingeben, um hineinzuwechseln (ohne cd).
setopt AUTO_CD; /tmp # same as cd /tmpsetopt CORRECT — Aktiviert die Rechtschreibkorrektur für Befehle.
setopt CORRECT; gti status # suggests: git?setopt CORRECT_ALL — Aktiviert die Rechtschreibkorrektur für Befehle und Argumente.
setopt CORRECT_ALLsetopt NO_CASE_GLOB — Macht Globbing Groß-/Kleinschreibung-unabhängig.
setopt NO_CASE_GLOB; ls *.TXT # matches .txt toosetopt EXTENDED_GLOB — Aktiviert erweiterte Globbing-Operatoren (^, ~, #).
setopt EXTENDED_GLOB; ls ^*.logsetopt GLOB_DOTS — Bezieht versteckte Dateien ohne expliziten Punkt in Glob-Treffer ein.
setopt GLOB_DOTS; ls *setopt HIST_IGNORE_DUPS — Speichert keine doppelten Befehle in der History.
setopt HIST_IGNORE_DUPSsetopt HIST_IGNORE_SPACE — Speichert keine Befehle, die mit einem Leerzeichen beginnen.
setopt HIST_IGNORE_SPACE; echo 'secret'setopt APPEND_HISTORY — Hängt an die History-Datei an, statt sie zu überschreiben.
setopt APPEND_HISTORYunsetopt <option> — Deaktiviert eine Shell-Option.
unsetopt CORRECTPrompt anpassen
PROMPT='%n@%m %~ %# ' — Setzt den linken Prompt. %n=Benutzer, %m=Host, %~=Verzeichnis, %#=Rechte.
PROMPT='%n@%m %~ %# 'RPROMPT='%T' — Setzt den rechten Prompt (zsh-exklusiv). %T=Uhrzeit.
RPROMPT='%T'%F{color}text%f — Färbt Text im Prompt. %F beginnt die Farbe, %f setzt sie zurück.
PROMPT='%F{green}%n%f@%F{blue}%m%f %~ %# '%B text %b — Fett gedruckter Text im Prompt.
PROMPT='%B%n%b@%m %~ %# 'autoload -Uz promptinit; promptinit — Lädt das System der eingebauten Prompt-Themes.
autoload -Uz promptinit; promptinit; prompt -lVerzeichnis-Stack
pushd <dir> — Wechselt das Verzeichnis und legt es auf dem Stack ab.
pushd /var/logpopd — Holt ein Verzeichnis vom Stack und wechselt dorthin.
popddirs -v — Zeigt den Verzeichnis-Stack mit Index-Nummern.
dirs -vcd -<n> — Wechselt zum Verzeichnis an Stack-Position n (zsh-Feature).
cd -2setopt AUTO_PUSHD — Legt bei jedem cd automatisch Verzeichnisse auf dem Stack ab.
setopt AUTO_PUSHD; cd /tmp; cd /var; dirs -vsetopt PUSHD_IGNORE_DUPS — Legt keine doppelten Verzeichnisse auf dem Stack ab.
setopt PUSHD_IGNORE_DUPSAliase & Funktionen
alias name='command' — Erstellt einen einfachen Alias.
alias ll='ls -la'alias -g NAME='text' — Erstellt einen globalen Alias. Wird überall in der Befehlszeile expandiert.
alias -g G='| grep'; ls G patternalias -s ext=command — Suffix-Alias. Verknüpft eine Dateiendung mit einem Befehl.
alias -s json=code; ./data.json # opens in VS Codewhich <command> — Zeigt, wo ein Befehl definiert ist (Alias, Funktion oder Binary).
which lsfunctions <name> — Zeigt die Definition einer Funktion.
functions greetOh My Zsh
plugins=(git docker npm) — Aktiviert Plugins in der .zshrc. Leerzeichen-getrennte Liste.
plugins=(git docker npm node composer)ZSH_THEME='robbyrussell' — Setzt das Prompt-Theme in der .zshrc.
ZSH_THEME='agnoster'omz update — Aktualisiert Oh My Zsh auf die neueste Version.
omz updateomz plugin list — Listet alle verfügbaren Oh-My-Zsh-Plugins auf.
omz plugin listomz theme list — Listet alle verfügbaren Oh-My-Zsh-Themes auf.
omz theme listKonfigurationsdateien
~/.zshenv — Wird immer geladen (Login, interaktiv, Skripte). Für PATH und Exporte.
export PATH="$HOME/bin:$PATH"~/.zprofile — Wird nur für Login-Shells geladen. Ähnlich der .bash_profile.
eval "$(brew shellenv)"~/.zshrc — Wird für interaktive Shells geladen. Die zentrale Konfigurationsdatei.
source ~/.zshrc # reload config~/.zlogin — Wird nach der .zshrc für Login-Shells geladen.
# login message~/.zlogout — Wird beim Beenden einer Login-Shell geladen.
# cleanup taskssource ~/.zshrc — Lädt die zsh-Konfiguration neu, ohne die Shell neu zu starten.
source ~/.zshrcHäufige Muster
zmv 'pattern' 'replacement' — Benennt Dateien stapelweise per Muster um (mit autoload zmv laden).
autoload zmv; zmv '(*).txt' '$1.md'ls -la **/*.log(.mw-1) — Findet rekursiv alle Log-Dateien, die in der letzten Woche geändert wurden.
ls -la **/*.log(.mw-1)print -l **/*.js — Listet Treffer eine Datei pro Zeile (übersichtlicher als ls).
print -l **/*.jsecho ${(F)array} — Gibt Array-Elemente eine pro Zeile aus (F = mit Zeilenumbruch verbinden).
arr=(one two three); echo "${(F)arr}"for f in **/*(.Lm+10); do echo "$f"; done — Findet rekursiv Dateien größer als 10 MB.
for f in **/*(.Lm+10); do echo "$f"; donetake <dir> — Erstellt ein Verzeichnis und wechselt hinein (Oh-My-Zsh-Funktion).
take new-project Fazit
zsh fühlt sich für bash-Umsteiger sofort vertraut an, belohnt dich aber mit deutlich mehr Komfort: rekursives Globbing samt Qualifiern, flexible Parameter-Expansion, ein durchdachtes Completion-System und Frameworks wie Oh My Zsh ersparen dir viel Tipparbeit. Achte auf die kleinen, aber wichtigen Unterschiede zu bash – allen voran die 1-basierte Array-Indizierung und das von setopt gesteuerte Verhalten beim Globbing und in der History. Lege deine Anpassungen in ~/.zshrc ab, halte Skripte mit #!/usr/bin/env zsh portabel und teste verändertes Glob- oder Korrektur-Verhalten lieber einmal mehr, bevor du es in produktive Skripte übernimmst.
Weiterführende Links
- ubuntuusers-Wiki: Zsh – deutschsprachige Einführung in Installation und Konfiguration
- Oh My Zsh – beliebtes Framework mit Themes, Plugins und sinnvollen Defaults
- zsh-Handbuch – offizielle Referenz zu Optionen, Expansions und Glob-Qualifiern