Bash und andere Kommandozeilen-Interpreter Welche Linux Shell darf es sein?

Von Mirco Lang Mirco Lang |

Anbieter zum Thema

Die erste Assoziation bezüglich einer Linux-Shell dürfte bei den meisten Anwendern wohl Bash sein. Die Bourne-again Shell ist der Quasi-Standard – und nur die wenigsten Nutzer dürften sich überhaupt dafür interessieren, wo sie da ihre Kommandos eintippen. Dabei gibt es durchaus interessante Alternativen.

Neben der GNU Bourne-Again Shell gibt es einige durchaus beachtenswerte Alternativen.
Neben der GNU Bourne-Again Shell gibt es einige durchaus beachtenswerte Alternativen.
(Bild: Lang)

Wenn irgendwo über Linux-Befehle oder Shell-Scripting gesprochen wird, wird in der Regel die Bash-Shell vorausgesetzt – alles andere müsste schon explizit erwähnt werden. Aber Standards sind ja nun häufig auch Kompromisse und nicht immer die besten Lösungen.

Also stellen sich ein paar naheliegende Fragen: Gibt es Alternativen? Und wenn ja, welche – und was können sie? Vor allem aber: Lohnt sich der Umstieg? Im Folgenden beleuchten wir kurz die populärsten Alternativen und ihre Besonderheiten. Kleiner Spoiler: Ja, es lohnt sich, die bash-Konkurrenz zu kennen.

GNU Bourne-again Shell – Bash

GNU Bash ist Teil des GNU-Projekts und schon damit wird klar, dass es in einem GNU/Linux-System als Standard genutzt wird. Die Shell wurde 1989 veröffentlicht und bezieht sich schon im Namen auf die Bourne Shell (sh), die bereits Ende der Siebziger entwickelt worden war und die Standard-Shell im damaligen Unix darstellte.

Bash ist nahezu vollständig kompatibel zu sh-Skripten und hat einige Features der Korn Shell (ksh) und der C Shell (csh) implementiert. Sie fungiert als Skriptinterpreter und interaktive Shell gleichermaßen. Anfang 2019 ist nach langer Wartezeit die Version 5.0 veröffentlich worden, mit allerlei Bugfixes und einigen neuen Features, die vor allem versierte Shell-Skripter ansprechen.

Der wohl größte Vorteil der Bash liegt schlicht und ergreifend in der Verbreitung. Die Bash ist in fast allen wichtigen Linux-Derivaten die Standard-Shell und selbst macOS setzt (noch) auf das GNU-Werkzeug. Das sorgt einerseits für Shell-Skripte, die weitestgehend überall laufen und andererseits für die mit Abstand beste Dokumentation.

Wie es ein ksh-Veteran ausdrückte: „Wenn du etwas Exotisches in Bash tun willst, poste die Frage auf Stackoverflow und du wirst Dutzende Antworten binnen Minuten bekommen.“ Für Korn-Shell-Antworten müsse man jedoch darauf warten, dass irgendein seinen Zenit überschritten habender Hacker aus seinem Nickerchen erwacht.

KornShell – ksh

Das bringt uns direkt zur KornShell, die ebenfalls auf der Bourne Shell basiert und mit dem Ur-Baujahr 1983 noch älter ist als die Bash. Sie stammt wie so viele Tools aus den Bell Labs, wo sie von David Korn entwickelt wurde, und ist abwärtskompatibel zur Bourne Shell.

Zusätzlich verfügt sie über einige Features, die auch die in den 70ern entwickelte C Shell bot. Dennoch ist die KornShell immer ein Nischenprodukt gewesen, was vor allem daran liegen könnte, dass die Software proprietär lizenziert wurde. Erst im Jahr 2000 wurde der Quellcode freigegeben und unter der Eclipse Public License bereitgestellt.

Der KornShell werden häufig einige Vorteile gegenüber der Bash zugeschrieben, die heute so nicht mehr stimmen, beispielsweise Assoziative Arrays und einfaches Wiederholen von Befehlen (history) – Dinge, die Bash sehr wohl kann. Ähnliches gilt für andere Ksh-Features – meist gibt es auch einen Weg mit Bash. Wenn es allerdings um die Syntax von Schleifen geht, gilt ksh immer noch vielen Nutzern als überlegen.

