Detto questo, la shell Korn - come una cosa distinta dalla shell POSIX - non è mai diventata molto popolare al di fuori del mondo commerciale di Unix. Questo perché la sua ascesa corrispondeva ai primi anni della commercializzazione di Unix, quindi fu coinvolto nelle guerre di Unix . BSD Unixes lo ha eluso a favore della shell C, e il suo codice sorgente non è stato liberamente disponibile per l'uso in Linux quando è stato avviato. »Quindi, quando i primi distributori di Linux sono andati alla ricerca di una shell di comando da utilizzare con il loro kernel Linux, di solito hanno scelto GNU Bash , uno di quelli di sh
cui stai parlando. ⁶
Che presto associazione tra Linux e bash praticamente sigillato il destino di molte altre shell, tra cui ksh
, csh
e tcsh
. Ci sono ancora degli irriducibili che usano ancora quelle conchiglie oggi, ma sono molto in minoranza
Ho usato "shell script" sopra come un termine generico che significa script di shell Bourne / POSIX. Ciò è dovuto all'ubiquità delle conchiglie della famiglia Bourne. Per parlare di scripting su altre shell, è necessario fornire un qualificatore, come "Script shell C." Anche su sistemi in cui una shell della famiglia C è la shell interattiva predefinita, è meglio usare la shell Bourne per gli script.
Esistono molti modi per verificare se un determinato script della shell della famiglia Bourne è portatile:
Le prime versioni di BSD Unix erano solo raccolte di componenti aggiuntivi per V6 Unix. Poiché la shell Bourne non è stata aggiunta a Unix AT&T fino alla V7, BSD non ha tecnicamente iniziato con la shell Bourne. La risposta di BSD alla natura primitiva del guscio Thompson era la shell C .
Tuttavia, le prime versioni autonome di BSD (2.9BSD e 3BSD) erano basate su V7 o il suo successore portatile UNIX / 32V , in modo che ha fatto includere la shell Bourne.
(La linea 2BSD si è trasformata in un fork parallelo di BSD per i minicomputer PDP di Digital , mentre le linee 3BSD e 4BSD hanno continuato a sfruttare i più recenti tipi di computer come le workstation Vaxen e Unix . 2.9BSD era essenzialmente la versione PDP di 4.1cBSD; erano contemporanea, e il codice condiviso . PDP non solo scompaiono quando il VAX arrivati, quindi la linea 2BSD è ancora Shambling lungo .)
È sicuro dire che la shell Bourne era ovunque nel mondo Unix entro il 1983. Questa è una buona approssimazione a "per sempre" nel settore informatico. MS-DOS ottenne un filesystem gerarchico quell'anno (awww, che cuuute!) E il primo Macintosh a 24 bit con il suo schermo da 9 "in bianco e nero - non in scala di grigi, letteralmente in bianco e nero - non sarebbe uscito fino all'inizio del prossimo anno.
La shell Thompson era piuttosto primitiva per gli standard odierni. Era solo una shell di comandi interattiva, piuttosto che l'ambiente di programmazione degli script che ci aspettiamo oggi. Aveva cose come pipe e reindirizzamento I / O, che noi consideriamo come parte prototipica di una "shell Unix", in modo da pensare alla shell dei comandi MS-DOS come ottenerli da Unix.
La shell Bourne inoltre sostituito il guscio PWB , che ha aggiunto cose importanti al guscio Thompson come programmabilità ( if
, switch
e while
) ed una prima forma di variabili di ambiente. La shell PWB è ancora meno ricordata della shell Thompson poiché non faceva parte di ogni versione di Unix.
Quando qualcuno non è specifico sulla compatibilità della shell POSIX vs Bourne, c'è un'intera gamma di cose che potrebbero significare.
Ad un estremo, potrebbero usare la shell Bourne del 1979 come base. Un " sh
copione compatibile" in questo senso significherebbe ci si aspetta per funzionare perfettamente sul vero Bourne shell o uno dei suoi successori e cloni: ash
, bash
, ksh
, zsh
, etc.
Qualcuno all'altro estremo assume invece la shell specificata da POSIX come base. In questi giorni prendiamo così tante funzionalità della shell POSIX come "standard" che spesso dimentichiamo che non erano effettivamente presenti nella shell Bourne: aritmetica integrata, controllo dei lavori, cronologia dei comandi, alias, modifica della riga di comando, la $()
forma del comando sostituzione, ecc.
Sebbene la shell Korn abbia radici che risalgono ai primi anni '80, AT&T non lo ha spedito in Unix fino alla System V Release 4 nel 1988. Dato che così tanti Unix commerciali sono basati su SVR4, questo ha aggiunto ksh
praticamente ogni Unix commerciale pertinente dal fine degli anni '80 in poi.
(Alcuni strani aromi Unix basati su SVR3 e precedenti si aggrapparono a pezzi di mercato dopo l'uscita di SVR4, ma furono i primi contro il muro quando venne la rivoluzione .)
Il 1988 è anche l'anno in cui esce il primo standard POSIX , con la sua "POSIX shell" basata su shell Korn. Più tardi, nel 1993, uscì una versione migliorata della shell Korn. Dal momento che POSIX ha efficacemente inchiodato l'originale, ksh
biforcuto in due versioni principali: ksh88
e ksh93
, dal nome degli anni coinvolti nella loro divisione.
ksh88
non è completamente compatibile con POSIX, anche se le differenze sono piccole, quindi alcune versioni della ksh88
shell sono state patchate per essere compatibili con POSIX. (Questo da un'interessante intervista su Slashdot con il Dr. David G. Korn . Sì, il ragazzo che ha scritto la shell.)
ksh93
è un superset completamente compatibile della shell POSIX . Lo sviluppo su ksh93
è stato sporadico da quando il repository di fonti primarie si è spostato da AT&T a GitHub con l'ultima versione di circa 3 anni mentre scrivo, ksh93v. (Il nome di base del progetto rimane ksh93
con i suffissi aggiunti per indicare le versioni di rilascio oltre il 1993.)
I sistemi che includono una shell Korn come cosa separata dalla shell POSIX di solito la rendono disponibile come /bin/ksh
, sebbene a volte si nasconda altrove.
Quando parliamo ksh
della shell Korn per nome, stiamo parlando di ksh93
funzionalità che la distinguono dai suoi sottoinsiemi di shell Bourne e POSIX compatibili con le versioni precedenti. Raramente ti imbatti in puro ksh88
oggi.
AT&T ha mantenuto il codice sorgente della shell Korn proprietario fino a marzo 2000 . A quel punto, l'associazione di Linux con GNU Bash era molto forte. Bash e ksh93
ciascuno presentano vantaggi rispetto all'altro , ma a questo punto l'inerzia mantiene Linux strettamente associato a Bash.
Per quanto riguarda il motivo per cui i primi venditori di Linux più comunemente scelgono GNU Bash pdksh
, che era disponibile al momento in cui Linux stava per iniziare, immagino che sia perché gran parte del resto della userland proveniva anche dal progetto GNU . Bash è anche un po 'più avanzato di pdksh
, poiché gli sviluppatori di Bash non si limitano a copiare le funzionalità della shell Korn.
Il lavoro si è pdksh
interrotto circa quando AT&T ha rilasciato il codice sorgente sulla vera shell Korn. Ci sono due forcelle principali che ancora mantenute, tuttavia: l'OpenBSD pdksh
e MirBSD Korn Shell,mksh
.
Trovo interessante che mksh
sia l'unica implementazione della shell Korn attualmente impacchettata per Cygwin.
GNU Bash va oltre POSIX in molti modi, ma puoi chiedergli di funzionare in una modalità POSIX più pura .
csh
/ tcsh
era di solito la shell interattiva predefinita su Unix BSD all'inizio degli anni '90.
Essendo una variante BSD , le prime versioni di Mac OS X erano così, attraverso Mac OS X 10.2 "Jaguar" . OS X ha cambiato la shell predefinita da tcsh
Bash in OS X 10.3 "Panther" . Questa modifica non ha influito sui sistemi aggiornati da 10.2 o precedenti. Gli utenti esistenti su quei sistemi convertiti hanno mantenuto la tcsh
shell.
FreeBSD afferma di usare ancora tcsh
come shell predefinita , ma sulla VM di FreeBSD 10 che ho qui, la shell predefinita sembra essere una delle varianti di shell Almquist compatibili con POSIX . Questo vale anche su NetBSD.
pdksh
Invece OpenBSD usa un fork di come shell predefinita.
La maggiore popolarità di Linux e OS X fa sì che alcune persone desiderino che anche FreeBSD passi a Bash, ma non lo faranno presto per ragioni filosofiche . È facile cambiarlo , se questo ti dà fastidio.
Al giorno d'oggi è raro trovare un sistema con una shell Bourne veramente vanigliata /bin/sh
. Devi fare di tutto per trovare qualcosa di sufficientemente vicino per test di compatibilità.
Sono a conoscenza di un solo modo per eseguire una vera shell Bourne vintage del 1979 su un computer moderno: utilizzare le immagini del disco Ancient Unix V7 con il simulatore SIMH PDP-11 del Computer History Simulation Project . SIMH funziona praticamente su tutti i computer moderni , non solo su Unix. SIMH funziona anche su Android e iOS .
Con OpenSolaris , Sun ha acquistato per la prima volta la versione SVR4 della shell Bourne. Prima di ciò, il codice sorgente per le versioni post-V7 della shell Bourne era disponibile solo per quelli con una licenza di codice sorgente Unix.
Tale codice è ora disponibile separatamente dal resto del defunto progetto OpenSolaris da un paio di fonti diverse.
La fonte più diretta è il progetto della shell Heirloom Bourne . Questo è diventato disponibile poco dopo l'uscita originale di OpenSolaris del 2005. Nei mesi successivi sono stati eseguiti alcuni lavori di portabilità e correzione dei bug, ma poi lo sviluppo del progetto si è interrotto.
Jörg Schilling ha svolto un lavoro migliore nel mantenere una versione di questo codice come osh
nel suo pacchetto Schily Tools . Vedi sopra per ulteriori informazioni al riguardo.
Tenere presente che queste shell derivate dalla versione del codice sorgente del 2005 contengono supporto per set di caratteri multi-byte , controllo dei processi , funzioni della shell e altre funzionalità non presenti nella shell Bourne originale del 1979.
Un modo per capire se ci si trova su una shell Bourne originale è vedere se supporta una funzionalità non documentata aggiunta per facilitare la transizione dalla shell Thompson: ^
come alias per |
. Vale a dire, un comando simile ls ^ more
darà un errore su una shell di tipo Korn o POSIX, ma si comporterà come ls | more
su una vera shell Bourne.
Occasionalmente incontri un fish
, scsh
o rc/es
aderente, ma sono anche più rari dei fan della shell C.
La rc
famiglia di shell non è comunemente usata sui sistemi Unix / Linux, ma la famiglia è storicamente importante, ed è così che ha guadagnato un posto nel diagramma sopra. rc
è la shell standard del Plan 9 del sistema operativo Bell Labs , una sorta di successore della decima edizione di Unix , creata nell'ambito della continua ricerca di Bell Labs nella progettazione del sistema operativo. È incompatibile con la shell Bourne e C a livello di programmazione; probabilmente c'è una lezione lì dentro.
La variante più attiva di rc
sembra essere quella mantenuta da Toby Goodwin , che si basa sul rc
clone Unix di Byron Rakitzis.
sh
). Per una shell diversa, indica se quella shell può eseguire o meno gli script della shell Bourne.