English version →

Zsh oder Bash? Für die tägliche Arbeit im Terminal ist die Zsh komfortabler: Sie hat die bessere Tab-Completion, korrigiert Tippfehler und globbt mächtiger. Für Shell-Skripte, die überall laufen sollen, bleibt die Bash die sichere Wahl. Hier siehst du die Unterschiede und wie du die Zsh mit 2 Befehlen zur Standardshell machst.

Zsh vs Bash auf einen Blick

BashZsh
StandardshellUbuntu, Debian und die meisten Linux-DistributionenmacOS (für neue Benutzerkonten seit macOS Catalina, 2019)
Tab-CompletionTextlisteinteraktives Menü, auch für Optionen und Verzeichnisse
Tippfehler-Korrekturnur Verzeichnisnamen in cd (shopt -s cdspell)Befehle, mit setopt CORRECT
GlobbingGrundfunktionenerweitert (z.B. rekursiv mit **/*.php)
Historypro Sitzung (Standard)mit setopt SHARE_HISTORY über alle Sitzungen geteilt
Konfigdatei~/.bashrc~/.zshrc
FrameworksOh My BashOh My Zsh
Skripteüberall vorhanden, bekannternicht überall vorhanden, bei Skripten unüblicher

Du musst nichts Neues lernen: Die meisten Bash-Befehle laufen in der Zsh unverändert.

Was ist die Zsh?

Die Zsh (Z shell) ist eine Unix-Shell für die interaktive Arbeit und für Skripte. Laut Handbuch (man zsh) ähnelt sie von den Standard-Shells der Korn-Shell am meisten, bringt aber viele Erweiterungen mit. Paul Falstad schrieb sie als Student in Princeton (zsh-FAQ, Abschnitt 1.2). Ihr Name geht auf Zhong Shao zurück, damals Teaching Assistant an der Princeton University (zsh-Mailingliste, 2005).

Vorteile der zsh vs bash

Die zsh bietet gegenüber der bash (der Standardshell unter Ubuntu) diese Unterschiede, die ich im Alltag am meisten schätze. Nicht alle Funktionen laufen nach der Installation von allein. Im Abschnitt Zsh installieren und einrichten steht, welche Zeile du für welche Funktion in die .zshrc schreibst.

1. zsh Multi-Verzeichnis Autocompletion

Zielverzeichnis: /home/user/Documents/test

In der bash navigierst du per ~/Doc<TAB>/te<TAB> dorthin.

In der zsh gibst du die Anfangsbuchstaben ein und drückst am Ende nur 1x <TAB>, also /ho/us/Doc/te<TAB> automatisch wird von der zsh alles autocompletet

2. zsh TAB-Completion Menü

zsh completion menu

Es gibt ein interaktives TAB-Completion Menü in der zsh. Falls du z.B. einen Befehl ohne Parameter angibst und <TAB> drückst, öffnet sich ein Menü (siehe Screenshot, dort habe ich “vim” eingegeben und <TAB> gedrückt), durch das du entweder wie gewohnt per <TAB> oder aber auch mit den Pfeiltasten scrollen kannst.

Dafür setzt du in der .zshrc die Zeile zstyle ':completion:*' menu select. Dann öffnet der zweite Druck auf <TAB> das Menü.

3. zsh Smart-Dir-Changing

Mit der zsh wechselst du in ein Verzeichnis, indem du nur seinen Namen tippst und Enter drückst. Ein vorangestelltes cd ist dann nicht nötig. Dafür setzt du in der .zshrc die Option setopt AUTO_CD. Die bash kann das auch: Dort schaltet shopt -s autocd die Funktion ein. Beide Optionen sind standardmäßig aus. In meinem Test (Zsh 5.9, Bash 5.2.21) wechselte /usr plus Enter in beiden Shells nach /usr.

4. zsh Typocorrection

zsh autocorrection example

Die zsh prüft Befehle auf Tippfehler und schlägt eine Korrektur vor. Dafür setzt du in der .zshrc die Option setopt CORRECT. Bei einem Tippfehler fragt die zsh dann zum Beispiel correct 'ech' to 'echo' [nyae]?. Die bash korrigiert Befehle nicht: Unter Ubuntu listet sie bei einem unbekannten Befehl ähnliche Pakete auf, zum Beispiel echo aus coreutils, und führt nichts aus. Die Option shopt -s cdspell korrigiert nur Verzeichnisnamen in cd.

5. zsh Multi-Session-Shared-History

Du kannst die Shell-History während mehrerer Sessions in den verschiedenen Sessions nutzen. Dafür setzt du in der .zshrc die Option setopt SHARE_HISTORY.

6. Zsh Power-Globbing

Das Globbing in der zsh ist wesentlich besser als in der bash, doch das ist ein eigenes Thema. Wenn du nicht weißt, was Globbing ist, schlag dich und schau hier nach. Ein Beispiel: ls **/*.php listet alle PHP-Dateien in allen Unterordnern auf. Die Bash braucht dafür die Option globstar oder den Befehl find. In meinem Blog-Ordner (Zsh 5.9, Bash 5.2.21) findet **/*.md in der Zsh 48 Markdown-Dateien. Die Bash findet ohne globstar nur 1 Datei.

7. Shell-Skripte: die zsh ist anders, nicht besser

Die zsh verhält sich in Skripten anders als die bash. Laut Handbuch (man zsh) ist sie im Standardmodus nicht mit POSIX oder anderen Shells kompatibel. Dasselbe Skript liefert deshalb in beiden Shells unterschiedliche Ergebnisse (getestet mit Bash 5.2.21 und Zsh 5.9):

BeispielBashZsh
v="a b c"; for x in $v3 Durchläufe1 Durchlauf
Erstes Element von a=(x y z)${a[0]} gibt x$a[1] gibt x, $a[0] ist leer

Schreibe Skripte, die auf fremden Rechnern laufen sollen, deshalb für die bash.

Das waren nur einige wenige Features der zsh. Es gibt noch viele viele mehr, guck z.B. mal hier.

Startet die Zsh schneller als die Bash?

Nein. Eine Bash und eine Zsh ohne Konfiguration starten auf meinem ThinkPad X9-15 Gen 1 mit Intel Core Ultra 7 beide in 2 ms. Die Konfiguration bestimmt die Startzeit: In meiner ~/.bashrc kostet eine einzige Zeile für gvm (Go Version Manager) rund 350 ms.

Ich habe die Startzeit mit bash -i -c exit und zsh -i -c exit gemessen (Bash 5.2.21, Zsh 5.9, Ubuntu 24.04.5 LTS). Jede Zeile der Tabelle zeigt den Median aus 20 Läufen. Die Messung endet vor dem ersten Prompt, deshalb zählen verzögert geladene Plugins nicht mit. Powerlevel10k meldet in dieser Messung, dass gitstatus nicht startet. Die Zeit für gitstatus fehlt deshalb in den Werten. Meine Plugins lädt der Plugin-Manager sheldon, mehr dazu steht im Abschnitt Oh My Zsh. Meine ~/.zshrc habe ich in den Wochen vor der Messung insgesamt beschleunigt. Meine ~/.bashrc ist im Kern die Ubuntu-Standarddatei.

ShellKonfigurationStartzeit
Bashohne Konfigurationsdateien (--norc --noprofile)2 ms
Zshohne Konfigurationsdateien (-f)2 ms
Bashmeine ~/.bashrc ohne gvm11 ms
Bashmeine ~/.bashrc mit gvm364 ms
Bashnur source ~/.gvm/scripts/gvm319 ms
Zshsheldon source mit meinen Plugins21 ms
ZshOh My Zsh, nur das Plugin git (zum Vergleich)32 ms
Zshmeine vollständige, optimierte ~/.zshrc65 ms

In meiner ~/.zshrc lädt gvm erst beim ersten Aufruf, denn die Funktion gvm ersetzt sich dabei selbst: Sie löscht sich, lädt das echte gvm und führt den Befehl dann aus, während die Go-Umgebung schon beim Start bereitsteht.

if [[ -s "$HOME/.gvm/environments/default" ]]; then
  source "$HOME/.gvm/environments/default"
  gvm() { unfunction gvm; source "$HOME/.gvm/scripts/gvm"; gvm "$@" }
fi

Meine ~/.bashrc lädt gvm noch immer bei jedem Start.

Zsh installieren und einrichten

Die zsh befindet sich in den Repositories von Ubuntu, deshalb reicht ein einfaches

sudo apt install zsh

im Terminal. Mit dem Befehl zsh startest du sie zum Ausprobieren. Beim ersten Start fragt dich ein Assistent nach der Konfiguration. Drücke die Taste 2: Der Assistent schreibt dann die von Ubuntu empfohlene Konfiguration in deine ~/.zshrc. Sie speichert die History in ~/.zsh_history, teilt sie zwischen den Sessions (SHARE_HISTORY) und lädt die Completion. Mit der Taste 0 legt der Assistent stattdessen eine leere .zshrc an. Dann speichert die zsh deine History nicht, und SHARE_HISTORY, AUTO_CD und CORRECT sind aus.

Hast du schon 0 gedrückt, kopiere die empfohlene Datei von Hand. Der Befehl überschreibt deine ~/.zshrc:

cp /etc/zsh/newuser.zshrc.recommended ~/.zshrc

Die Funktionen 2 bis 4 von oben schaltest du mit 2 Zeilen am Ende der ~/.zshrc ein:

setopt AUTO_CD CORRECT
zstyle ':completion:*' menu select

Die bash durch zsh ersetzen

Mit chsh machst du die zsh zur Standardshell:

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

Melde dich danach ab und wieder an. Dann startet jedes neue Terminal mit der zsh. Zurück zur bash kommst du mit chsh -s /bin/bash.

Zsh Konfiguration

Wie die bash lässt sich die zsh über eine rc konfigurieren: sie heißt .zshrc und liegt in deinem Home-Ordner.

Per man zshoptions kannst du dir die setopt-Möglichkeiten in der .zshrc angucken…

Es gibt im Internet mehrere Sampe-zshrc‘s, einige Beispiel-zshrcs habe ich hier aufgelistet:

Oh My Zsh

Oh My Zsh ist ein Framework für die zsh-Konfiguration. Es bringt Themes und Plugins mit, z.B. für Git. Du brauchst es nicht: Die zsh funktioniert auch mit einer kleinen eigenen .zshrc. Für den Einstieg ist Oh My Zsh aber bequem.

Ich nutze Oh My Zsh nicht. Meine Plugins lädt der Plugin-Manager sheldon. Aus Oh My Zsh lade ich genau eine Datei, das Plugin terraform. Dazu kommen Powerlevel10k als Prompt, zsh-autosuggestions, zsh-autoswitch-virtualenv, docker-zsh-completion und zsh-defer. Sheldon lädt alle Plugins außer Powerlevel10k und zsh-defer mit zsh-defer, damit sie den Start nicht bremsen.

Was ist mit fish?

Die fish ist eine dritte Option. Sie bringt Vorschläge beim Tippen und Syntax-Farben ohne Konfiguration mit. Dafür ist ihre Skript-Syntax nicht mit der Bash kompatibel. Viele Anleitungen im Netz setzen die Bash-Syntax voraus. Seit Version 4.0 (Februar 2025) ist fish in Rust geschrieben.

Fazit: zsh vs bash

Meine Empfehlung: Nutze die zsh als interaktive Shell, wenn du viel im Terminal arbeitest. Schreibe Skripte, die auf fremden Servern laufen sollen, weiterhin für die bash. Wenn du nur selten ein Terminal öffnest, bleibt die bash die einfachere Wahl, weil sie überall schon installiert ist. Du musst die zsh nicht gleich zur Standard-Shell machen: Starte sie nach der Installation einfach per zsh und probiere sie aus.

Wenn dir etwas fehlt oder unklar ist, schreib mir unten einen Kommentar.

Hilfreiche zsh-Quellen: