Was ist der Punkt, an dem man mit dem Bindestrich verbunden ist?

36

Ich frage mich, womit der Sinn des shSymbolischen verbunden dashist. Ich verstehe, dashdas soll schneller sein als bash, aber ich bin mir nicht sicher, warum die ursprüngliche shShell nicht vorhanden ist sh.

Oder wenn irgendetwas, warum nicht shverbunden bash?

NerdOfCode
quelle

Antworten:

72

Die kurze Antwort auf die Frage, warum die ursprüngliche sh-Shell nicht vorhanden shist, 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/shdurch 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 shFunktionen 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/shmusste 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/shIch 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 shNamen "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/shin Debian anstelle von bash zu machen. Ubuntu begann, bevor Debian damit begann, Bashismen (die Verwendung bashspezifischer Funktionen in #!/bin/shSkripten) 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/shist , 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.

Gilles 'SO - hör auf böse zu sein'
quelle
Ich würde argumentieren, dass es gute Gründe gibt, ksh93 als / bin / sh zu verwenden - es ist eine der leistungsstärksten POSIX-Shells, die es gibt. Einverstanden, dass die Allgegenwart von Dash eine Frage des Timings ist.
Charles Duffy
2
@CharlesDuffy Ksh93 erledigt komplexe Aufgaben schneller, aber Dash schlägt es für die Startzeit und für einfache Skripte (wie alle Aufrufe von system(3), die von Anwendungen ausgeführt werden), ist dies der dominierende Faktor.
Gilles 'SO - hör auf, böse zu sein'
21

Geschwindigkeit und POSIX-Konformität (mit anderen Worten Portabilität) sind die Hauptfaktoren. Denken Sie daran, dass /bin/shdies für Systemskripte gedacht ist, die möglicherweise aus älteren Versionen von Ubuntu und / oder anderen Systemen stammen.

Sicher, glänzende Funktionen von bashsind 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:

Warum wurde diese Änderung vorgenommen? Der Hauptgrund für den Wechsel der Standard-Shell war die Effizienz. bash ist eine hervorragende Shell mit vollem Funktionsumfang, die für den interaktiven Gebrauch geeignet ist. In der Tat ist es immer noch die Standard-Login-Shell. Es ist jedoch im Vergleich zum Armaturenbrett ziemlich groß und langsam in Betrieb zu nehmen und zu betreiben. Eine große Anzahl von Shell-Instanzen wird im Rahmen des Ubuntu-Startvorgangs gestartet. Anstatt sie einzeln so zu ändern, dass sie explizit unter / bin / dash ausgeführt werden, eine Änderung, die erhebliche laufende Wartung erfordert und die möglicherweise rückläufig ist, wenn sie nicht genau beachtet wird, war das Kernentwicklungsteam von Ubuntu der Ansicht, dass es am besten ist, sie einfach zu ändern die Standard-Shell. Die Verbesserungen der Startgeschwindigkeit in Ubuntu 6.10 wurden häufig fälschlicherweise Upstart zugeschrieben, das eine gute Plattform für die zukünftige Entwicklung des Init-Systems ist, jedoch in Ubuntu 6. 10 wurde hauptsächlich im System V-Kompatibilitätsmodus mit nur geringen Verhaltensänderungen ausgeführt. Diese Verbesserungen waren in der Tat größtenteils auf das geänderte / bin / sh zurückzuführen.

Und hier ein Hinweis zur Portabilität:

Das Debian-Richtlinienhandbuch hat lange vorgeschrieben, dass "Shell-Skripte, die '/ bin / sh' als Interpreter spezifizieren, nur POSIX-Funktionen verwenden dürfen"; Tatsächlich besteht diese Anforderung bereits lange vor dem Start des Ubuntu-Projekts. Darüber hinaus haben alle Shell-Skripte, von denen erwartet wurde, dass sie auf andere Unix-Systeme wie BSDs oder Solaris portierbar sind, diese Anforderung bereits erfüllt. Wir waren daher der Meinung, dass die Auswirkungen dieser Änderung auf die Kompatibilität minimal sein würden.

Siehe https://wiki.ubuntu.com/DashAsBinSh

Sergiy Kolodyazhnyy
quelle
Nicht dashunterstützen Funktionen, die nicht benötigt werden POSIX?
NerdOfLinux
@NerdOfLinux Es spielt keine Rolle, was / bin / sh zusätzlich zu POSIX unterstützt (solange diese Zusätze keine POSIX-Skripte beschädigen). Wichtig ist, dass alles POSIX unterstützt wird (und das so schnell wie möglich). Solange dash diese Anforderungen erfüllt, kann / bin / sh eine Verknüpfung dazu herstellen.
Guntram Blohm unterstützt Monica
9

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/shanstelle 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/shvon 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/shund 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.

