zsh installieren und einrichten: von apt bis zur schlanken .zshrc

zsh installieren, als Standard-Shell setzen und einrichten: schlank ohne Framework oder mit Oh My Zsh, mit Plugins, Prompt, Startzeiten und Deinstallation.

von ·

Ich arbeite in meiner eigenen Umgebung mit zsh, und jedes Mal, wenn ich einen neuen Rechner oder Server einrichte, stehe ich vor denselben Fragen: Paket installieren, Standard-Shell umstellen — und dann Oh My Zsh oder lieber eine eigene, schlanke .zshrc? Den Anstoß zu diesem Artikel hat eine kompakte Anleitung bei Linux TLDR (öffnet in neuem Tab) (englisch) gegeben. Ich gehe denselben Weg, aber an ein paar Stellen anders: mit einer Variante ganz ohne Framework, mit gemessenen Startzeiten, mit dem aktuellen Stand von Powerlevel10k und mit einer Deinstallation, die deine History nicht gleich mitlöscht.

Wenn du nur die Befehle brauchst, spring direkt zu Schritt 1. Die wichtigsten Kommandos und Optionen zum täglichen Arbeiten stehen im Cheat-Sheet zu zsh; hier geht es um Installation, Einrichtung und Pflege.

Die Kurzfassung

Was Wie
Installieren sudo apt install zsh · sudo dnf install zsh · sudo pacman -S zsh · auf macOS schon da
Standard-Shell chsh -s "$(command -v zsh)", danach ab- und wieder anmelden
Erster Start Menü von zsh-newuser-install: 0 legt eine .zshrc an, die nur einen Kommentar enthält
Ohne Framework eigene .zshrc mit History, Completion und zwei Plugins aus dem Paketmanager
Mit Framework Oh My Zsh: Installer erst ansehen, dann ausführen; Updates mit omz update
Startzeit (gemessen) leer 9 ms · eigene .zshrc ~45 ms, mit zwei Plugins ~65–70 ms · Oh My Zsh 97 ms, mit zwei Plugins 139 ms
Prompt Powerlevel10k läuft, wird aber kaum noch gepflegt; Alternativen: Starship, Pure, eingebauter Prompt
Deinstallieren erst die Shell zurückstellen, dann das Paket entfernen

Was zsh ist — und welche Version du bekommst

Die Z-Shell hat Paul Falstad als Student in Princeton geschrieben, laut Wikipedia (öffnet in neuem Tab) erschien die erste Version 1990. Den Namen hat er vom Login eines Tutors übernommen, Zhong Shao, dessen Kürzel „zsh" lautete. Anders als oft zu lesen ist zsh keine erweiterte Bash: Die zsh-FAQ (öffnet in neuem Tab) (englisch) beschreibt sie als die Standard-Shell, die der Korn-Shell am meisten ähnelt — mit Anleihen bei csh und tcsh und vielen eigenen Erweiterungen obendrauf.

Bekannt geworden ist sie vor allem durch zwei Entscheidungen: Apple nutzt zsh seit macOS 10.15 Catalina (öffnet in neuem Tab) als Standard für neue Benutzerkonten, und Kali Linux (öffnet in neuem Tab) (englisch) hat 2020 umgestellt. Auf den meisten Linux-Distributionen bleibt bash der Standard, zsh liegt aber überall im offiziellen Paketangebot.

Bei der Version lohnt ein genauer Blick. Nach 5.9 vom Mai 2022 gab es vier Jahre lang kein Release, dann kamen im Mai und Juli 2026 die Versionen 5.9.1 und 5.9.2 (öffnet in neuem Tab) (englisch), überwiegend Fehlerkorrekturen; 5.9.1 hat unter anderem die PCRE-Unterstützung auf PCRE2 umgestellt. Die stabilen Distributionen sind noch nicht so weit:

System zsh-Version im Standard-Repository
Debian 12 / 13 5.9
Ubuntu 24.04 / 26.04 LTS 5.9
Fedora 43 / 44 5.9
Arch Linux, Homebrew 5.9.2

Für den Alltag ist das egal — 5.9 ist ausgereift, und alles in diesem Artikel funktioniert damit. Ich installiere zsh deshalb immer aus der Distribution und nicht aus einer Fremdquelle.