Ein wirklicher Unterschied lässt sich zum Beispiel bei Variablen feststellen: Eine Variable in einer Schleife ist in der Bash nur in der Schleife ansprechbar, da diese als Subshell ausgeführt wird. In ksh ist sie dagegen auch außerhalb der Schleife verfügbar. Doch auch hier scheiden sich die Geister, ob das nun gut ist oder nicht.

Gute Gründe für den Umstieg von Bash auf KornShell bezweifeln selbst viele ksh-Urgesteine, da die Shell nicht mit der Verbreitung, der Entwicklung und der Dokumentation mithalten kann. Immerhin: ksh93 (die aktuellste Version) kann Gleitkommazahlen verrechnen, Bash muss dafür externe Tools nutzen.

C Shell – csh / tcsh

Die C Shell (csh), heute gebräuchlich in der verbesserten Variante tcsh, stammt ebenfalls aus einer der Standard-Softwareschmieden der Computer-Anfangszeiten: der University of California in Berkeley. Mit dem Geburtsjahr 1978 ist sie sogar noch ein wenig älter.

Die aktuelle Version stammt aus 2016, letzte Änderungen gab es aber auch noch im Januar 2019. In BSD-basierten Distributionen ist tcsh die Standard-Shell, allerdings nicht (mehr) bei macOS, das (mittlerweile und noch) auf die Bash setzt. Tcsh wird nach wie vor betreut, das aktuelle Bug-Release 6.21.00 stammt aus dem Mai 2019.

Jetzt Newsletter abonnieren

Täglich die wichtigsten Infos zu Softwareentwicklung und DevOps

Mit Klick auf „Newsletter abonnieren“ erkläre ich mich mit der Verarbeitung und Nutzung meiner Daten gemäß Einwilligungserklärung (bitte aufklappen für Details) einverstanden und akzeptiere die Nutzungsbedingungen. Weitere Informationen finde ich in unserer Datenschutzerklärung.

Aufklappen für Details zu Ihrer Einwilligung

Bash und tcsh unterscheiden sich in etlichen Punkten eher subtil, wenn es etwa um die Deklaration von Variablen geht oder die Evaluation von interaktiven Eingaben. Letztlich gilt aber, was auch für alle anderen Shells im Vergleich mit Bash gilt: Bewerkstelligen lässt sich mit allen so ziemlich dasselbe – wenn auch mit einer mal mehr, mal weniger abweichenden Syntax.

Und genau hier liegt das Alleinstellungsmerkmal von tcsh: Die Syntax orientiert sich deutlich mehr an der C-Syntax, was für C-Entwickler durchaus ein Vorteil sein kann. Davon abgesehen gibt es keine allgemeinen Gründe, die Bash zu verlassen. Im Speziellen kann es natürlich immer mal sein, dass tcsh (oder sonst eine Alternative) eine bestimmte Aufgabe in einem bestimmten Szenario besser erledigt – aber das lässt sich eben nicht verallgemeinern.

Fish

Fish verwendet eine hübsche, aber gewöhnungsbedürftige Syntax.
Fish verwendet eine hübsche, aber gewöhnungsbedürftige Syntax.
(Bild: Lang)

Die Friendly Interactive Shell macht jetzt einen gewaltigen Satz – mit einem Geburtsjahr 2005 ist fish definitiv das Küken unter den Shells. Die aktuelle Version 3.0.2 stammt aus dem Februar 2019. Wie der Name schon andeutet möchte fish vor allem nutzerfreundlicher sein. Und da ist tatsächlich allerhand zu entdecken.

Highlights sind zum Beispiel Syntax Highlighting direkt auf dem Prompt und Auto-Vervollständigung von Befehlen, die automatisch aus den man pages generiert werden. Dabei werden Vorschläge schon während des Tippens angezeigt, die Vervollständigung läuft dann wie gewohnt über TAB. Zusammen mit den guten Hilfedateien lassen sich fish-Funktionen gerade für Einsteiger leichter erlernen und vor allem entdecken als mit der Konkurrenz.

Auch bei Dingen wie der Belegung von Variablen oder if-Abfragen setzt fish auf Syntax, die deutlich intuitiver ist. So würde der Variablen „a“ der Wert „5“ durch folgendes Kommando zugeteilt: „set a 5“ - ganz ohne Sonderzeichen. If-Abfragen beschränken sich auf „if“, „else if“ und „else“ - keine „nicht-menschlichen“ Konstruktionen wie „fi“ oder „esac“.

