Allerdings wurde die Korn-Shell - im Gegensatz zur POSIX-Shell - außerhalb der kommerziellen Unix-Welt nie wirklich populär. Dies liegt daran, dass sein Aufstieg mit den Anfangsjahren der Unix-Kommerzialisierung korrespondierte und er sich in den Unix-Kriegen verfing . BSD Unixes hat es zugunsten der C-Shell vermieden, und sein Quellcode war zu Beginn nicht frei für Linux verfügbar. Als die frühen Linux-Distributoren nach einer Befehls-Shell suchten, die zu ihrem Linux-Kernel passte, suchten sie Normalerweise haben sie sich für GNU Bash entschieden , eine der sh
Kompatiblen , von denen Sie sprechen. «
Die frühe Verbindung zwischen Linux und Bash so ziemlich das Schicksal vielen anderen Schalen versiegelt, einschließlich ksh
, csh
und tcsh
. Es gibt heute immer noch Hardcore-Spieler, die diese Muscheln verwenden, aber sie sind in der Minderheit. «
Ich habe "Shell-Skript" oben als Oberbegriff für Bourne / POSIX-Shell-Skript verwendet. Dies ist auf die Allgegenwart der Bourne-Familie zurückzuführen. Um über Skripte in anderen Shells zu sprechen, müssen Sie ein Qualifikationsmerkmal wie "C-Shell-Skript" angeben. Selbst auf Systemen, auf denen eine Shell der C-Familie die standardmäßige interaktive Shell ist, ist es besser , die Bourne-Shell für die Skripterstellung zu verwenden.
Es gibt viele Möglichkeiten, um zu überprüfen, ob ein bestimmtes Shell-Skript der Bourne-Familie portierbar ist:
Frühere Versionen von BSD Unix waren nur Add-On-Software-Sammlungen für V6 Unix. Da die Bourne-Shell erst in V7 zu AT & T Unix hinzugefügt wurde, hatte BSD die Bourne-Shell technisch gesehen nicht in den Anfängen. Die Antwort von BSD auf die primitive Natur der Thompson-Schale war die C-Schale .
Die ersten eigenständigen Versionen von BSD (2.9BSD und 3BSD) basierten jedoch auf V7 oder dessen portablem Nachfolger UNIX / 32V und enthielten daher die Bourne-Shell.
(Die 2BSD Linie verwandelte sich in eine parallele Gabel von BSD für Digital PDP Minicomputer , während die 3BSD und 4BSD Linien ging um die neueren Computertypen wie zu nehmen VAXen und Unix - Workstations 2.9BSD war im Wesentlichen die PDP - Version von 4.1cBSD;. Sie waren zeitigen und gemeinsamer Code . PDPs nicht nur verschwinden , wenn der VAX angekommen, so dass die 2BSD Linie ist noch shambling entlang .)
Man kann mit Sicherheit sagen, dass die Bourne-Shell 1983 überall in der Unix-Welt war. Das ist eine gute Annäherung an "für immer" in der Computerbranche. MS-DOS bekam ein hierarchisches Dateisystem , das Jahr (awww, wie cuuute!) Und der erste 24-Bit - Macintosh mit seinem 9" B & W - Bildschirm - nicht Graustufen, buchstäblich schwarz und weiß - würde früh im nächsten Jahr nicht kommen , bis.
Die Thompson-Schale war für heutige Verhältnisse recht primitiv . Es war nur eine interaktive Befehls-Shell und nicht die Skript-Programmierumgebung, die wir heute erwarten. Es gab Dinge wie Pipes und E / A-Umleitung, die wir als prototypischen Teil einer "Unix-Shell" betrachten, so dass wir uns die MS-DOS-Befehlsshell als von Unix erhalten vorstellen.
Die Bourne - Shell ersetzt auch die PWB Schale , die wichtige Dinge auf die Thompson Shell wie Programmierbarkeit (hinzugefügt if
, switch
und while
) und eine frühe Form von Umgebungsvariablen. Die PWB-Shell ist noch weniger bekannt als die Thompson-Shell, da sie nicht in jeder Unix-Version enthalten war.
Wenn jemand nicht speziell auf die Kompatibilität von POSIX und Bourne-Shell eingeht, kann dies eine ganze Reihe von Dingen bedeuten.
In einem Extremfall könnten sie die Bourne-Shell von 1979 als Basis verwenden. Ein „ sh
-kompatiblen Skript“ in diesem Sinne würde bedeuten , es wird erwartet, perfekt auf die wahre Bourne - Shell oder einem seiner Nachfolger und Klone laufen: ash
, bash
, ksh
, zsh
, usw.
Jemand im anderen Extrem nimmt stattdessen die von POSIX als Basis angegebene Shell an. Wir nehmen heutzutage so viele POSIX-Shell-Funktionen als "Standard", dass wir oft vergessen, dass sie in der Bourne-Shell nicht vorhanden waren: integrierte Arithmetik, Auftragssteuerung, Befehlsverlauf, Aliase, Befehlszeilenbearbeitung, $()
Befehlsform Substitution usw.
Obwohl die Korn-Shell Wurzeln hat, die bis in die frühen 1980er Jahre zurückreichen, wurde sie von AT & T erst 1988 in System V Release 4 unterksh
Unix ausgeliefert Ende der 1980er Jahre.
(Ein paar seltsame Unix-Aromen, die auf SVR3 basierten und sich vor der Veröffentlichung von SVR4 auf dem Markt behaupteten, waren jedoch die ersten, als die Revolution kam.)
1988 ist auch das Jahr, in dem der erste POSIX-Standard mit seiner auf der Korn-Shell basierenden "POSIX-Shell" herauskam. Später, 1993, erschien eine verbesserte Version der Korn-Shell. Da POSIX das Original an Ort und Stelle effektiv genagelt, ksh
gegabelt in zwei Hauptversionen: ksh88
und ksh93
, benannt nach den in ihrer Spaltung beteiligt Jahren.
ksh88
ist nicht vollständig POSIX-kompatibel, obwohl die Unterschiede gering sind, so dass einige Versionen der ksh88
Shell als POSIX-kompatibel gepatcht wurden. (Dies ist ein interessantes Interview über Slashdot mit Dr. David G. Korn . Ja, der Typ, der die Shell geschrieben hat.)
ksh93
ist eine voll kompatible Obermenge der POSIX-Shell . Die Entwicklung von ksh93
wurde sporadisch fortgesetzt, seit das primäre Quell-Repository von AT & T auf GitHub verschoben wurde. Die neueste Version ist ungefähr 3 Jahre alt, als ich dies schreibe, ksh93v. (Der Basisname des Projekts bleibt ksh93
mit Suffixen versehen, um Release-Versionen nach 1993 zu kennzeichnen.)
Systeme, die eine Korn-Shell separat von der POSIX-Shell enthalten, stellen diese normalerweise zur Verfügung /bin/ksh
, obwohl sie sich manchmal an anderer Stelle versteckt.
Wenn wir über ksh
die Korn-Shell oder über deren Namen sprechen, sprechen wir über ksh93
Funktionen, die sie von ihren abwärtskompatiblen Bourne- und POSIX-Shell-Teilmengen unterscheiden. Du rennst ksh88
heute selten über das Reine .
AT & T hat den Quellcode der Korn-Shell bis März 2000 geschützt . Zu diesem Zeitpunkt war Linux sehr stark mit GNU Bash verbunden. Bash und ksh93
beide haben Vorteile gegenüber den anderen , aber an diesem Punkt hält die Trägheit Linux eng mit Bash verbunden.
Wie, warum über die frühen Linux - Anbieter am häufigsten wählen GNU Bash pdksh
, das war zu der Zeit verfügbaren Linux wurde getting started, würde ich denke , es ist , weil so viel von dem Rest des Userland auch herkam dem GNU - Projekt . Bash ist auch etwas fortgeschrittener als pdksh
, da sich die Bash-Entwickler nicht darauf beschränken, Korn-Shell-Features zu kopieren.
pdksh
Ungefähr zu dem Zeitpunkt, als AT & T den Quellcode für die echte Korn-Shell freigegeben hat, wurden die Arbeiten eingestellt. Es gibt jedoch zwei Hauptgabeln , die noch gewartet werden: die OpenBSD - pdksh
und die MirBSD - Korn - Shellmksh
.
Ich finde es interessant, dass dies mksh
die einzige Korn-Shell-Implementierung ist, die derzeit für Cygwin gepackt ist.
GNU Bash geht in vielerlei Hinsicht über POSIX hinaus, aber Sie können es bitten, in einem reineren POSIX-Modus zu laufen .
csh
/ tcsh
war bis Anfang der 90er Jahre normalerweise die standardmäßige interaktive Shell unter BSD Unixes.
Als BSD-Variante waren frühe Versionen von Mac OS X über Mac OS X 10.2 "Jaguar" auf diese Weise verfügbar . OS X hat die Standard-Shell tcsh
in OS X 10.3 "Panther" von auf Bash umgestellt . Diese Änderung hatte keine Auswirkungen auf Systeme, die von 10.2 oder früher aktualisiert wurden. Die vorhandenen Benutzer auf diesen konvertierten Systemen behielten ihre tcsh
Shell.
FreeBSD behauptet, weiterhin tcsh
als Standard-Shell verwendet zu werden , aber auf der FreeBSD 10-VM, die ich hier habe, scheint die Standard-Shell eine der POSIX-kompatiblen Almquist-Shell-Varianten zu sein . Dies gilt auch für NetBSD.
OpenBSD verwendet pdksh
stattdessen einen Fork als Standard-Shell.
Die höhere Popularität von Linux und OS X lässt manche Menschen wünschen, dass FreeBSD auch zu Bash wechseln würde, aber aus philosophischen Gründen werden sie dies in Kürze nicht tun . Es ist leicht zu wechseln , wenn Sie das stört.
Heutzutage ist es selten, ein System mit einer echten Vanille-Bourne-Shell zu finden /bin/sh
. Sie müssen sich sehr viel Mühe geben, um etwas zu finden, das für Kompatibilitätstests ausreicht.
Mir ist nur eine Möglichkeit bekannt, eine echte Bourne-Shell aus dem Jahr 1979 auf einem modernen Computer auszuführen: Verwenden Sie die Ancient Unix V7- Datenträgerabbilder mit dem SIMH PDP-11-Simulator aus dem Computer History Simulation Project . SIMH läuft auf so ziemlich jedem modernen Computer , nicht nur auf Unix-ähnlichen Computern . SIMH läuft sogar auf Android und iOS .
Mit OpenSolaris hat Sun zum ersten Mal die SVR4-Version der Bourne-Shell als Open-Source-Version bereitgestellt. Zuvor war der Quellcode für die Post-V7-Versionen der Bourne-Shell nur für Benutzer mit einer Unix-Quellcodelizenz verfügbar.
Dieser Code ist jetzt separat vom Rest des nicht mehr existierenden OpenSolaris-Projekts aus verschiedenen Quellen verfügbar.
Die direkteste Quelle ist das Heirloom Bourne-Shell-Projekt . Dies wurde kurz nach der ursprünglichen Veröffentlichung von OpenSolaris im Jahr 2005 verfügbar. In den nächsten Monaten wurden einige Portabilitäts- und Fehlerbehebungsarbeiten durchgeführt, die Entwicklung des Projekts wurde jedoch gestoppt.
Jörg Schilling hat eine Version dieses Codes besser gepflegt als osh
sein Schily Tools- Paket. Mehr dazu siehe oben.
Beachten Sie, dass diese Shells, die aus der Quellcodeversion 2005 stammen , Unterstützung für Multibyte-Zeichensätze , Auftragssteuerung, Shell-Funktionen und andere Funktionen enthalten, die in der ursprünglichen Bourne-Shell von 1979 nicht enthalten sind.
Eine Möglichkeit, festzustellen, ob Sie sich in einer Original-Bourne-Shell befinden, besteht darin, zu prüfen, ob diese eine undokumentierte Funktion unterstützt, die hinzugefügt wurde, um den Übergang von der Thompson-Shell zu erleichtern: ^
als Alias für |
. Das heißt, ein Befehl wie ls ^ more
gibt einen Fehler in einer Korn- oder POSIX-Shell aus, aber er verhält sich wie ls | more
in einer echten Bourne-Shell.
Gelegentlich trifft man auf einen fish
, scsh
oder rc/es
haftend, aber sie sind noch seltener als C - Shell - Fans.
Die rc
Familie der Shells wird auf Unix- / Linux-Systemen normalerweise nicht verwendet, aber die Familie ist historisch wichtig. So hat sie sich einen Platz im obigen Diagramm verdient. rc
ist die Standard-Shell des Betriebssystems Plan 9 von Bell Labs , eine Art Nachfolger von Unix der 10. Edition , die im Rahmen der fortgesetzten Forschung von Bell Labs im Bereich Betriebssystemdesign entwickelt wurde. Es ist auf Programmierebene nicht mit der Bourne- und der C-Shell kompatibel. Da ist wahrscheinlich eine Lektion drin.
Die aktivste Variante von rc
scheint die von Toby Goodwin gepflegte zu sein , die auf dem Unix- rc
Klon von Byron Rakitzis basiert.
sh
) kompatibel (ausführbar ) ist. Bei einer anderen Shell wird angegeben, ob diese Shell Bourne-Shell-Skripts ausführen kann.