Schritt 1: zsh installieren

Das Paket heißt überall zsh:

Terminal
# Debian, Ubuntu, Linux Mint
sudo apt install zsh

# Fedora, RHEL, AlmaLinux, Rocky Linux
sudo dnf install zsh

# Arch, Manjaro, EndeavourOS
sudo pacman -S zsh

# macOS: zsh is preinstalled; Homebrew has the newer 5.9.2
brew install zsh

Danach prüfst du, ob alles da ist und ob der Paketmanager zsh als erlaubte Login-Shell eingetragen hat:

zsh --version
grep zsh /etc/shells

Debian, Ubuntu und Fedora tragen /bin/zsh und /usr/bin/zsh bei der Installation selbst in /etc/shells ein. Bevor du irgendetwas umstellst, kannst du zsh einfach mit zsh starten und dich umsehen. Mit exit bist du wieder in deiner alten Shell.

Schritt 2: zsh als Standard-Shell setzen

Die Login-Shell steht unter Linux in /etc/passwd (auf macOS in den Verzeichnisdiensten), und chsh ändert sie:

chsh -s "$(command -v zsh)"

chsh fragt nach deinem Passwort und akzeptiert nur Pfade, die in /etc/shells stehen. Die Änderung greift erst bei der nächsten Anmeldung — meld dich also ab und wieder an. Ob es geklappt hat, zeigt dir:

getent passwd "$USER" | cut -d: -f7   # should print /usr/bin/zsh or /bin/zsh

Auf macOS gibt es getent nicht, dort prüfst du mit dscl . -read ~/ UserShell.

Drei Stolperstellen:

  • Homebrew-zsh auf macOS. Die neuere zsh unter $(brew --prefix)/bin/zsh (Apple Silicon: /opt/homebrew/bin/zsh, Intel: /usr/local/bin/zsh) steht nicht in /etc/shells. Trag sie dort ein (echo "$(brew --prefix)/bin/zsh" | sudo tee -a /etc/shells), bevor du chsh aufrufst. Für den Alltag reicht aber auch die zsh, die macOS mitbringt.
  • Fedora-Minimalinstallationen. In schlanken Images fehlt chsh. Es steckt in util-linux, also sudo dnf install util-linux.
  • Server. Stell auf einem entfernten Server nicht die Shell von root um, und lass beim ersten Test eine zweite SSH-Sitzung offen. Eine kaputte .zshrc sperrt dich nicht aus, kann das Anmelden aber unangenehm machen.

Schritt 3: Der erste Start

Startet zsh zum ersten Mal und findet keine der Dateien .zshenv, .zprofile, .zshrc oder .zlogin, erscheint der Einrichtungsassistent zsh-newuser-install. Die Optionen:

  • q beendet ohne Änderung. Der Assistent kommt beim nächsten Start wieder.
  • 0 legt eine .zshrc an, die nur einen Kommentar enthält. Das ist die richtige Wahl, wenn du gleich Oh My Zsh installierst oder deine eigene Datei schreibst.
  • 1 führt durch Menüs für History, Completion, Tastenbelegung und gängige Shell-Optionen.
  • 2 übernimmt die Konfiguration, die der Systemverwalter empfiehlt. Diese Option gibt es nur, wenn /etc/zsh/newuser.zshrc.recommended existiert — Debian und Ubuntu liefern die Datei mit. Für einen schnellen, brauchbaren Start ist das eine gute Wahl.

Gut zu wissen: zsh liest beim Start mehrere Dateien in fester Reihenfolge. Für dich als Nutzer zählen vor allem zwei. In ~/.zshenv gehört nur, was wirklich jede zsh braucht, auch nicht interaktive Skripte — etwa ein PATH-Zusatz. Alles für die interaktive Arbeit, also Prompt, History, Completion, Aliasse und Plugins, gehört in ~/.zshrc. Die vollständige Reihenfolge steht im Handbuch (öffnet in neuem Tab) (englisch).

Schritt 4: Die schlanke Variante ohne Framework

Bevor du zu Oh My Zsh greifst: zsh bringt das meiste selbst mit. Completion, Menüauswahl, eine gute History und sogar Git-Informationen im Prompt brauchen kein Framework. Das ist meine Grundausstattung als Startpunkt:

~/.zshrc
# History: keep a lot, share it between terminals, drop duplicates
HISTFILE=~/.zsh_history
HISTSIZE=10000
SAVEHIST=10000
setopt SHARE_HISTORY HIST_IGNORE_ALL_DUPS HIST_IGNORE_SPACE

# Convenience
setopt AUTO_CD            # type a directory name to cd into it
bindkey -e                # emacs-style line editing (Ctrl-A, Ctrl-E, ...)

# Completion with an interactive menu
zmodload zsh/complist
autoload -Uz compinit && compinit
zstyle ':completion:*' menu select

# Prompt: user@host, directory, git branch on the right
autoload -Uz vcs_info
precmd() { vcs_info }
zstyle ':vcs_info:git:*' formats '%b'
setopt PROMPT_SUBST
PROMPT='%n@%m %~ %# '
RPROMPT='${vcs_info_msg_0_}'

# Plugins from the package manager (Debian/Ubuntu paths) — highlighting last
source /usr/share/zsh-autosuggestions/zsh-autosuggestions.zsh
source /usr/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh

Die beiden Plugins holst du unter Debian und Ubuntu mit sudo apt install zsh-autosuggestions zsh-syntax-highlighting; Fedora und Arch haben gleichnamige Pakete, die Pfade können abweichen. Ein paar Details zu dieser Datei:

  • HISTFILE und SAVEHIST musst du setzen. Ohne HISTFILE speichert zsh die History laut Handbuch (öffnet in neuem Tab) (englisch) gar nicht, und SAVEHIST legt fest, wie viele Einträge in der Datei landen. macOS setzt beides schon in /etc/zshrc.
  • SHARE_HISTORY allein genügt. Viele Anleitungen setzen zusätzlich INC_APPEND_HISTORY. Das Handbuch zu den Optionen (öffnet in neuem Tab) (englisch) sagt aber, dass SHARE_HISTORY dieses Verhalten schon enthält und die Option dann ausgeschaltet sein sollte.
  • HIST_IGNORE_SPACE hält Befehle mit führendem Leerzeichen aus der History heraus. Praktisch, wenn du einmal ein Token auf der Kommandozeile tippen musst.
  • zsh-syntax-highlighting muss zuletzt geladen werden. Das schreiben die Autoren ausdrücklich in ihre Installationsanleitung (öffnet in neuem Tab) (englisch), und sie empfehlen sogar die manuelle Einbindung statt eines Frameworks.
  • Unter Ubuntu läuft compinit sonst doppelt. Dort ruft schon /etc/zsh/zshrc compinit auf. Schreib skip_global_compinit=1 in deine ~/.zshenv, dann übernimmt das allein deine .zshrc.

Mit source ~/.zshrc oder einem neuen Terminal ist alles aktiv. Diese Datei startet in meiner Messung in 65 bis 70 Millisekunden, ohne die beiden Plugins in gut 40 — mehr dazu weiter unten.

Schritt 5: Oh My Zsh installieren

Oh My Zsh (öffnet in neuem Tab) (englisch) ist das bekannteste Framework für zsh: mehrere Hundert Plugins, weit über hundert Themes, eine Update-Funktion und eine große Community. Wenn du viel ausprobieren willst, ist es ein bequemer Einstieg. Voraussetzung sind git und curl oder wget.

Die offizielle Installation ist ein Einzeiler, der ein Skript aus dem Netz direkt ausführt. Das Projekt selbst rät, fremde Installationsskripte vorher anzusehen — und genau so mache ich es:

curl -fsSL -o install-omz.sh https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh
less install-omz.sh        # read it first
sh install-omz.sh

Was dabei passiert: Das Skript klont das Repository nach ~/.oh-my-zsh, benennt eine vorhandene .zshrc nach Rückfrage in .zshrc.pre-oh-my-zsh um, legt eine neue an und stellt auf Wunsch die Standard-Shell um. Für automatische Einrichtungen gibt es Schalter: --unattended ändert weder die Shell noch startet es zsh danach, --keep-zshrc lässt deine bisherige .zshrc stehen.

