Die kurze Antwort auf die Frage, warum die ursprüngliche sh-Shell nicht vorhanden sh
ist, lautet, dass es keine ursprüngliche sh gibt.
Na gut, es ist die Thompson-Shell . Version 1 enthielt einige der Funktionen, die wir heute kennen, insbesondere Umleitung und Pipes (siehe Dennis Ritchies Artikel zur frühen Unix-Geschichte ). In späteren Versionen wurden Funktionen wie Hintergrundausführung mit &
, Globbing (implementiert mit einem externen Programm) und einige Anführungszeichen hinzugefügt , es gab jedoch keine Variablen oder verschachtelten Kontrollstrukturen. Bedingungen und Schleifen wurden über externe Programme bereitgestellt if
(die eine Bedingung und einen Befehl als Argumente verwendeten) und goto
(die durch Ändern der Dateiposition ihres übergeordneten Elements in der Skriptdatei funktionierten).
1979 wurde in Unix V7 die Thompson-Shell /bin/sh
durch die Bourne-Shell ersetzt . Die erste Version enthielt bereits viele der Funktionen , die heute in Dash verfügbar sind, und nachfolgende Versionen führten viele weitere ein . Einige Jahre später kam die Korn-Shell mit einem wachsenden Funktionsumfang auf den Markt. Viele Unix-Varianten haben es unter dem Namen installiert ksh
.
Im Jahr 1992 hat POSIX ein Minimum an sh
Funktionen kodifiziert , das im Grunde Bourne plus ein paar Dinge war. Jedes System, das sich "Unix" nannte, musste mindestens diese Funktionen implementieren. Kommerzielle Unix-Systeme verwendeten normalerweise ksh als POSIX sh, aber einige (z. B. OSF / 1 ) hatten ihre eigenen.
Weder die Bourne-Shell noch die Korn-Shell waren bis vor kurzem Open Source. Als sich also Mitte der neunziger Jahre die Linux-Welt herausbildete, waren sie nicht verfügbar. /bin/sh
musste etwas anderes sein. Die meisten Linux-Distributionen entschieden sich für bash , eine Shell aus dem GNU-Projekt , die in Bezug auf die Skriptfunktionen eher zwischen Bourne und Korn liegt und viel besser ist als beide für die interaktive Verwendung. Die einzige brauchbare Alternative war pdksh ( „public domain Korn - Shell“), eine freie (jetzt eingestellt, aber das Leben auf als mksh , die sich aktiv entwickelt ), aber ich erinnere mich nicht eine Linux - Distribution mit pdksh als/bin/sh
Ich weiß nicht warum, ich schätze, weil Linux-Distributionen immer GNU / Linux-Distributionen waren und im Grunde genommen GNU-Versionen aller Tools lieferten, für die es eine GNU-Version gab.
Es gab auch einige Open-Source-Implementierungen mit dem sh
Namen "ash", insbesondere die Almquist-Shell , aber sie waren sehr unvollständig, da einige POSIX-Funktionen fehlten, die die Leute nutzen wollten. Ein Programmierer, der Debian-Betreuer Herbert Xu war , erweiterte ash, um es POSIX-konform zu machen. Schließlich wurde seine Version in dash umbenannt, und es gab einige Versuche, sie /bin/sh
in Debian anstelle von bash zu machen. Ubuntu begann, bevor Debian damit begann, Bashismen (die Verwendung bashspezifischer Funktionen in #!/bin/sh
Skripten) systematisch als Fehler zu behandeln . Beide wechselten später ( Ubuntu 6.10 , Debian erst 2009) ( es war ein Ziel für Lenny Der Wechsel erfolgte jedoch erst nach dem Lenny-Release, also im Squeeze)).
Ein wesentlicher Grund für die Verwendung Strich als eher als bash wie /bin/sh
ist , dass es deutlich schneller ist. Dies war besonders wichtig für Ubuntu, das von Anfang an versucht hat, die Bootzeiten kurz zu halten. Dash benötigt in der Regel auch weniger Speicher als bash. Dies ist besonders wichtig für Wrapper-Skripte, die beim Beenden des zugrunde liegenden Programms nur ein bisschen aufräumen müssen. Ein weiterer Vorteil von dash ist, dass es sich nur auf libc (die Kernsystembibliothek) stützt, wohingegen bash sich auch auf Terminal-Unterstützungsbibliotheken stützt (ohne diese kann es nicht gestartet werden, selbst wenn ein Skript ausgeführt wird). Dies bedeutet, dass Dash eine bessere Chance hat, an einem kaputten System weiterzuarbeiten.
Irgendwann im 21. Jahrhundert wurde die Korn-Shell Open Source und Open Source-Versionen der Bourne-Shell erschienen (alte Versionen, da die Entwicklung Jahre zuvor eingestellt worden war). Aber Dash und Bash waren zu fest in der Linux-Welt verankert, als dass sie sich durchgesetzt hätten, insbesondere die Bourne-Shell, deren Wert heute nur noch historisch ist. Dash hat bash verdrängt, weil es klare Vorteile hatte, aber keiner der anderen Konkurrenten hat einen entscheidenden Vorteil als /bin/sh
.
system
(3), die von Anwendungen ausgeführt werden), ist dies der dominierende Faktor.Geschwindigkeit und POSIX-Konformität (mit anderen Worten Portabilität) sind die Hauptfaktoren. Denken Sie daran, dass
/bin/sh
dies für Systemskripte gedacht ist, die möglicherweise aus älteren Versionen von Ubuntu und / oder anderen Systemen stammen.Sicher, glänzende Funktionen von
bash
sind cool für uns Benutzer, aber wenn es darum geht, Dinge in einer Umgebung auszuführen, in der Sie mehrere verschiedene Server / Systeme verwalten müssen - POSIX-kompatible Shell macht einen großen Unterschied. Insbesondere, wenn Sie eine neue Systemadministrator- und geerbte Umgebung mit vielen Skripten sind.Warum die Original-Bourne-Shell nicht vorhanden ist, ist einfach - es ist ein proprietäres Produkt, das ursprünglich AT & T Bell Labs gehört.
Außerdem gibt es im Ubuntu-Wiki eine explizite Erklärung dazu:
Und hier ein Hinweis zur Portabilität:
Siehe https://wiki.ubuntu.com/DashAsBinSh
quelle
dash
unterstützen Funktionen, die nicht benötigt werdenPOSIX
?In GNU / Linux-Distributionen ist das "Original
/bin/sh
" tatsächlich Bash.GNU wollte eine Bourne-ähnliche Shell, die unter der GPL stand. Deshalb entschieden sie sich für Bash
/bin/sh
anstelle von Bourne, das keine GPL-Lizenz hatte. Moderne Linux-Distributionen erbten diese Entscheidung bis zu dem Punkt, dass es ein Standard wurde/bin/sh
, Bash zu sein. Die ursprüngliche Bourne-Shell ("sh") wurde in anderen Nicht-Linux-Unixen bereits in Solaris 10 verwendet, war jedoch in Linux-Distributionen noch nie ein Hauptbestandteil.Der Wechsel
/bin/sh
von Bash zu Dash war eine Debian-Entscheidung (von Ubuntu geerbt), die größtenteils von der Geschwindigkeit abhing - zu einer Zeit, in der die Verbesserung der Boot-Geschwindigkeit und ein Großteil der Boot-CPU-Zeit zu der Zeit, in der sie ausgeführt wurden, einen enormen Aufwand leisteten Init-Skripte.Bash wird weiterhin als standardmäßige Interactive / Login-Shell für Benutzer verwendet, aber Dash ist diejenige unter
/bin/sh
und diejenige, die für Systemskripten wie Init-Skripten ausgeführt wird.Dash ist sehr schnell, aber auch sehr eng POSIX-kompatibel - ein Standard, der eng an der Bourne-Shell ausgerichtet ist. In gewisser Weise kehren wir durch den Wechsel von Bash zu Dash zu einer Shell zurück, die enger an Bourne ausgerichtet ist.
quelle
ksh
, würde ich sagen. Ich erinnere mich nicht an eine Bourne-Shell mit der arithmetischen Erweiterung "$ (())", die POSIX ist.^
ein Pipe-Zeichen -echo foo ^ cat
wird alsofoo ^ cat
in POSIX sh, aberfoo
in Bourne ausgegeben; Dieser spezielle Test zeigt, wie Autoconf die beiden voneinander unterscheidet./bin/sh
ist/bin/dash
aus meiner Sicht mit Kompatibilitätsgründen verknüpft . Viele Skripte beginnen einfach mitdash
Wenn Sie/bin/sh
also zu einer symbolischen Verknüpfung wechseln und keine Verknüpfung herstellen, können viele Skripts nicht ordnungsgemäß (oder überhaupt nicht) ausgeführt werden, wenn sie überhaupt nicht vorhanden sind.Die Änderung wurde von
bash
nach vorgenommen ,dash
da laut https://wiki.ubuntu.com/DashAsBinSh :sh
ist nicht verknüpft mitbash
, weilWenn Sie verwenden möchten
bash
als/bin/sh
:Es gibt einige Funktionen,
dash
die bash nicht bietet:quelle
sh
zu/bin/sh
, würde diese Schraube auf dieses Boot - Skripte?/bin/sh
die von der Distribution bereitgestellte Shell beibehalten, da diese mit ihren Boot-Skripten und dergleichen als Ziel festgelegt wurde. Wenn Sie es jedoch durch Bourne ersetzen würden, wäre es größtenteils kompatibel. Ich würde mir allerdings vorstellen, dass es zu Brüchen kommen würde, nur aufgrund von winzigen Unterschieden gegenüber der schieren Menge an Code. Natürlich können Sie jede Shell in Ihren eigenen Skripten mit einem benutzerdefinierten Hashbang verwenden./bin/sh
, ist unabhängig von der Shell , die ein bestimmter Benutzer als anfängliche Anmeldeshell festgelegt hat. Das Ziel ,/bin/sh
nicht davon abhängen , welche Nutzer sucht, und Sie tun müssen verwendensudo
einige andere Mittel zu wirken , als Root - Benutzer --oder - es zu ändern. Außerdem muss im Allgemeinen und für jedes Paketdpkg-reconfigure
als root ausgeführt werden. Im Gegensatz dazu dürfen Benutzer normalerweise ihre eigene anfängliche Anmeldeshell ändern und können dies mit demchsh
Befehl tun . Der Name der ersten Anmeldeshell wird ebenfalls eingegeben$SHELL
und auch für einige interaktive Nicht-Anmeldeshells verwendet.