Zum Inhalt springen
Kontakt

Sebastian Nawrot
Dorneystr. 45
44149 Dortmund

Linux & Shell

Shell-Arten im Vergleich: Bash, Zsh, Fish & Co.

Bash, Zsh, Fish, sh und Dash im Vergleich: Unterschiede, Stärken und welche Shell für dich passt – mit Vergleichstabelle und Entscheidungshilfe.

Sebastian Nawrot
9 Min. Lesezeit
#Shell#Bash#Zsh#Fish#Linux#Terminal
Shell-Arten im Vergleich: Bash, Zsh, Fish & Co.

Wer anfängt, ernsthaft mit der Kommandozeile zu arbeiten, stolpert früh über eine Frage: Welche Shell soll ich eigentlich benutzen? Bash öffnet sich von selbst, Kollegen schwören auf Zsh, und irgendwo taucht Fish auf. Dazu gibt es noch sh, dash und weitere Varianten. Die Unterschiede zwischen den Shell-Arten sind nicht rein kosmetisch — sie betreffen Kompatibilität, Produktivität und den Einsatz in Skripten.

Dieser Artikel sortiert die wichtigsten Shells, erklärt ihre Stärken und gibt dir eine klare Entscheidungshilfe: für die tägliche Arbeit im Terminal und für Skripte, die zuverlässig laufen sollen.

Was ist eine Shell?

Eine Shell ist ein Kommandozeileninterpreter: Sie liest deine Eingaben, übersetzt sie in Systemaufrufe und gibt Ergebnisse zurück. Dazu kommt eine eigene Skriptsprache mit Variablen, Schleifen, Bedingungen und Funktionen.

Shells haben zwei Betriebsmodi. Im interaktiven Modus tippst du Befehle direkt; die Shell antwortet sofort. Im nicht-interaktiven Modus (Skript) liest sie eine Textdatei Zeile für Zeile, ohne auf Eingaben zu warten. Manche Shells sind für beide Szenarien optimiert, andere priorisieren klar eines davon. Das ist der entscheidende Unterschied, wenn du zwischen Bash, Zsh, Fish und Dash wählst.

Bash (Bourne Again Shell)

Bash ist auf nahezu jedem Linux-System die Standard-Login-Shell und damit der kleinste gemeinsame Nenner. Entwickelt von Brian Fox als freie Variante der ursprünglichen Bourne Shell (sh), ist sie seit Jahrzehnten der de-facto-Standard für Shell-Skripte auf Unix-artigen Systemen.

Auf macOS ist Bash zwar nach wie vor unter /bin/bash vorhanden (die seit Jahren eingeschlossene Version 3.2 ist jedoch lizenzbedingt alt), die Standard-Login-Shell wurde mit macOS Catalina jedoch durch Zsh ersetzt.

Für Skripte ist Bash die erste Wahl: Alle wichtigen Linux-Distributionen liefern sie mit, Dokumentation ist im Überfluss vorhanden, und Bash-Skripte laufen ohne Anpassungen praktisch überall. Die interaktive Erfahrung hingegen ist funktional, aber ungeschliffen: Die Autovervollständigung ist basic, der Prompt braucht manuelle Konfiguration, und Plugins gibt es erst durch externe Frameworks wie bash-it.

Konfigurationsdatei für interaktive, nicht-login Shells: ~/.bashrc. Für Login-Shells: ~/.bash_profile (oder ~/.profile).

# Bash-Version prüfen
bash --version

# aktuelle Shell anzeigen
echo $SHELL

Zsh (Z Shell)

Zsh verhält sich im Alltag wie Bash, bietet aber deutlich mehr Komfort. Die Autovervollständigung ist kontextsensitiv: git che<TAB> schlägt checkout vor und zeigt verfügbare Branches direkt im Terminal. Tippfehler in Verzeichnisnamen korrigiert Zsh optional automatisch. Globbing kann über eingebaute Qualifikationen feiner gesteuert werden als in Bash.

Zsh ist weitgehend Bash-kompatibel — die meisten Bash-Skripte laufen auch unter Zsh, aber nicht alle. Zsh folgt einem eigenen Standard und ist nicht vollständig POSIX-konform. Wer Portabilität braucht, schreibt seine Skripte für sh oder Bash, nicht für Zsh. Im interaktiven Betrieb spielt das kaum eine Rolle.

Seit macOS Catalina (2019) ist Zsh die Standard-Login-Shell auf dem Mac — das hat Fish und Zsh erheblich mehr Aufmerksamkeit eingebracht.

Der eigentliche Boost kommt durch das Plugin-Framework oh-my-zsh: Es liefert Hunderte von Themes, Git-Integrationen, sinnvolle Aliases und Vervollständigungen für gängige Tools. Die Installation ist eine Zeile; die Konfiguration passiert danach in ~/.zshrc.

Konfigurationsdatei: ~/.zshrc.