Die neue .zshrc ist gut kommentiert. Die zwei wichtigsten Zeilen sind ZSH_THEME="robbyrussell" für das Aussehen und plugins=(git) für die geladenen Plugins.

Updates. Oh My Zsh fragt standardmäßig alle zwei Wochen, ob es sich aktualisieren soll. Manuell geht es mit omz update. Das Verhalten steuerst du in der .zshrc, und zwar vor der Zeile source $ZSH/oh-my-zsh.sh:

zstyle ':omz:update' mode reminder   # prompt (default) | auto | reminder | disabled
zstyle ':omz:update' frequency 14    # days between checks
zstyle ':omz:update' cooldown 10     # only apply changes that are at least 10 days old

Die Option cooldown ist neu und gefällt mir besonders: Oh My Zsh übernimmt dann nur Änderungen, die schon ein paar Tage alt sind. Das ist dieselbe Idee wie die Quarantäne für frische Pakete, die pnpm 11 und Bun mit minimumReleaseAge kennen; mehr dazu in Anthropic und Bun. Ein Framework, das sich selbst aus einem Git-Repository aktualisiert, ist schließlich auch eine Lieferkette.

Schritt 6: Plugins mit Oh My Zsh

Die mitgelieferten Plugins liegen in ~/.oh-my-zsh/plugins, eigene oder fremde gehören nach ~/.oh-my-zsh/custom/plugins (Variable $ZSH_CUSTOM). Die beiden Plugins aus Schritt 4 installierst du dort so:

git clone --depth=1 https://github.com/zsh-users/zsh-autosuggestions \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-autosuggestions"
git clone --depth=1 https://github.com/zsh-users/zsh-syntax-highlighting \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting"

Wichtig ist der zweite Teil, der in Anleitungen gern nur in einem Screenshot steht: Klonen allein lädt nichts. Du musst die Plugins in der .zshrc eintragen, zsh-syntax-highlighting wieder als letztes:

plugins=(git zsh-autosuggestions zsh-syntax-highlighting)

Danach lädt omz reload die Konfiguration neu. Tipp ein paar Buchstaben eines früheren Befehls, und autosuggestions schlägt den Rest grau vor; mit der Pfeiltaste nach rechts übernimmst du ihn.

Schritt 7: Ein Prompt, der zu dir passt

Viele Anleitungen empfehlen an dieser Stelle Powerlevel10k (öffnet in neuem Tab) (englisch). Das Theme ist schnell und hübsch, aber du solltest wissen, worauf du dich einlässt: Seit Mai 2024 steht ganz oben im README, dass das Projekt nur noch sehr eingeschränkt unterstützt wird, keine neuen Funktionen bekommt, die meisten Fehler nicht mehr behoben werden und Hilfeanfragen ignoriert werden. Das letzte Release ist vom Januar 2024. Es funktioniert weiterhin — aber ich würde heute nichts Neues mehr darauf aufbauen.

Wenn du es trotzdem nutzt, dann auf dem Weg, den das README für Oh My Zsh vorsieht:

git clone --depth=1 https://github.com/romkatv/powerlevel10k.git \
  "${ZSH_CUSTOM:-$HOME/.oh-my-zsh/custom}/themes/powerlevel10k"
# then in ~/.zshrc:  ZSH_THEME="powerlevel10k/powerlevel10k"

Der Assistent startet beim nächsten Öffnen von zsh selbst, später jederzeit mit p10k configure. Für die Symbole empfiehlt das README die Nerd-Font MesloLGS NF, die du in deinem Terminal einstellst.

Die Alternativen:

  • Starship (öffnet in neuem Tab) ist ein Prompt in Rust, der in zsh, bash, fish und PowerShell gleich aussieht und aktiv gepflegt wird. Eingebunden wird er mit einer Zeile am Ende der .zshrc: eval "$(starship init zsh)". Auch hier gilt: Das Installationsskript erst ansehen, oder Starship über den Paketmanager installieren, wo es angeboten wird.
  • Pure (öffnet in neuem Tab) (englisch) ist minimalistisch und schnell, gut für alle, die einen ruhigen Prompt mit Git-Status wollen.
  • Der eingebaute Prompt aus Schritt 4 mit vcs_info braucht gar nichts zusätzlich. Mit autoload -Uz promptinit && promptinit und prompt -l siehst du außerdem die Themes, die zsh selbst mitbringt.

