La breve risposta a "perché la sh shell originale non è presente in sh
" è che non c'è sh originale.
Bene, ok, c'è: è la shell Thompson . La versione 1 aveva alcune delle funzionalità che conosciamo oggi, in particolare il reindirizzamento e le pipe (leggi il testo di Dennis Ritchie su la storia di Unix in anticipo ). Versioni successive ha aggiunto funzionalità come l'esecuzione in background con &
, globbing (implementato con un programma esterno ) e alcune forme di quoting, ma non aveva variabili o strutture di controllo annidate. Le condizioni e i loop venivano forniti tramite programmi esterni if
(che richiedeva una condizione e un comando come argomenti) e < a href="https://etsh.io/man/goto.1.txt"> goto
(che ha funzionato cambiando la posizione del file del suo genitore nel file di script).
Nel 1979, in Unix V7 , la shell di Thompson fu sostituita come /bin/sh
dal Bourne shell . La prima versione aveva già molte delle funzionalità presenti in dash oggi e le versioni successive introdotte molti altri . Alcuni anni dopo, la shell Korn è entrata in scena, con un set di funzionalità in crescita; molte varianti Unix l'hanno installato sotto il nome ksh
.
Nel 1992, POSIX ha codificato un set minimo di sh
di funzionalità sostanzialmente Bourne più alcune cose. Qualsiasi sistema che si chiamava "Unix" doveva implementare almeno queste funzionalità. I sistemi Unix commerciali usavano solitamente ksh come POSIX sh, ma alcuni (es. OSF / 1 ) avevano i loro proprio.
Né la shell Bourne né la shell Korn erano open source fino a poco tempo fa, quindi quando il mondo Linux ha iniziato a formarsi a metà degli anni '90, non erano disponibili. /bin/sh
doveva essere qualcos'altro. La maggior parte delle distribuzioni Linux è stata utilizzata per bash , una shell di Progetto GNU che tendeva ad essere tra Bourne e Korn in termini di funzionalità di scripting, e molto meglio di entrambi per l'uso interattivo). L'unica alternativa valida era pdksh ("public domain Korn shell"), una versione gratuita (ora fuori produzione, ma vivibile come mksh , che è sviluppato attivamente ), ma non ricordo una distribuzione Linux che usa pdksh come /bin/sh
, non lo so perché, immagino perché le distribuzioni Linux erano sempre distribuzioni GNU / Linux, fondamentalmente distribuendo versioni GNU di qualsiasi strumento per il quale esisteva una versione GNU.
C'erano anche diverse implementazioni open source di sh
chiamate "ash", in particolare la shell di Almquist , ma erano molto incompleti, privi di alcune caratteristiche POSIX che le persone volevano usare. Un programmatore che era un manutentore Debian, Herbert Xu , ha esteso la cenere per renderlo conforme a POSIX. Alla fine la sua versione è stata rinominata in dash e c'è stato un po 'di push per renderlo /bin/sh
in Debian invece che bash. Ubuntu ha iniziato prima che Debian iniziasse a trattare sistematicamente i bashismi (l'uso della funzionalità specifica di bash in% script% di script) come bug . Entrambi sono passati in un secondo momento ( Ubuntu 6.10 , solo per Debian nel 2009 ( era un obiettivo per lenny ma l'interruttore è stato eseguito solo dopo il rilascio di lenny, ovvero in squeeze)).
Un importante motivo per utilizzare dash come anziché bash come #!/bin/sh
è che è significativamente più veloce. Questo è stato particolarmente importante per Ubuntu, che ha cercato di mantenere i tempi di avvio brevi dall'inizio. Dash tende anche ad usare meno memoria di bash, il che è piuttosto importante per gli script wrapper che restano intorno solo per fare un po 'di pulizia quando il programma sottostante si chiude. Un altro vantaggio di dash è che si basa solo su libc (la libreria di base del sistema) mentre bash si basa anche sulle librerie di supporto del terminale (non può iniziare senza di esse, anche per eseguire uno script); questo significa che il trattino ha una migliore possibilità di continuare a lavorare su un sistema guasto.
Ad un certo punto del 21 ° secolo, la shell di Korn divenne open source e apparvero versioni open source della shell Bourne (vecchie versioni, perché lo sviluppo era cessato anni prima). Ma dash e bash erano troppo saldamente radicati nel mondo Linux per farli accettare, specialmente la shell Bourne, dal momento che il suo valore oggi è solo storico. Dash ha spostato bash perché ha avuto chiari benefici, ma nessuno degli altri contendenti ha un vantaggio decisivo come /bin/sh
.