Fish ist ein Projekt, das man im Grunde lieben muss, allein deswegen, weil der Leitspruch sympathisch ist: „Finally, a command line shell for the 90s“ – der perfekte Slogan für eine Shell aus dem Jahr 2005. Und dieser Sinn für Humor zieht sich auch durch Teile der Dokumentation und der Homepage. Natürlich kann letztlich auch fish nicht wirklich mit Bash konkurrieren – die Marktmacht von Bash begräbt leider jegliche Sympathiepunkte.

Allerdings: Die starke Anleitung des Nutzers in der Shell gemeinsam mit dem Syntax Highlighting bringt tatsächlich eine völlig andere – bessere – User Experience. Wer den Umgang mit der Shell just erst lernt oder lehrt, sollte sich mit Fish beschäftigen. Gerade in Linux-/Shell-Einsteigerschulungen ist fish der allmächtigen Bash dann doch weit überlegen!

Z Shell – zsh

Zsh führt beim Initialstart durch eine umfangreiche Konfiguration.
Zsh führt beim Initialstart durch eine umfangreiche Konfiguration.
(Bild: Lang / zsh)

Auch die Z Shell ist mit ihren „erst“ 29 Jahren relativ jung und entstammt einem studentischen Projekt der Princeton University. Wie auch Bash ist zsh eine erweiterte Bourne Shell, die viele Features der alten Garde, sprich Bash, KornShell und C Shell/tcsh, beinhaltet. Selbstverständlich ist auch zsh Open-Source-Software, die aktuelle Version 5.7.1 stammt aus dem Februar 2019.

Zu den Highlights gehören Rechtschreibkorrektur, verbesserte TAB-Completion, Verzeichniswechsel ohne cd-Kommando, gemeinsame History für mehrere Sessions, deutlich besseres Globbing, Emulationsmodus für sh-, csh- und ksh-Umsteiger und und und. Noch drastischer wird es mit dem Projekt Oh My Zsh, das über 140 Themes und 200 Plug-ins in einem simplen Paket bereit hält. Wird zsh derart erweitert, ist sie der Bash definitiv weit überlegen – ohne sich dabei allzuweit von Syntax und Konzepten der Bash zu entfernen.

Mal zwei ganz konkrete Beispiele für die Überlegenheit: Um zwei Verzeichnisse hoch zu wechseln, genügt zsh ein simples „cd ...“ – bei Bash wäre es „cd ../..“. Noch drastischer ist die Multi-Verzeichnis-Vervollständigung: „cd /ho/mir/verz TAB“ würde zsh automatisch zu „cd /home/mirco/verzeichnis“ vervollständigen – in Bash müsste jede Verzeichnisebene separat mit TAB bestätigt werden.

Mit zsh kann man weitestgehend die omnipräsente Dokumentation für die Bash nutzen, bekommt aber massig weiterer Features – und insofern ist diese Alternative mindestens für jeden Dauernutzer von Shells ein echter Gewinn. Hat sich wohl auch Apple gedacht: Mit macOS Catalina wird zsh zur Standard-Shell, bis Mojave war es noch Bash.

Fazit

Zum Lernen und Lehren ist fish tatsächlich eine super Alternative zur Bash – aber auch wirklich nur dort (auch wenn man das Syntax Highlighting schon nach dem ersten Befehl vermissen wird). Im Alltag könnt man nach dem zsh-Absatz nun meinen, sie sei in Kombination mit Oh My Zsh im Grunde eine Art „Bash + mehr Features“ und die absolute Nummer 1.

Doch Marktführer sind nicht so einfach vom Thron zu stoßen: Mit Bash-it gibt es auch für Bash eine Sammlung mit Erweiterungen – von den Entwicklern als „shameles ripoff of Oh My Zsh“ bezeichnet. Letztlich liegen die Unterschiede dann doch eher im Detail oder in sehr speziellen Features. Technisch scheint die Variante zsh plus Oh My Zsh mehr zu bieten als Bash plus Bash-it – ob dies aber die Abkehr von der Standard-Shell rechtfertigt, sei einmal dahingestellt.

Am Ende bleibt: Ein näherer Blick auf zsh lohnt sich definitiv, andere Lösungen sind im Grunde nur für sehr spezielle Fälle interessant.

(ID:46113171)