Wie schnell startet deine zsh?

Ein Framework kostet Startzeit, und die merkst du bei jedem neuen Terminal-Tab. Ich habe das in einem frischen Debian-13-Container gemessen, jeweils als Mittelwert aus 20 Starts von zsh -i -c exit nach einem ersten Aufwärmlauf:

Konfiguration Startzeit
leere .zshrc 9 ms
die .zshrc aus Schritt 4 ohne die beiden Plugins 42–46 ms
die .zshrc aus Schritt 4 komplett, mit zwei Plugins 64–70 ms
Oh My Zsh mit Standard-Konfiguration (git-Plugin) 97 ms
Oh My Zsh mit autosuggestions und syntax-highlighting 139 ms

Die absoluten Zahlen hängen stark vom Rechner und seiner Last ab, die Verhältnisse kaum. Absolut ist das alles schnell. Auf älterer Hardware, über ein Netzlaufwerk oder mit vielen Plugins wird aus 100 Millisekunden aber schnell eine spürbare halbe Sekunde. Deine eigene Konfiguration misst du so:

Terminal
# Quick check: total for 10 starts — divide by 10 for the average
time (for i in {1..10}; do zsh -i -c exit; done)

# Which part of your .zshrc costs the time?
# Add at the very top of ~/.zshrc:   zmodload zsh/zprof
# Add at the very bottom:            zprof

zprof listet nach dem Start die Funktionen mit ihrem Zeitanteil auf. Die üblichen Verdächtigen sind Versionsmanager wie nvm, Completion-Skripte großer Werkzeuge und zu viele Plugins.

Was in zsh anders ist als in bash

