Warum benutzt niemand die echte Bourne-Shell als / bin / sh?

55

Mir ist aufgefallen, dass im Grunde kein System, mit dem ich jemals gearbeitet habe /bin/sh, eine echte ausführbare Datei ist. Es ist immer ein Symlink zu dash, bashim POSIX-Modus oder ähnlichem.

Warum? Was sind die Nachteile der Verwendung des wahren Originals /bin/sh? (Geschwindigkeit? Lizenzierung?)

strugee
quelle
3
Du hast doch immer nur Linux benutzt, oder? Ich habe bisher nur "sh as symlink" unter Linux gesehen.
Greg Hewgill
@GregHewgill Haben nicht aktuelle Versionen von Solaris eine shVerknüpfung zu ksh?
Gilles 'SO- hör auf böse zu sein'
1
@Gilles nach einer der Antworten, ja, seit Solaris 11. ist es verknüpft mit ksh.
Strugee
1
@ GregHewgill Ich habe auch Darwin verwendet, mit dem es in Verbindung gebracht wird bash, IIRC.
Strugee
6
Was meinst du mit dem Original / bin / sh ? Die Thomson-Shell von Unix V1? Die Bourne-Shell von Unix V7, die keine Funktionen hatte, kommentiert nicht ...? Die in SysIII, SysV, Solaris, HP / UX, die Asche Neuimplementierung auf BSDs? Heutzutage shbasiert es auf einem Standard, was bedeutet, dass wir mehrere Implementierungen haben können, die sich klar spezifiziert verhalten, solange Sie die Standardsyntax in Ihrem Skript verwenden.
Stéphane Chazelas

Antworten:

38

Ich vermute, es fehlen Funktionen - kein Befehlsverlauf, keine ausgefallene Umleitung, keine Befehlszeilenbearbeitung. BSD hat cshaus diesen Gründen die C-Shell eingeführt . Ein weiterer Faktor ist, dass die Genuine Bourne Shell erst vor kurzem in Open Source-Form verfügbar war . Sie können es nur weitergeben, wenn Sie es lizenziert haben. Das machte es für kostenlose Distributionen unerreichbar und für andere Distributionen und BSDs ideologisch ungenießbar.

Aber der Code ist jetzt verfügbar . Sie können einen Blick darauf werfen, es kompilieren und ausprobieren.

Bruce Ediger
quelle
50
Und wechseln Sie dann umgehend zu dem, was Sie zuvor verwendet haben.
Ignacio Vazquez-Abrams
24
@strugee "" Mangel an Funktionen "- warum sollte dies ein Problem sein?" Ja, guter Punkt ... warum verwenden Programmierer nutzlose Dinge wie Assembler / C / Hochsprachen, wenn Sie irgendetwas mit ihnen anfangen können, das Sie bereits schreiben können Maschinensprache direkt? Fakt ist: Features = Erhöhung der Entwicklungsgeschwindigkeit + Erhöhte Wartbarkeit = Geringere Kosten = Besseres Verwenden shist genau wie Verwenden, bashaußer dass es langsamer ist, Programme länger sind und schwieriger zu warten ist.
Bakuriu
10
Es ist nicht wirklich das Fehlen von Funktionen, aber die Tatsache, dass POSIX den shBefehl zum Ausführen einer POSIX-kompatiblen Shell verlangt, was die alte Bourne-Shell nicht ist. POSIX muss sich zwar nicht shin /bin/shdiesem Verzeichnis befinden, dies ist jedoch das logischste Verzeichnis dafür.
Juli
4
Der @ Bakuriu-Befehlsverlauf und die Befehlszeilenbearbeitung sind beides Dinge, die Sie für ein Skript nicht wirklich benötigen würden.
Strugee
4
@strugee Das sind nicht die einzigen Unterschiede. Zum Beispiel shnicht Tilde und Klammer Expansion hat einige eingebauten Funktionen fehlen (zB pushdund popd, select) keine arithmetische Erweiterung. Viele Variablen fehlen, z PIPESTATUS.
Bakuriu
23

Die Aussage in Ihrer Frage ist falsch. Solaris bis zu Version 10 ist das Erbe wahr Bourne - Shell wie die Bereitstellung /bin/sh. Dies wurde getan, um die Kompatibilität mit alten Skripten, die mit einer anderen Shell fehlschlagen könnten, nicht zu beeinträchtigen. Diese Wahl war jedoch ansonsten sehr frustrierend.

Die meisten, wenn nicht alle verbleibenden Unix- und Unix-ähnlichen Releases, einschließlich Solaris 11, bieten eine POSIX-kompatible Shell, /bin/shda POSIX den shBefehl zum Starten einer POSIX-Shell fordert, nicht die nicht kompatible ältere Bourne-Shell. /bin/shist allgemein :

  • ksh88oder ksh93auf den kommerziellen Unix-Implementierungen
  • eine modifizierte basham OS/X(obwohl es früher war zsh)
  • ein ashoder pdkshDerivat auf andereBSDs
  • bashoder dashauf Gnu / Linux-Distributionen.

Es ist nicht unbedingt eine Verknüpfung, sondern kann auf vielen Systemen, aber unter Gnu / Linux, eine echte ausführbare Datei sein.

Interessanterweise ist es nicht der Mangel an Funktionen, der Distributionsentwickler dazu veranlasst, etwas anderes als die alte Bourne-Shell zu installieren, /bin/shsondern der Wunsch, so POSIX-konform wie möglich zu sein, dh sich wie eine zu verhalten Unix wie OS. Die Tatsache, dass die POSIX-Shell mehr Funktionen bietet als die herkömmliche Bourne-Shell, ist nur ein Nebeneffekt dieses Standard-Compliance-Ziels.

Es ist auch eine Tatsache, dass sich einige Shells, insbesondere bashwenn sie aufgerufen werden sh, anders verhalten . Dadurch werden hauptsächlich Features aus der Shell entfernt, nicht umgekehrt.

jlliagre
quelle
16

Soweit ich weiß, konnte die ursprüngliche Bourne-Shell aufgrund ihrer Lizenz nicht von den BSDs und dem GNU-Projekt verwendet werden.

Damals hatte das ursprüngliche Unix keine Lizenz und das GNU-Projekt brauchte eine Shell, die unter der GPL stand, also benutzten sie die Bash.

Dasselbe gilt für BSD4, das übergeordnete Element aller BSDs. Dank der AT & T-Klage mussten sie den gesamten Quellcode des ursprünglichen Unix einschließlich der Bourne-Shell neu schreiben.

In der traditionellen BSD-Linie wurde die Bourne-Shell bis 4.3BSD-Reno ausgeliefert (jedoch nicht mehr mit Net / 2 und den folgenden 4.4BSDs). Aus Lizenzgründen wurde es dann durch das bourne-kompatible, svr4-ähnliche sh von Kenneth Almquist (oft als ash bezeichnet) ersetzt.

Aus FreeBSDs man sh

Ein sh-Befehl, die Thompson-Shell, erschien in Version 1 von AT & T UNIX. Es wurde in Version 7 AT & T UNIX von der Bourne-Shell abgelöst, die den Namen sh erbte.

Diese Version von sh wurde 1989 unter der BSD-Lizenz nach der Bourne-Shell von AT & T System V Release 4 UNIX umgeschrieben

Daher mussten beide Projekte die Bourne-Shell nicht verwenden und sich mit einer echten Open-Source-Shell begnügen.

Raphael Ahrens
quelle
7

Es gab andere Probleme. Die Bourne-Shell verwendete sbrk () anstelle von malloc () und war daher nicht sehr portabel.

Nachdem die Bourne Shell über OpenSolaris zu OpenSource geworden war, erstellte ich eine portable Version und später eine wirklich portable Version, indem ich sbrk () durch malloc () ersetzte, mit der Hilfe von Geoff Collyer (der gleichen Person, die dazu beitrug, sbrk () im Internet zu vermeiden) Korn Shell).

Der erste Grund, warum ich eine portable Version der Bourne Shell gemacht habe, ist, dass ich den History Editor, den ich zwischen 1982 und 1984 für meine "bsh" geschrieben habe, auch in der Bourne Shell verfügbar machen wollte. In der Zwischenzeit habe ich die meisten der einzigartigen Eigenschaften, die ich für "bsh" geschrieben habe, auf die Bourne Shell portiert.

Dies ist unter anderem:

  • Kompiliert und funktioniert fast überall, einschließlich Cygwin (fast 2x schneller als bash)
  • Der History-Editor mit einem LRU-Ringpuffer
  • eingebautes TERMCAP
  • Erweiterte Aliase (global persistente Aliase, lokale Aliase, ...) und zusammen mit dem eingebauten "Dosh" ist die Bourne Shell die einzige Bourne Shell-ähnliche Implementierung, die parametrisierbare Aliase ermöglicht.
  • Unterstützung für die Bearbeitung komplexer Aliase im Verlaufseditor im Raw-Modus.
  • Greifen Sie über .sh. * -Variablen auf alle 32 Bits des exit (2) -Codes zu.
  • fortschrittliche automatische Zeitmessung mit 6-stelliger Auflösung
  • pushd / popd / dirs
  • eingebauter "find"
  • Rohr aus stderr
  • Verwenden von vfork () für eine bessere Leistung.
  • behebt schließlich alle dokumentierten Fehler aus der SVr4 Bourne Shell, zB Suspend funktioniert immer im Job Control Modus. ...

Die Online-Manpage finden Sie unter: http://schillix.sourceforge.net/man/man1/bosh.1.html Die Quellen sind Teil der Schily-Toolbox unter:

https://sourceforge.net/projects/schilytools/files/

Ich empfehle: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 oder eine neuere Version.

PS Ich bin an Feedback interessiert

schily
quelle
Hallo Jörg. Warum sollten sie auf die Bourne-Shell portiert werden, anstatt auf eine Shell, die bereits wie BSD sh oder pdksh POSIXified wurde?
Stéphane Chazelas
Die Bourne Shell-Portierung war eine Herausforderung, da stdio nicht verwendet wird. Dies war eine ähnliche Herausforderung wie die Verwendung der ursprünglichen csh-Quelle und deren Kompilierung durch Ersetzen des in VAX Assembler geschriebenen Nicht-stdio-printf. Aber ich habe der Bourne-Shell bereits viele neuere POSIX-Funktionen hinzugefügt, und ich bleibe gerne bei der Bourne-Shell auf SchilliX, damit sie mit / anr / usr auf separaten Dateisystemen booten kann, was mit der Korn-Shell nicht möglich ist.
Schily
Beachten Sie auch, dass ich überprüfen wollte, ob die Geschwindigkeit von ksh durch die Verwendung von vfork () verursacht wird. Jetzt, da ich die Bourne-Shell auf vfork () umgestellt habe, ist sie genauso schnell wie die neuesten ksh-Versionen. Dies ist eine Erfahrung, die Sie nur erhalten, wenn Sie mit dem ursprünglichen Bourne Shell-Quellcode beginnen.
Schily
OK, aber bis Sie das sh POSIX-konform machen, wird es wahrscheinlich nicht viel Interesse erregen. Ich erinnere mich, dass Sie bei der Austin Group ML nach Inkompatibilitäten mit POSIX der Bourne-Shell gefragt haben. Arbeiten Sie daran (was bedeuten würde, die Abwärtskompatibilität mit der Bourne-Shell zu brechen)? Auch die Leute (zumindest ich) betrachten POSIX-sh-Syntax als Fortschritt gegenüber der Bourne-Shell. Wenn Sie Ihre von Bourne abgeleitete Shell weiterhin aufrufen, kann die Bourne-Shell den falschen Eindruck vermitteln. Wie wäre es mit Bimsh (Bourne verbessert (ala vi / vim))?
Stéphane Chazelas
Meine Bourne-Shell ist in einigen Aspekten bereits besser als ksh, z. B. durch Implementierung besserer Aliase, Pushd / Popd / Dirs und Unterstützung der Ressourcennutzung basierend auf modernen UNIX-Funktionen, wenn ksh noch SVr2-basiert ist. Wie Sie scheinen in der Shell interessiert und erfahren zu sein, würde Ich mag Ideen bekommen , was möchten Sie nach der Lektüre als nächstes in der Bourne - Shell sehen: schillix.sourceforge.net/man/man1/bosh.1.html Beachten Sie, dass Bisher habe ich alle neuen Code # ifdef'd und einige Funktionen (wie stderr Pipes) müssen über set (1) eingeschaltet werden.
Schily
4

Es ist mit Shells verknüpft, die 100% Abwärtskompatibilität bieten . Sie verlieren nichts, was die ursprüngliche Shell hat, sondern erhalten darüber hinaus weitere Funktionen. Es gibt keinen Nachteil, warum also die neuen Funktionen verpassen? Dies ist der gleiche Grund, warum /bin/vinormalerweise mit vim verbunden ist .

JoelFan
quelle
5
Der Nachteil ist, dass die Leute Skripte schreiben, die auf ihrem einen System funktionieren, und denken, dass ihr Skript kompatibel ist, wenn es nicht kompatibel ist. Ich habe einmal fast hundert Gentoo-Shell-Skripte repariert, die tatsächlich bash benötigten, aber / bin / sh hießen. Sie sind alle kaputt gegangen, als ich / bin / sh geändert habe, um statt bash Bindestrich zu sein.
Zan Lynx
3
"kein Nachteil" - Geschwindigkeit. zB bashist viel, viel langsamer alsdash
strugee
@strugee Wenn Sie nach Verbesserungen der Geschwindigkeit im MS-Bereich in einer Shell suchen, verwenden Sie wahrscheinlich nicht das richtige Werkzeug für den Job.
Chris Down
1
@ChrisDown "MS-Range Verbesserungen" definieren?
Strugee
2
Die POSIX-sh-Syntax ist nicht vollständig abwärtskompatibel mit der Bourne-sh-Syntax. Zum Beispiel IFS=,; rm file1,file2,file3würde diese 3 Dateien in der Bourne-Shell entfernen. Diese (alberne) Funktion wurde in POSIX sh entfernt. Es gibt Dutzende subtiler Unterschiede, die dazu führen können, dass ein Skript, das für die Bourne-Shell geschrieben wurde, unter POSIX sh anders funktioniert.
Stéphane Chazelas