Warum gibt es in einem Unix-ähnlichen System mehrere Shells?

16

Ich habe gerade angefangen, die Grundlagen von Unix zu lernen und mich zu fragen, warum es in einem System wie Unix so viele Shells gibt. Aus dem Buch Advanced Programming in Unix Environment :

Eine Shell ist ein Befehlszeileninterpreter, der Benutzereingaben liest und Befehle ausführt. Die Benutzereingaben in eine Shell erfolgen normalerweise über das Terminal (eine interaktive Shell) oder manchmal über eine Datei (ein sogenanntes Shell-Skript).

Und dann führt das Buch eine Reihe von Shell-Programmen wie Bourne-Shell, Bourne-again-Shell, Cshell usw. Auf. Meine Frage ist im Grunde, warum wir mehrere Muscheln benötigen?

Aussenseiter
quelle
4
Es gilt der gleiche Grund, warum es für verschiedene andere Technologien so viele Standards gibt. xkcd.com/927
Dan Neely
1
Aus dem gleichen Grund können Sie Compiler / Interpreter für mehrere Programmiersprachen (auch mehrere Compiler für eine Sprache) oder mehrere Internetbrowser verwenden.
Mischa Arefiev
6
Ihre Frage ist vermessen. „ Warum brauchen wir mehrere Muscheln? “ Wer hat dir gesagt, dass wir mehrere Muscheln brauchen ? In deinem Buch heißt es, wir haben mehrere Muscheln. Das ist nicht dasselbe.
Rob

Antworten:

15

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.
ormaaj
quelle
2
Beachten Sie, dass , obwohl localnicht POSIX oder Unix ist, spezifiziert ist , und in dem Linux erforderlichen Standard (LSB) und der Debian - Richtlinien Standard . Beachten Sie, dass dies esein Follow-up ist rc.
Stéphane Chazelas
1
Was jetzt mkshals Public Domain Bourne Shell entstand, wurde auch aus lizenzrechtlichen Gründen geschrieben. (Diese Probleme bleiben weiterhin bestehen - Lizenzierung, Portabilität und Größe waren die drei Faktoren, die mir geholfen haben, Google davon zu überzeugen, mksh mit Android zu integrieren.)
mirabilos
19

Weil Menschen unterschiedliche Bedürfnisse haben und es gut ist, Alternativen zu haben, die Ihren Bedürfnissen in der gegebenen Situation entsprechen. Eine Shell ist nur ein Werkzeug für sich und sollte meiner Meinung nach durch jedes andere austauschbar sein. Das ist die Stärke von Unix / Linux im Gegensatz zu Microsoft Windows.

Ebenso ... Warum gibt es so viele Texteditoren? Warum entwickeln die Leute einen neuen Browser, wenn es bereits einen gibt? Warum gibt es GNOME, KDE, Xfce, LXDE, E17 usw.?

gertvdijk
quelle
12
Genau. Man könnte fragen "warum so viele Fenstermanager?" auch. Ein Unix-Native könnte die entgegengesetzte Frage stellen: Warum nur eine CMD.EXE? Warum ist Windows so starr und nicht anpassbar?
Bruce Ediger
1
@BruceEdiger Was meinst du, nur eine cmd.exe? Es gibt Alternativen dazu, wenn Sie sie verwenden möchten. Sogar Microsoft selbst hat PowerShell als Alternative.
Malcolm
3
Auch COMMAND.COMunter DOS war das austauschbar. Aufgrund der Annahme anderer Anwendungen (und anderer Benutzer) ist das System jedoch häufig sehr spröde. Infolgedessen gibt es nur wenige erfolgreiche Alternativen zu CMD.EXE. Eine davon ist PowerShell, die von Microsoft unterstützt wird. Ein weiteres Beispiel ist seltsamerweise bashdie anständige Unterstützung durch die Cygwin-Community, ganz zu schweigen von den MinGW-Leuten. Was Windows Manager angeht, so gab es bisher immer nur einen Windows-Manager. Im Laufe der Zeit gab es jedoch mehrere, als sich die Windows-Umgebung selbst weiterentwickelte.
RBerteig
+1 für diese Antwort. Ich denke, deshalb gibt es so viele verschiedene UNIX-Varianten: AIX, HP-UX, Solaris, Tru64, IRIX, UnixWare, OS X, Linux, NetBSD, OpenBSD, ... Sie nennen es!
Tonga
4

Kurze Antwort

Aufgrund einer merkwürdigen Lizenzhistorie hat keine einzige Entität Unix entwickelt. Es war ein Community-Prozess, an dem sowohl Freiwillige als auch Unternehmen teilgenommen haben. Diese Entitäten teilten nicht immer alle ihre Werkzeuge, so dass separate Shells auftraten. Als uns klar wurde, wie kontraproduktiv dies ist, war es zu spät, alle verwendeten Schalen zu vereinheitlichen. Stattdessen wurde daran gearbeitet, dass alle diese Schalen (theoretisch) miteinander kompatibel sind .

Die lange Antwort ist komplex und eng mit der Geschichte von Unix selbst verknüpft. Es gibt keine Möglichkeit, eine einzelne Antwort auf dieser Seite festzuhalten, aber sie wurde weithin (falsch) dokumentiert. Ausführlichere und präzisere Antworten finden Sie im Internet und in Büchern, die sich mit der Geschichte von Unix befassen.

rahmu
quelle
2

Unterschiedliche Shells existieren aus den gleichen Gründen wie unterschiedliche Webbrowser: Jeder hat eine Präferenz, und einige Shells haben historisches Gepäck oder Momentum. Jedes hat unterschiedliche Merkmale und Besonderheiten.

dotancohen
quelle
1

Meistens Geschichte ...

Bourne wurde als Teil von SysV Unix entwickelt, während BSD csh... verwendete. Später wurde bash als Open-Source-Alternative zur Bourne-Shell (und ihren verbesserten Versionen, wie ksh) entwickelt. Eine Bourne-ähnliche Shell wurde in den POSIX-Standard übernommen. ksh ist kompatibel und bash kann kompatibel sein.

Shells mögen cshund tcshsind viel einfacher interaktiv zu verwenden als die ursprüngliche Bourne-Shell (die nicht vollständig ausgeführt werden kann usw.), aber für Skripte schrecklich ...

In einigen Umgebungen, wie Unix-basierten eingebetteten Systemen, sind Skriptfunktionen, Größe und Geschwindigkeit wichtiger als interaktive Funktionen wie die Befehlsvervollständigung. In der Regel wird eine andere Variante der Shells verwendet.

Für portables Scripting sollten Sie eine POSIX-kompatible Bourne-Variante verwenden und Erweiterungen vermeiden.

Gert van den Berg
quelle
3
-1 für den Gedanken, dass die Welt bei SysV begann. Die Bourne-Shell wurde 1977, sechs Jahre vor der Veröffentlichung von SysV, unter UNIX v7 veröffentlicht.
Rob
@ Rob, s / 1977/ 1979 /
Stéphane Chazelas
Fair genug ... Die * nix-Geschichte ist ziemlich kompliziert ... Siehe en.wikipedia.org/wiki/File:Unix_history-simple.svg
Gert van den Berg