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?
Antworten:
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:
quelle
local
nicht POSIX oder Unix ist, spezifiziert ist , und in dem Linux erforderlichen Standard (LSB) und der Debian - Richtlinien Standard . Beachten Sie, dass dieses
ein Follow-up istrc
.mksh
als 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.)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.?
quelle
COMMAND.COM
unter 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 zuCMD.EXE
. Eine davon ist PowerShell, die von Microsoft unterstützt wird. Ein weiteres Beispiel ist seltsamerweisebash
die 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.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.
quelle
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.
quelle
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
csh
undtcsh
sind 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.
quelle