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
, bash
im POSIX-Modus oder ähnlichem.
Warum? Was sind die Nachteile der Verwendung des wahren Originals /bin/sh
? (Geschwindigkeit? Lizenzierung?)
sh
Verknüpfung zuksh
?ksh
.bash
, IIRC.sh
basiert 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.Antworten:
Ich vermute, es fehlen Funktionen - kein Befehlsverlauf, keine ausgefallene Umleitung, keine Befehlszeilenbearbeitung. BSD hat
csh
aus 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.
quelle
sh
ist genau wie Verwenden,bash
außer dass es langsamer ist, Programme länger sind und schwieriger zu warten ist.sh
Befehl zum Ausführen einer POSIX-kompatiblen Shell verlangt, was die alte Bourne-Shell nicht ist. POSIX muss sich zwar nichtsh
in/bin/sh
diesem Verzeichnis befinden, dies ist jedoch das logischste Verzeichnis dafür.sh
nicht Tilde und Klammer Expansion hat einige eingebauten Funktionen fehlen (zBpushd
undpopd
,select
) keine arithmetische Erweiterung. Viele Variablen fehlen, zPIPESTATUS
.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/sh
da POSIX densh
Befehl zum Starten einer POSIX-Shell fordert, nicht die nicht kompatible ältere Bourne-Shell./bin/sh
ist allgemein :ksh88
oderksh93
auf den kommerziellen Unix-Implementierungenbash
amOS/X
(obwohl es früher warzsh
)ash
oderpdksh
Derivat auf andereBSDs
bash
oderdash
auf 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/sh
sondern 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
bash
wenn sie aufgerufen werdensh
, anders verhalten . Dadurch werden hauptsächlich Features aus der Shell entfernt, nicht umgekehrt.quelle
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.
Aus FreeBSDs
man sh
Daher mussten beide Projekte die Bourne-Shell nicht verwenden und sich mit einer echten Open-Source-Shell begnügen.
quelle
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:
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
quelle
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/vi
normalerweise mit vim verbunden ist .quelle
bash
ist viel, viel langsamer alsdash
IFS=,; rm file1,file2,file3
wü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.