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 **/*.json

ls *(.) — 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 ^*.log

Parameter-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]"  # red

echo "$arr[1]" — Greift auf das erste Element zu (1-basiert, anders als bash).

echo "$colors[2]"  # green

echo "$arr[-1]" — Greift über einen negativen Index auf das letzte Element zu.

echo "$colors[-1]"  # blue

echo "$arr[2,4]" — Array-Ausschnitt von Index 2 bis 4 (inklusive).

nums=(10 20 30 40 50); echo "$nums[2,4]"  # 20 30 40

typeset -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 https

echo "${(kv)map}" — Liefert alle Schlüssel-Wert-Paare eines assoziativen Arrays.

echo "${(kv)ports}"  # http 80 https 443

History & 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.

!docker

fc — Öffnet den letzten Befehl im $EDITOR zum Bearbeiten und erneuten Ausführen.

fc

history 1 — Zeigt die vollständige Befehls-History (zsh nummeriert ab 1).

history 1 | grep ssh

setopt SHARE_HISTORY — Teilt die History zwischen allen laufenden zsh-Sitzungen.

setopt SHARE_HISTORY

Tab-Vervollständigung

Tab — Vervollständigt Befehl, Pfad oder Argument. Zeigt bei Mehrdeutigkeit ein Menü.

git che<Tab>  # completes to git checkout

Tab 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 && compinit

zstyle ':completion:*' menu select — Aktiviert die interaktive Menüauswahl für Vervollständigungen.

zstyle ':completion:*' menu select

zstyle ':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 /tmp

setopt 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_ALL

setopt NO_CASE_GLOB — Macht Globbing Groß-/Kleinschreibung-unabhängig.

setopt NO_CASE_GLOB; ls *.TXT  # matches .txt too

setopt EXTENDED_GLOB — Aktiviert erweiterte Globbing-Operatoren (^, ~, #).

setopt EXTENDED_GLOB; ls ^*.log

setopt 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_DUPS

setopt 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_HISTORY

unsetopt <option> — Deaktiviert eine Shell-Option.

unsetopt CORRECT

Prompt 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 -l

Verzeichnis-Stack

pushd <dir> — Wechselt das Verzeichnis und legt es auf dem Stack ab.

pushd /var/log

popd — Holt ein Verzeichnis vom Stack und wechselt dorthin.

popd

dirs -v — Zeigt den Verzeichnis-Stack mit Index-Nummern.

dirs -v

cd -<n> — Wechselt zum Verzeichnis an Stack-Position n (zsh-Feature).

cd -2

setopt AUTO_PUSHD — Legt bei jedem cd automatisch Verzeichnisse auf dem Stack ab.

setopt AUTO_PUSHD; cd /tmp; cd /var; dirs -v

setopt PUSHD_IGNORE_DUPS — Legt keine doppelten Verzeichnisse auf dem Stack ab.

setopt PUSHD_IGNORE_DUPS

Aliase & 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 pattern

alias -s ext=command — Suffix-Alias. Verknüpft eine Dateiendung mit einem Befehl.

alias -s json=code; ./data.json  # opens in VS Code

which <command> — Zeigt, wo ein Befehl definiert ist (Alias, Funktion oder Binary).

which ls

functions <name> — Zeigt die Definition einer Funktion.

functions greet

Oh 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 update

omz plugin list — Listet alle verfügbaren Oh-My-Zsh-Plugins auf.

omz plugin list

omz theme list — Listet alle verfügbaren Oh-My-Zsh-Themes auf.

omz theme list

Konfigurationsdateien

~/.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 tasks

source ~/.zshrc — Lädt die zsh-Konfiguration neu, ohne die Shell neu zu starten.

source ~/.zshrc

Hä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 **/*.js

echo ${(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"; done

take <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.

  • 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

Verwandte Kommandos

  • bash – die GNU-Bourne-Again-Shell, Standard auf den meisten Linux-Distributionen
  • fish – nutzerfreundliche Shell mit Autosuggestions ab Werk
  • env – Umgebungsvariablen anzeigen und Programme in angepasster Umgebung starten