# oh-my-zsh installieren
sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)"

Beim Wechsel zwischen macOS und Linux stellt sich schnell die Frage Bash vs Zsh. Die kurze Antwort: Für Skripte bleibt Bash die sicherere Wahl; für den täglichen Einsatz im Terminal ist Zsh der Komfort-Aufstieg.

Fish (Friendly Interactive Shell)

Fish wurde von Grund auf für die interaktive Nutzung entwickelt und liefert ohne jede Konfiguration eine Erfahrung, die bei Bash und Zsh erst durch Plugins und Dotfile-Tuning entsteht. Während des Tippens schlägt Fish auf Basis deiner Befehlshistorie den vermutlich gewünschten Befehl als graue Continuation vor — übernehmen lässt sie sich mit der rechten Pfeiltaste oder Strg-F, ohne dass du etwas einrichten musst. Gleichzeitig hebt Fish die Eingabe live syntaktisch hervor: Ein unbekannter Befehl erscheint rot, bevor du überhaupt Enter drückst. Statt Aliases verwendet Fish Abkürzungen (abbr), die direkt in der Eingabe zum vollen Befehl expandieren — du siehst also immer, was tatsächlich ausgeführt wird. Und wer lieber klickt als Dotfiles editiert, ruft mit fish_config eine Weboberfläche auf, die Prompt, Farben und Funktionen im Browser konfiguriert.

Der Haken ist wichtig und wird oft übersehen: Fish ist nicht POSIX-kompatibel. Fish hat eine eigene Skriptsprache — Variablen funktionieren anders (set statt =), Arrays sind 1-indiziert, if-Bedingungen haben eine andere Syntax. Bash-Skripte laufen unter Fish nicht, und Fish-Skripte laufen nirgendwo sonst. Fish eignet sich ausgezeichnet als interaktive Shell; als Skriptsprache für portable Automatisierungen ist sie ungeeignet.

Konfigurationsdatei: ~/.config/fish/config.fish.

# Abkürzung anlegen: "gco" expandiert beim Tippen zu "git checkout"
abbr -a gco git checkout

# danach genügt im Terminal:  gco main
# Fish ersetzt es sofort sichtbar durch:  git checkout main

# Variablen funktionieren über set (NICHT mit = wie in Bash)
set MEINE_VAR "hallo"

# Funktion in Fish
function sagHallo
    echo "Hallo, $argv[1]"
end

Fish ist besonders attraktiv für Einsteiger, die sofort eine angenehme Terminal-Erfahrung haben wollen, ohne sich durch Konfigurationsdateien zu arbeiten. Wer regelmäßig Skripte schreibt oder auf Remote-Systemen arbeitet, wird aber früher oder später auf Bash oder POSIX sh zurückgreifen müssen.

sh & Dash

sh ist kein Programm mit einem festen Namen, sondern eine Spezifikation: der POSIX-Shell-Standard. Was sich hinter /bin/sh verbirgt, ist systemabhängig. Auf Debian und Ubuntu ist es Dash (Debian Almquist Shell), auf macOS bis Catalina war es Bash, auf anderen Systemen kann es etwas anderes sein.

Dash ist eine schlanke, schnelle POSIX-kompatible Shell, die fast ausschließlich für nicht-interaktive Skripte gebaut wurde. Sie startet deutlich schneller als Bash und verbraucht weniger Ressourcen — das ist der Grund, warum Debian und Ubuntu sie als /bin/sh einsetzen. Wenn du /etc/init.d/-Skripte oder System-Startup-Scripts schreibst, laufen sie unter Dash.

Der Preis: Kein interaktiver Komfort, keine Bash-spezifischen Features wie Arrays, [[ ]]-Bedingungen oder $'…'-Strings. Skripte mit #!/bin/sh müssen auf den POSIX-Kern beschränkt bleiben, um portabel zu sein.

Das Thema sh vs bash ist besonders für Sysadmins relevant: Wenn du ein Skript mit #!/bin/sh beginnst, darf es keine Bash-Erweiterungen verwenden. shellcheck hilft, unbeabsichtigte Bashisms in sh-Skripten zu finden.

# prüfen, was /bin/sh auf deinem System ist
ls -la /bin/sh

# Skript explizit für POSIX sh schreiben
#!/bin/sh

Jenseits dieser Klassiker existieren noch experimentellere Ansätze, die hier bewusst außen vor bleiben: Nushell behandelt Ausgaben als strukturierte Daten (Tabellen statt reinem Text), und PowerShell Core bringt das objektorientierte Pipeline-Modell aus der Windows-Welt plattformübergreifend auf Linux und macOS.

Vergleichstabelle