Für die tägliche Arbeit fühlt sich zsh fast wie bash an. Ein paar Unterschiede überraschen aber jeden einmal — ich habe sie alle in derselben Testumgebung nachgestellt:

  • Arrays beginnen bei 1. a=(eins zwei drei); echo $a[1] gibt in zsh eins aus, in bash ${a[1]} dagegen zwei.
  • Keine automatische Wortaufteilung. v="a b"; for x in $v; do … durchläuft in zsh einen Wert, in bash zwei. Das ist sicherer, bricht aber manches bash-Snippet.
  • Rekursives Globbing ist eingebaut. **/*.md findet in zsh alle Markdown-Dateien in Unterordnern; bash braucht dafür erst shopt -s globstar.
  • Ein führendes = ist besonders. echo ===test bricht in zsh mit ==test not found ab, weil zsh =befehl durch den Pfad des Befehls ersetzt. Wenn du solche Trennlinien ausgibst, setz sie in Anführungszeichen.

Daraus folgt eine einfache Regel: Deine Skripte bleiben bash- oder sh-Skripte. Die Shebang-Zeile #!/bin/bash oder #!/bin/sh entscheidet, welche Shell ein Skript ausführt, nicht deine Login-Shell. zsh ist für die interaktive Arbeit da. Wenn du ein Shell-Snippet in zsh ausprobieren willst, das für sh geschrieben ist, startest du es mit emulate sh -c '…'.

Sauber deinstallieren

Wenn zsh nicht zu dir passt, ist die Reihenfolge entscheidend. Entfernst du das Paket, während zsh noch deine Login-Shell ist, landest du bei der nächsten Anmeldung im Nichts.

Terminal
# 1. Remove Oh My Zsh first, while you are still in zsh
uninstall_oh_my_zsh

# 2. Switch your login shell back, log out and in again, then check
chsh -s "$(command -v bash)"
getent passwd "$USER" | cut -d: -f7

# 3. Only now remove the package
sudo apt remove zsh          # or: sudo dnf remove zsh / sudo pacman -R zsh

uninstall_oh_my_zsh löscht ~/.oh-my-zsh, benennt die aktuelle .zshrc mit Datumsstempel um und stellt deine alte .zshrc.pre-oh-my-zsh wieder her. Hatte der Installer die Shell umgestellt, stellt es sie auch zurück. Bist du schon in bash, existiert die Funktion nicht mehr; dann rufst du sh ~/.oh-my-zsh/tools/uninstall.sh auf.

Danach räumst du gezielt auf, statt mit rm -rf .zsh* alles auf einmal zu löschen. Das würde auch ~/.zsh_history und die Sicherungskopien treffen, die du vielleicht noch brauchst:

ls -a ~ | grep -E 'zsh|p10k|oh-my'   # see what is there first
rm -f ~/.zcompdump* ~/.p10k.zsh      # caches and the Powerlevel10k config

FAQ

Brauche ich Oh My Zsh?

Nein. Alles, was die meisten Menschen an Oh My Zsh schätzen — Completion mit Menü, gute History, Git im Prompt, Vorschläge und Hervorhebung beim Tippen —, bekommst du mit der .zshrc aus Schritt 4 und zwei Paketen. Oh My Zsh lohnt sich, wenn du viele Plugins ausprobieren willst und dir die Pflege abnehmen lassen möchtest.

Ist curl … | sh gefährlich?

Ein Skript direkt aus dem Netz auszuführen heißt, dem Server und der Verbindung in diesem Moment komplett zu vertrauen. Bei bekannten Projekten über HTTPS ist das Risiko überschaubar, aber das Ansehen kostet eine Minute. Lade das Skript herunter, lies es, führ es dann aus.

Funktionieren meine bash-Aliasse in zsh?

Meistens ja. Einfache alias-Zeilen kannst du aus der .bashrc in die .zshrc kopieren. Funktionen, die mit Arrays oder Wortaufteilung arbeiten, solltest du testen, weil zsh sich dort anders verhält.

Wo trage ich meinen PATH ein?

In ~/.zshenv, wenn ihn auch nicht interaktive zsh-Aufrufe brauchen, sonst in ~/.zshrc. Auf macOS setzen die Systemdateien den PATH beim Login, eigene Ergänzungen gehören dort meist in ~/.zprofile.

Ist Powerlevel10k noch sicher nutzbar?

Es funktioniert, und es gibt keinen Grund, es sofort zu entfernen. Weil kaum noch Fehler behoben werden, würde ich bei einer neuen Einrichtung aber zu Starship, Pure oder dem eingebauten Prompt greifen.

Fazit

zsh ist in zwei Minuten installiert und als Standard-Shell gesetzt. Die eigentliche Entscheidung kommt danach: Framework oder nicht. Oh My Zsh ist bequem und kostet dich in meiner Messung rund 100 Millisekunden pro Start, mit zwei Plugins fast 140. Eine eigene .zshrc mit zsh-Bordmitteln und denselben zwei Plugins aus dem Paketmanager kommt mit der Hälfte aus und hängt an keiner Update-Kette außer der deiner Distribution. Für mich ist das der bessere Startpunkt, weil ich jede Zeile kenne, die beim Öffnen eines Terminals läuft. Wenn du gern ausprobierst, nimm Oh My Zsh, aber mit cooldown und einem Prompt, der noch gepflegt wird.

Weiterlesen

Die wichtigsten Kommandos, Glob-Qualifier und Optionen für den Alltag stehen im Cheat-Sheet zu zsh, zum Vergleich gibt es die Cheat-Sheets zu bash und fish. Wie ich die Lieferkette meiner Build-Werkzeuge absichere, steht in Node.js und npm absichern, und wie du Node.js selbst installierst und aktuell hältst, in Node2Shell und die Frage danach.

Quellen: zsh-Handbuch (öffnet in neuem Tab) · zsh-FAQ (öffnet in neuem Tab) · zsh-News (öffnet in neuem Tab) · Oh My Zsh (öffnet in neuem Tab) · Powerlevel10k (öffnet in neuem Tab) · zsh-syntax-highlighting (öffnet in neuem Tab) (alle englisch) · Z shell bei Wikipedia (öffnet in neuem Tab) · zsh im Wiki von ubuntuusers.de (öffnet in neuem Tab)