thomasrutter
quelle
"Dash ist sehr schnell, aber auch sehr eng POSIX-kompatibel - ein Standard, der eng an der Bourne-Shell ausgerichtet ist." Ja, obwohl POSIX enger verwandt ist ksh, würde ich sagen. Ich erinnere mich nicht an eine Bourne-Shell mit der arithmetischen Erweiterung "$ (())", die POSIX ist.
Sergiy Kolodyazhnyy
1
Außerdem ist in Bourne ^ein Pipe-Zeichen - echo foo ^ catwird also foo ^ catin POSIX sh, aber fooin Bourne ausgegeben; Dieser spezielle Test zeigt, wie Autoconf die beiden voneinander unterscheidet.
Charles Duffy
Interessant, also mit POSIX meinst du Korn?
Thomasrutter
0

/bin/shist /bin/dashaus meiner Sicht mit Kompatibilitätsgründen verknüpft . Viele Skripte beginnen einfach mit

#!/bin/sh

dashWenn Sie /bin/shalso 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 bashnach vorgenommen , dashda laut https://wiki.ubuntu.com/DashAsBinSh :

Der Hauptgrund für den Wechsel der Standard-Shell war die Effizienz. bash ist eine hervorragende Shell mit vollem Funktionsumfang, die für den interaktiven Gebrauch geeignet ist. In der Tat ist es immer noch die Standard-Login-Shell. Es ist jedoch im Vergleich zum Armaturenbrett ziemlich groß und langsam in Betrieb zu nehmen und zu betreiben. Eine große Anzahl von Shell-Instanzen wird im Rahmen des Ubuntu-Startvorgangs gestartet. Anstatt sie einzeln so zu ändern, dass sie explizit unter / bin / dash ausgeführt werden, eine Änderung, die erhebliche laufende Wartung erfordert und die möglicherweise rückläufig ist, wenn sie nicht genau beachtet wird, war das Kernentwicklungsteam von Ubuntu der Ansicht, dass es am besten ist, sie einfach zu ändern die Standard-Shell.

shist nicht verknüpft mit bash, weil

Das Debian-Richtlinienhandbuch hat lange vorgeschrieben, dass "Shell-Skripte, die '/ bin / sh' als Interpreter angeben, nur POSIX-Funktionen verwenden dürfen".

Wenn Sie verwenden möchten bashals /bin/sh:

Wenn die Probleme weiter verbreitet sind und Sie die Standard-System-Shell zurücksetzen möchten, können Sie das Paketverwaltungssystem anweisen, die Installation von dash als / bin / sh zu beenden:

sudo dpkg-reconfigure dash

Es gibt einige Funktionen, dashdie bash nicht bietet:

Es gibt sogar die Möglichkeit von außen, dass es einige Skripte gibt, die jetzt von einer Dash-Funktion abhängen, die Bash nicht bietet!

NerdOfLinux
quelle
Ich habe bereits verstanden, dass Kompatibilität ein Faktor sein kann, aber ich suchte nach einer nicht so offensichtlichen und tiefer
gehenden
2
Also , wenn ich den Original - Bourne - Shell installieren shzu /bin/sh, würde diese Schraube auf dieses Boot - Skripte?
Dessert
Versuchen Sie dies am besten zuerst in einer virtuellen Maschine, bevor Sie sie in der realen Welt
bereitstellen
2
Sie sollten /bin/shdie 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.
ThomasRutter
1
@mckenzm Mit welcher Shell verbunden ist /bin/sh, ist unabhängig von der Shell , die ein bestimmter Benutzer als anfängliche Anmeldeshell festgelegt hat. Das Ziel , /bin/shnicht davon abhängen , welche Nutzer sucht, und Sie tun müssen verwenden sudoeinige andere Mittel zu wirken , als Root - Benutzer --oder - es zu ändern. Außerdem muss im Allgemeinen und für jedes Paket dpkg-reconfigureals root ausgeführt werden. Im Gegensatz dazu dürfen Benutzer normalerweise ihre eigene anfängliche Anmeldeshell ändern und können dies mit dem chshBefehl tun . Der Name der ersten Anmeldeshell wird ebenfalls eingegeben $SHELLund auch für einige interaktive Nicht-Anmeldeshells verwendet.
Eliah Kagan