ShellPOSIX-kompatibelAutocompletionKonfig-DateiOut-of-the-boxStandard auf
BashWeitgehend (Erweiterungen vorhanden)Basis~/.bashrc / ~/.bash_profileMittelLinux (die meisten Distros)
ZshNein (eigener Standard)Sehr gut~/.zshrcMittel (Basis) / Sehr gut (mit oh-my-zsh)macOS (seit Catalina)
FishNein (eigene Sprache)Ausgezeichnet~/.config/fish/config.fishSehr gutKeine (opt-in)
DashJa (strikt)KeineGeringDebian/Ubuntu als /bin/sh

Welche Shell soll ich nehmen?

Die Antwort hängt davon ab, was du hauptsächlich machst.

Für Skripte und Automatisierung: Schreib in Bash oder POSIX sh. Bash-Skripte laufen auf jedem Standard-Linux-System ohne Vorbedingungen; POSIX sh gibt dir maximale Portabilität auch auf BSD-Systemen und minimal-Images. Fish-Skripte sind eine Sackgasse, wenn du auf fremden Servern arbeitest.

Für den täglichen interaktiven Einsatz: Zsh oder Fish sind die klareren Aufwertungen. Zsh ist der weniger radikale Wechsel — die Lernkurve ist flach, Bash-Gewohnheiten funktionieren fast alle weiter. Fish ist für Einsteiger oder alle, die eine moderne Terminal-Erfahrung ohne Konfigurationsaufwand wollen, aber bewusst auf POSIX-Kompatibilität verzichten.

Auf Remote-Servern: Bash. Sie ist dort fast immer vorhanden; Zsh und Fish sind es oft nicht.

Auf macOS: Zsh ist bereits die Standard-Shell — es lohnt sich, mit oh-my-zsh oder Starship als Prompt einfach dort anzufangen, wo das System bereits ist.

Shell wechseln

Die aktuelle Shell kannst du jederzeit prüfen:

echo $SHELL

Zum dauerhaften Wechsel nutzt du chsh (change shell). Voraussetzung: Die neue Shell muss in /etc/shells eingetragen sein. Welche Shells dort registriert sind, zeigt dir ein Blick in die Datei:

# installierte/erlaubte Shells auflisten
cat /etc/shells

In der Praxis erledigt das der Paketmanager für dich: Installierst du eine Shell (etwa mit sudo apt install fish), trägt sie sich automatisch in /etc/shells ein — der häufige chsh-Fehler "non-standard shell" tritt dann gar nicht erst auf.

# zu Zsh wechseln
chsh -s $(which zsh)

# zu Fish wechseln
chsh -s $(which fish)

# zurück zu Bash
chsh -s $(which bash)

Der Wechsel wirkt sich erst nach dem nächsten Login (oder einem neuen Terminal-Fenster) aus. Auf einigen Systemen musst du dich aus- und wieder einloggen. Mit exec zsh oder exec fish kannst du die neue Shell im aktuellen Fenster sofort testen, ohne die Standard-Shell dauerhaft zu ändern.

# Zsh testweise im aktuellen Terminal starten
exec zsh

# prüfen, ob die neue Shell aktiv ist
echo $SHELL

Falls du Zsh installieren musst:

# Debian/Ubuntu
sudo apt install zsh

# Fedora
sudo dnf install zsh

# macOS (Homebrew)
brew install zsh

Fazit

Bash, Zsh, Fish und Dash lösen unterschiedliche Probleme. Bash ist der unverzichtbare Grundstock für portable Skripte. Zsh und Fish liefern die bessere Arbeitsumgebung für den täglichen Einsatz im Terminal — Zsh mit mehr Kompatibilität, Fish mit weniger Konfigurationsaufwand. Dash ist der Spezialist für schnelle, schlanke POSIX-Skripte auf Debian-basierten Systemen.

Wer neu anfängt, macht es sich einfach: Fish installieren, eine Woche im Alltag testen und dann bewusst entscheiden, ob die Komfort-Features den Verzicht auf POSIX-Kompatibilität wert sind.

Wer tiefer einsteigen will: Beim Schreiben von Shell-Skripten lohnt es sich früh, Globbing und Wildcards sicher zu beherrschen — sie sind eines der Werkzeuge, die in jeder Shell etwas anders funktionieren. Der Shell-Scripting-Hub sammelt weiterführende Tutorials zu diesen Themen. Und wer viel Zeit im Terminal verbringt, sollte einen Blick auf den Vi/Vim Cheat Sheet werfen — der Editor ist auf nahezu jedem System verfügbar und lohnt sich als Werkzeug im Repertoire.

Ähnliche Artikel

Linux & Shell

Bash Globbing & Wildcards: Dateimuster in der Shell

7 Min. Lesezeit
Linux & Shell

Regex Tutorial: Reguläre Ausdrücke verstehen & anwenden

12 Min. Lesezeit
Webentwicklung & Technik

Apache HTTP Server 2026: Der Klassiker im modernen Einsatz

10 Min. Lesezeit

Möchtest du auch so einen Blog?

Ich entwickle moderne, SEO-optimierte Websites und Blogs mit Next.js, React und Tailwind CSS.