Die meisten in modernen UNIX-Umgebungen verwendeten Shells müssen der POSIX-sh-Spezifikation entsprechen. POSIX sh ist von der ursprünglichen Korn-Shell (ksh88) abgeleitet, die wiederum von der früheren Bourne-Shell abgeleitet ist. POSIX sh gibt jedoch nur eine kleine Teilmenge der Funktionen von ksh88 an. In einer Shell, die nur die Mindestanforderung implementiert, fehlen viele Funktionen, die zum sicheren und vernünftigen Schreiben aller bis auf die einfachsten Skripte erforderlichen Funktionen erforderlich sind. Beispielsweise sind lokale Variablen und Arrays nicht standardmäßige Extras.
Daher besteht der erste Grund darin, die Shell um zusätzliche Funktionen zu erweitern. Verschiedene Muscheln konzentrieren sich auf verschiedene Dinge. Beispielsweise konzentriert sich Zsh auf erweiterte interaktive Funktionen, während sich ksh93 (die aktuelle "ursprüngliche" Korn-Shell) auf leistungsstarke Programmierfunktionen und -leistung konzentriert. Selbst sehr minimale Shells wie Dash fügen mindestens einige nicht standardmäßige Extras wie lokale Variablen hinzu.
Zusätzliche Funktionen sind, wenn überhaupt, nur selten weitestgehend interoperabel. Die meisten der ksh88-Features sind recht gut interoperabel, beispielsweise die erweiterte Globbing-Syntax. Bei nicht standardmäßigen Features gibt es jedoch keine Garantie, und Sie müssen wirklich wissen, was Sie tun, um sie portabel zu verwenden.
Der zweite Grund ist das Erbe. Es gibt immer noch viele proprietäre Unixe, die für ihre / bin / sh alte nicht-standardmäßige Implementierungen verwenden. Bis vor kurzem verwendete Solaris Bourne immer noch als Standard und entschied sich dafür, die Heirloom-Shell beizubehalten, anstatt ein Upgrade auf etwas Modernes durchzuführen. Diese Systeme werden normalerweise mit verschiedenen Shells geliefert, zu denen Sie wechseln können, indem Sie beispielsweise Ihre PATH-Variable ändern oder die Shebangs in einzelnen Skripten ändern.
Also, um es zusammenzufassen. Es gibt mehrere Shells, häufig standardmäßig:
- Für zusätzliche Funktionen, insbesondere für den Umgang mit nicht tragbaren Extras.
- Bearbeitung von Legacy-Skripten, die häufig nicht verwaltet werden.
- Größe / Leistung. Eingebettete Systeme erfordern oft kleine Shells wie mksh oder busybox sh.
- Lizenzgründe. AT & T ksh war bis etwa 2000 proprietäre Software. Dies ist größtenteils der Grund für alle ksh-ähnlichen Klone wie Zsh und Bash.
- Andere historische Gründe. Obwohl es heutzutage nicht sehr populär ist, gab es radikale Versuche, die Sprache wie scsh und es neu zu gestalten. Die Prozessersetzungsfunktion vieler Shells stammt ursprünglich von rc (mit einer etwas anderen Syntax) und der Klammererweiterung von csh. Verschiedene Shells verfügen über unterschiedliche Kombinationen solcher Funktionen, in der Regel mit einigen subtilen oder weniger subtilen Unterschieden.